План содержания

Текст этой страницы сейчас безнадёжно устарел. Конечно, радикальная смена формата создаваемой книги — замена одной большой книги четырёхтомником, два тома которого к настоящему моменту уже вышли — не могла не сказаться на общей концепции содержания. Какими получились в итоге первые четыре части из исходно планировавшихся семи, вы можете посмотреть сами — оба вышедших тома доступны здесь на сайте в виде PDF-файлов. Что планируется к включению в будущие тома, можно узнать на новой странице, посвящённой планируемому развитию проекта.

update: Книга в общих чертах завершена, так что изложенные здесь планы теперь представляют разве что исторический интерес. С оглавлением получившейся рукописи (заметим, очень сильно отличающимся от того, что написано здесь) можно ознакомиться в новости о завершении рукописи, там оно прилагается отдельным файлом.


Некоторые главы будущей книги будут сформированы из уже написанных текстов после их глубокой переработки, но многое предстоит написать с нуля. Оглавление будущей книги мыслится примерно таким:

  • Часть первая: предварительные сведения
    • Что такое компьютер

      Имея дело с многообразием компьютерных устройств, окружающих нас сегодня, мы забываем, что исходная функция компьютера — считать; большинство из нас не помнит, когда в последний раз использовали компьютер для вычислений. Как так получилось?

    • Как правильно использовать компьютер

      Добро пожаловать в мир Unix!

    • Программы и данные
    • Немного теории, или что такое алгоритм

      Каждый первый автор учебника почему-то считает своим долгом дать определение алгоритма — не пояснение, о чём идёт речь, не рассказ о предмете, а именно определение, короткую фразу вида «алгоритм — это то-то и то-то». Определение всенепременнейшим образом выделяется крупным жирным шрифтом, обводится рамочкой, снабжается какой-нибудь пиктограммой с восклицательным знаком — словом, делается всё, чтобы убедить как учеников, так и их учителей, что сие подлежит заучиванию наизусть. Собственно, только на это такие определения и годятся: зазубрить, так и не поняв ни слова. На самом же деле определения алгоритма не существует и, более того, существовать не может...

    • Ещё немного математики
      • Основы комбинаторики
      • Множество и его мощность
      • Системы счисления
  • Часть вторая: язык Паскаль и первые шаги
    • Что такое программа, язык программирования, компиляторы и интерпретаторы
    • Как выглядит программа на Паскале и как её запустить; понятие оператора на примере writeln
    • Переменные, значения, типы, выражения и оператор присваивания
    • Логические выражения и логические переменные; оператор ветвления
    • Составной оператор
    • Цикл: что это такое и зачем; оператор цикла с предусловием
    • Структурные отступы и комментарии
    • Блок-схемы. Принципы структурного программирования
    • Типы char и string; обработка текстов
    • Двоичное и текстовое представление чисел; перевод числа в текстовое представление и обратно
    • Параметры командной строки
    • Массивы; тип массив; строка как частный случай массива
    • Задачи поиска максимума и минимума, простейшие алгоритмы сортировки
    • Подпрограммы; процедуры и функции, локальные описания, глобальные описания, описания для локального использования в главной программе; правильный выбор порядка описаний в тексте программы
    • Параметры-значения и параметры-переменные
    • Перечислимый тип, тип-диапазон, понятие порядкового типа, pred и succ
    • Индексирование массивов по произвольным порядковым типам
    • Тип запись; массивы записей
    • Операторы арифметического цикла, цикла с постусловием и выбора
    • Операторы break и continue, оператор goto, операторы exit и halt
    • Модуль crt и его основные возможности
    • Как определить размер окна терминала с помощью GoToXY, WhereX и WhereY
    • Функции KeyPressed и ReadKey; расширенные коды управляющих клавиш. Как писать динамические игры в текстовом режиме
    • Общее понятие потока ввода-вывода и файла; текстовые файлы
    • Ситуация "конец файла" и её обработка, в том числе на стандартном вводе
    • Ошибки ввода-вывода и их обработка; посимвольный ввод любых текстовых данных с целью выдачи подробной диагностики пользовательских ошибок
    • Структурированные ("типизированные") файлы, произвольный доступ к записям
    • Блочные файлы; организация файла с заголовком и записями
    • Переменная и её адрес; тип указатель, операции разыменования и взятия адреса, операторы new и dispose
    • Односвязные списки и основные приёмы работы с ними
    • Модификация списка во время его просмотра; указатель на указатель
    • Понятие рекурсии; рекурсия на примере сопоставления с образцом, рекурсия на примере работы с односвязным списком
    • Двоичное дерево поиска и приёмы работы с ним
    • Двусвязные списки
    • Хэш-таблицы
    • Основы грамотного оформления программного кода: ещё о структурных отступах, выбор имён, выделение поздадач
    • Дополнительный материал: методы сортировки массивов и списков, поддержание списка в отсортированном состоянии, слияние отсортированных потоков
    • Дополнительный материал: сбалансированные деревья
    • Дополнительный материал: различные подходы к представлению символов, не вошедших в ASCII-таблицу, однобайтовые кодировки, реестр Unicode, кодировка utf-8
    • Дополнительный материал: многомодульные программы на Паскале, ключевые слова unit, interface, implementation; понятие библиотеки. Правила разбиения программы на модули и подсистемы.
  • Часть третья: архитектура ЭВМ и язык ассемблера

    В основу этой части ляжет материал выпущенной ранее книги Программирование на языке ассемблера NASM для ОС Unix, подвергнутый существенной переработке. Следует отметить, что начальное понимание роли операционной системы возникнет именно здесь.

  • Часть четвёртая: язык Си
    • История создания языка Си; язык Си как заменитель языка ассемблера
    • Примеры программ на языке Си
    • Система типов языка Си
    • Операции языка Си; арифметические выражения
    • Операторы языка Си
    • Указатели и массивы. Строки
    • Функции в языке Си; эмуляция параметров-переменных через передачу адреса
    • Ввод-вывод при работе со стандартными потоками ввода-вывода. Почему за использование gets и scanf("%s",...) увольняют с работы
    • Тип enum
    • Высокоуровневый ввод-вывод при работе с файлами
    • Работа с динамической памятью; организация динамических массивов
    • Параметры командной строки
    • Тип struct и односвязные списки
    • Примеры организации двусвязных списков, двоичных деревьев, хеш-таблиц и работы с ними
    • Модификатор const
    • Многомерные массивы и тип "указатель на массив". Тип "указатель на функцию". Правила чтения сложных деклараций. Директива typedef
    • Тип union. Анонимные структуры и объединения, вариантные структуры
    • Макропроцессор языка Си; директивы условной компиляции; определение макросимволов в командной строке компилятора
    • Организация раздельной трансляции в языке Си; ключевые слова static и extern; заголовочные файлы; защита от повторного включения
    • Локальные переменные класса static
    • Автоматизированная сборка и автоматическое отслеживание зависимостей
    • Интерфейс к операционной системе, обёртки системных вызовов; низкоуровневый ввод-вывод
    • Дополнительный материал: вариадические функции
    • Дополнительный материал: управление режимом терминала, функции из termios.h
    • Дополнительный материал: Библиотека GNU Readline
    • Дополнительный материал: Основные возможности библиотеки ncurses
    • Дополнительный материал: как написать программу на Си без использования стандартной библиотеки, с написанными на языке ассемблера точкой входа и обёртками системных вызовов
  • Часть пятая: взаимодействие с операционной системой

    В основу этой части ляжет материал выпущенной в 2006 г. книги Введение в операционные системы, точнее, её части до гл.26 включительно; в итоговом тексте, впрочем, останется довольно немного от исходного материала этой книги, поскольку за прошедшие девять лет моё понимание того, как этот материал должен излагаться, существенно поменялось.

    Хотелось бы отметить, что, в числе прочего, при изложении работы с сокетами на основе вызова select здесь даётся понятие событийно-ориентированного построения приложения.

  • Часть шестая: разделяемые данные и многопоточное программирование

    В основу этой части лягут главы 27, 28 и 29 книги Введение в операционные системы; будет особо подчёркнуто, что с тредами лучше не работать, даже зная, как это делается — иначе говоря, надо знать, как работать с тредами, хотя бы для того, чтобы осознанно принять решение об отказе от их использования. В то же время любому квалифицированному программисту необходимо понимать, зачем нужны мьютексы и семафоры, откуда возникает потребность во взаимоисключении, что такое критическая секция и т.п., в противном случае, к примеру, читая описание архитектуры ядра Linux или FreeBSD, человек просто не поймёт, о чём идёт речь.

  • Часть седьмая: объектно-ориентированное программирование и язык Си++

    В этой части будет рассказано ядро языка Си++ (без использования каких-либо частей его стандартной библиотеки); этот материал, по-видимому, будет с незначительными изменениями заимствован из книги Введение в язык Си++.

  • Часть восьмая (дополнительная): построение графических пользовательских интерфейсов; библиотека Qt
  • Часть девятая (дополнительная): парадигмы программирования. Языки Лисп и Пролог

Приведённый план ни в коей мере не является окончательным; итоговая книга может содержать параграфы, которых здесь нет, и не содержать что-то из того, что здесь заявлено (в особенности это касается материала, помеченного как дополнительный). Настоящий план показан исключительно для создания общего впечатления о задуманном.

[<<< НА СТРАНИЦУ ПРОЕКТА]