D - это язык программирования, цель которого - помочь программистам справиться с непростыми современными проблемами разработки программного обеспечения. Он создает все условия для организации взаимодействия модулей через точные интерфейсы, поддерживает целую федерацию тесно взаимосвязанных парадигм программирования (императивное, объектно-ориентированное, функциональное и метапрограммирование), обеспечивает изоляцию потоков, модульную безопасность типов, предоставляет рациональную модель памяти и многое другое.
Название: Язык программирования D Автор: Александреску А. Издательство: Символ-Плюс Год: 2012 Страниц: 536 Формат: PDF Размер: 13,5 МБ ISBN: 976-5-93286-205-6 Качество: Отличное
Содержание:
Об авторе Предисловие Уолтера Брайта Предисловие Скотта Мейерса Предисловие научных редакторов перевода Введение 1. Знакомство с языком D 1.1. Числа и выражения 1.2. Инструкции 1.3. Основы работы с функциями 1.4. Массивы и ассоциативные массивы 1.4.1. Работаем со словарем 1.4.2. Получение среза массива. Функции с обобщенными типами параметров. Тесты модулей 1.4.3. Подсчет частот. Лямбда-функции 1.5. Основные структуры данных 1.6. Интерфейсы и классы 1.6.1. Больше статистики. Наследование 1.7. Значения против ссылок 1.8. Итоги 2. Основные типы данных. Выражения 2.1. Идентификаторы 2.1.1. Ключевые слова 2.2. Литералы 2.2.1. Логические литералы. 2.2.2. Целые литералы 2.2.3. Литералы с плавающей запятой 2.2.4. Знаковые литералы 2.2.5. Строковые литералы. 2.2.6. Литералы массивов и ассоциативных массивов. 2.2.7. Функциональные литералы 2.3. Операции 2.3.1. L-эначения и r-значения 2.3.2. Неявные преобразования чисел 2.3.3. Типы числовых операций 2.3.4. Первичные выражения 2.3.5. Постфиксные операции 2.3.6. Унарные операции 2.3.7. Возведение в степень 2.3.8. Мультипликативные операции 2.3.9. Аддитивные операции 2.3.10. Сдвиг 2.3.11. Выражения in 2.3.12. Сравнение 2.3.13. Поразрядные ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ и И 2.3.14. Логическое И 2.3.15. Логическое ИЛИ 2.3.16. Тернарная условная операция 2.3.17. Присваивание 2.3.18. Выражения с запятой 2.4. Итоги и справочник 3. Инструкции 3.1. Инструкция-выражение 3.2. Составная инструкция 3.3. Инструкция if 3.4. Инструкция static if 3.5. Инструкция switch 3.6. Инструкция final switch 3.7. Циклы 3.7.1. Инструкция while (цикл с предусловием) 3.7.2. Инструкция do-while (цикл с постусловием) 3.7.3. Инструкция for (цикл со счетчиком) 3.7.4. Инструкция foreach (цикл просмотра) 3.7.5. Цикл просмотра для работы с массивами 3.7.6. Инструкции continue и break 3.8. Инструкция goto (безусловный переход) 3.9. Инструкция with 3.10. Инструкция return 3.11. Обработка исключительных ситуаций 3.12. Инструкция mixin 3.13. Инструкция scope 3.14. Инструкция synchronized 3.15. Конструкция asm 3.16. Итоги и справочник 4. Массивы, ассоциативные массивы и строки 4.1. Динамические массивы 4.1.1. Длина 4.1.2. Проверка границ 4.1.3. Срезы 4.1.4. Копирование 4.1.5. Проверка на равенство 4.1.6. Конкатенация 4.1.7. Поэлементные операции 4.1.8. Сужение 4.1.9. Расширение 4.1.10. Присваивание значения свойству .length 4.2. Массивы фиксированной длины 4.2.1. Длина 4.2.2. Проверка границ 4.2.3. Получение срезов 4.2.4. Копирование и неявные преобразования 4.2.5. Проверка на равенство 4.2.6. Конкатенация 4.2.7. Поэлементные операции 4.3. Многомерные массивы 4.4. Ассоциативные массивы 4.4.1. Длина 4.4.2. Чтение и запись ячеек 4.4.3. Копирование 4.4.4. Проверка на равенство 4.4.5. Удаление элементов 4.4.6. Перебор элементов 4.4.7. Пользовательские типы 4.5. Строки 4.5.1. Кодовые точки 4.5.2. Кодировки 4.5.3. Знаковые типы 4.5.4. Массивы знаков + бонусы = строки 4.6. Опасный собрат массива - указатель 4.7. Итоги и справочник 5. Данные и функции. Функциональный стиль 5.1. Написание и модульное тестирование простой функции 5.2. Соглашения о передаче аргументов и классы памяти 5.2.1. Параметры и возвращаемые значения, переданные по ссылке (с ключевым словом ref) 5.2.2. Входные параметры (с ключевым словом in) 5.2.3. Выходные параметры (с ключевым словом out) 5.2.4. Ленивые аргументы (с ключевым словом lazy) 5.2.5. Статические данные (с ключевым словом static) 5.3. Параметры типов 5.4. Ограничения сигнатуры 5.5. Перегрузка 5.5.1. Отношение частичного порядка на множестве функций 5.5.2. Кроссмодульная перегрузка 5.6. Функции высокого порядка. Функциональные литералы 5.6.1. Функциональные литералы против литералов делегатов 5.7. Вложенные функции 5.8. Замыкания 5.8.1. Так, это работает… Стоп, не должно… Нет, все же работает! 5.9. Не только массивы. Диапазоны. Псевдочлены 5.9.1. Псевдочлены и атрибут @property 5.9.2. Свести - но не к абсурду 5.10. Функции с переменным числом аргументов 5.10.1. Гомогенные функции с переменным числом аргументов 5.10.2. Гетерогенные функции с переменным числом аргументов 5.10.3. Гетерогенные функции с переменным числом аргументов. Альтернативный подход 5.11. Атрибуты функций 5.11.1. Чистые функции 5.11.2. Атрибут nothrow 5.12. Вычисления во время компиляции 6. Классы. Объектно-ориентированный стиль 6.1. Классы 6.2. Имена объектов - это ссылки 6.3. Жизненный цикл объекта 6.3.1. Конструкторы 6.3.2. Делегирование конструкторов 6.3.3. Алгоритм построения объекта 6.3.4. Уничтожение объекта и освобождение памяти 6.3.5. Алгоритм уничтожения объекта 6.3.6. Стратегия освобождения памяти 6.3.7. Статические конструкторы и деструкторы 6.4. Методы и наследование 6.4.1. Терминологический «шведский стол» 6.4.2. Наследование - это порождение подтипа. Статический и динамический типы 6.4.3. Переопределение - только по желанию 6.4.4. Вызов переопределенных методов 6.4.5. Ковариантные возвращаемые типы 6.5. Инкапсуляция на уровне классов с помощью статических членов 6.6. Сдерживание расширяемости с помощью финальных методов 6.6.1. Финальные классы 6.7. Инкапсуляция 6.7.1. private 6.7.2. package 6.7.3. protected 6.7.4. public 6.7.5. export 6.7.6. Сколько инкапсуляции? 6.8. Основа безраздельной власти 6.8.1. string toString () 6.8.2. size_t toHash () 6.8.3. bool opEquals (Object rhs) 6.8.4. int opCrap (Object rhs) 6.8.5. static Object factory (string className) 6.9. Интерфейсы 6.9.1. Идея невиртуальных интерфейсов (NVI) 6.9.2. Защищенные примитивы 6.9.3. Избирательная реализация 6.10. Абстрактные классы 6.11. Вложенные классы 6.11.1. Вложенные классы в функциях 6.11.2. Статические вложенные классы 6.11.3. Анонимные классы 6.12. Множественное наследование 6.13. Множественное порождение подтипов 6.13.1. Переопределение методов в сценариях множественного порождения подтипов 6.14. Параметризированные классы и интерфейсы 6.14.1. И снова гетерогенная трансляция 6.15. Переопределение аллокаторов и деаллокаторов 6.16. Объекты scope 6.17. Итоги 7. Другие пользовательские типы 7.1. Структуры 7.1.1. Семантика копирования 7.1.2. Передача объекта-структуры в функцию 7.1.3. Жизненный цикл объекта-структуры 7.1.4. Статические конструкторы и деструкторы 7.1.5. Методы 7.1.6. Статические внутренние элементы 7.1.7. Спецификаторы доступа 7.1.8. Вложенность структур и классов 7.1.9. Структуры, вложенные в функции 7.1.10. Порождение подтипов в случае структур. Атрибут @disable 7.1.11. Взаимное расположение полей. Выравнивание 7.2. Объединение 7.3. Перечисляемые значения 7.3.1. Перечисляемые типы 7.3.2. Свойства перечисляемых типов 7.4. alias 7.5. Параметриэированные контексты (конструкция template) 7.5.1. Одноименные шаблоны 7.5.2. Параметр шаблона this 7.6. Инъекции кода с помощью конструкции mixin template 7.6.1. Поиск идентификаторов внутри mixin 7.7. Итоги 8. Квалификаторы типа 8.1. Квалификатор immutable 8.1.1. Транзитивность 8.2. Составление типов с помощью immutable 8.3. Неизменяемые параметры и методы 8.4. Неизменяемые конструкторы 8.5. Преобразования с участием immutable 8.6. Квалификатор const 8.7. Взаимодействие между const и immutable 8.8. Распространение квалификатора с параметра на результат 8.9. Итоги 9. Обработка ошибок 9.1. Порождение и обработка исключительных ситуаций 9.2. Типы 9.3. Блоки finally 9.4. Функции, не порождающие исключения (nothrow), и особая природа класса Throwable 9.5. Вторичные исключения 9.6. Раскрутка стека и код, защищенный от исключений 9.7. Неперехваченные исключения 10. Контрактное программирование 10.1. Контракты 10.2. Утверждения 10.3. Предусловия 10.4. Постусловия 10.5. Инварианты 10.6. Пропуск проверок контрактов. Итоговые сборки 10.6.1. enforce - это не (совсем) assert 10.6.2. assert (false) - останов программы 10.7. Контракты - не для очистки входных данных 10.8. Наследование 10.8.1. Наследование и предусловия 10.8.2. Наследование и постусловия 10.8.3. Наследование и инварианты 10.9. Контракты и интерфейсы 11. Расширение масштаба 11.1. Пакеты и модули 11.1.1. Объявления import 11.1.2. Базовые пути поиска модулей 11.1.3. Поиск имен 11.1.4. Объявления public import 11.1.5. Объявления static import 11.1.6. Избирательные включения 11.1.7. Включения с переименованием 11.1.8. Объявление модуля 11.1.9. Резюме модулей 11.2. Безопасность 11.2.1. Определенное и неопределенное поведение 11.3.2. Атрибуты @safe, @trusted и @system 11.3. Конструкторы и деструкторы модулей 11.3.1. Порядок выполнения в рамках модуля 11.3.2. Порядок выполнения при участии нескольких модулей 11.4. Документирующие комментарии 11.5. Взаимодействие с C и C++ 11.5.1. Взаимодействие с классами C++ 11.6. Ключевое слово deprecated 11.7. Объявления версий 11.8. Отладочные объявления 11.9. Стандартная библиотека D 11.10. Встроенный ассемблер 11.10.1. Архитектура х86 11.10.2. Архитектура х86-64 11.10.3. Разделение на версии 11.10.4. Соглашения о вызовах 11.10.5. Рациональность 12. Перегрузка операторов 12.1. Перегрузка операторов в D 12.2. Перегрузка унарных операторов 12.2.1. Объединение определений операторов с помощью выражения mixin 12.2.2. Постфиксный вариант операторов увеличения и уменьшения на единицу 12.2.3. Перегрузка оператора cast 12.2.4. Перегрузка тернарной условной операции и ветвления 12.3. Перегрузка бинарных операторов 12.3.1. Перегрузка операторов в квадрате 12.3.2. Коммутативность 12.4. Перегрузка операторов сравнения 12.5. Перегрузка операторов присваивания 12.6. Перегрузка операторов индексации 12.7. Перегрузка операторов среза 12.8. Оператор $ 12.9. Перегрузка foreach 12.9.1. foreach с примитивами перебора 12.9.2. foreach с внутренним перебором 12.10. Определение перегруженных операторов в классах 12.11. Кое-что из другой оперы: opDispatch 12.11.1. Динамическое диспетчирование с opDispatch 12.12. Итоги и справочник 13. Параллельные вычисления 13.1. Революция в области параллельных вычислений 13.2. Краткая история механизмов разделения данных 13.3. Смотри, мам, никакого разделения (по умолчанию) 13.4. Запускаем поток 13.4.1. Неизменяемое разделение 13.5. Обмен сообщениями между потоками 13.6. Сопоставление по шаблону с помощью receive 13.6.1. Первое совпадение 13.6.2. Соответствие любому сообщению 13.7. Копирование файлов - с выкрутасом 13.8. Останов потока 13.9. Передача нештатных сообщений 13.10. Переполнение почтового ящика 13.11. Квалификатор типа shared 13.11.1. Сюжет усложняется: квалификатор shared транзитивен 13.12. Операции с разделяемыми данными и их применение 13.12.1. Последовательная целостность разделяемых данных 13.13. Синхронизация на основе блокировок через синхронизированные классы 13.14. Типизация полей в синхронизированных классах 13.14.1. Временная защита == нет утечкам 13.14.2. Локальная защита == разделение хвостов 13.14.3. Принудительные идентичные мьютексы 13.14.4. Фильм ужасов: приведение от shared 13.15. Взаимоблокировки и инструкция synchronized 13.16. Кодирование без блокировок с помощью разделяемых классов 13.16.1. Разделяемые классы 13.16.2. Пара структур без блокировок 13.17. Статические конструкторы и потоки 13.18. Итоги Литература Алфавитный указатель