Оглавление
Об авторе
Предисловие Уолтера Брайта
Предисловие Скотта Мейерса
Предисловие научных редакторов перевода
Введение
Глава 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 opCmp(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. Архитектура x86
11.10.2. Архитектура x86-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. Итоги
Литература
Алфавитный указатель