Книги, которые нас выбирают

Для меня было полной неожиданностью то, что моя первая и пока единственная статья Частное мнение о том, как «вкатиться» в IT сразу набрала столько положительных откликов. Спасибо всем, кто столь высокого оценил мой первый опыт.

Я не планировал продолжать эту тему, но сейчас вижу, что кое в чем, статью надо дополнить. Это дополнение не будет повторять или расширять статью очередными мыслями и наблюдениями; все это в ней уже есть и добавить мне нечего. Просто, читая комментарии, я сообразил, что об одной детали я вскользь упомянул, но толком не рассказал. Из‑за чего у части комментаторов возникли сомнения в сегодняшней ценности книг, доступных мне в то время, когда я начинал карьеру программиста. Мне кажется, это не очень справедливо и хотя я, бесспорно, не объективен, но, тем не менее, решил немного об этом поведать.

Я расскажу о тех книгах, что были мне доступны в 1987–1992 гг.: тогда я совмещал работу инженера с программированием. Конечно, я упомяну только те книги, что мне действительно помогли; полный список литературы слишком обширен и перечислять их все — занятие бессмысленное. Разумеется, мой список — это именно мой список; он не претендует на полноту и кто‑то (скорее всего — все) может со мной не согласиться. Так и должно быть.

Практически все книги из списка легко доступны даже сегодня. Итак, вот мой «золотой фонд».

PDP-11

Тут мой безусловный фаворит — книга «PDP-11. Архитектура и программирование» (автор Т.Фрэнк). Никогда больше я не встречал (и, боюсь, уже не встречу) столь ясного, аккуратного и доброжелательного введения в программирование на ассемблере. Книга читалась (и читается) на одном дыхании. Кое‑где (в сложных темах) автор намеренно повторяется, но эти повторения выглядят уместными и полезными. После изучения архитектуры и ассемблера для PDP-11 все остальные архитектуры и их ассемблеры (прежде всего, для процессоров Intel) мне казались недоработанными и ущербными. И это чувство, увы, не пропало. Никого не хочу обидеть, но мне есть с чем сравнивать. Можно списать мою предвзятость на «юношескую любовь», но честное слово — я знаю о чем говорю. Извините, если кого обидел; как говорится — ничего личного.

Следующая книга «Мини‑ЭВМ PDP-11: программирование и организация машины» (автор — М.Сингер). Тоже интересная и полезная книга (особенно хорошо описано программирование ввода/вывода) из которой я почерпнул много сведений.

Наконец, «Мини‑ЭВМ: организация и программирование» (авторы Р.Экхауз и Л.Моррис). Изложение достаточно сжатое, но зато авторы рассмотрели реализацию основных структур данных (очереди, списки, стеки, буферы и т. д.) на ассемблере PDP-11. Кроме того, есть интересная, хотя и заметно более сложная глава о микропрограммировании и совсем небольшая глава с исходником простой операционной системы (в те годы их часто называли «мониторами»), написанной на ассемблере PDP-11.

Теория

Первая книга, которую я хочу упомянуть — «Наука программирования» (автор Д.Грис). Это, фактически, адаптация знаменитой «Дисциплины программирования» (автор Э.Дейкстра). Дейкстра предложил методику доказательства правильности алгоритмов и программ с использованием аппарата математической логики и продемонстрировал эту методику в своей книге на ряде впечатляющих и нетривиальных примеров (например, построение выпуклой оболочки), перемежающихся пространными и крайне интересными рассуждениями. Фактически, Дейкстра попытался сделать больше, чем следует из названия его книги — он попытался создать философию программирования. Почитайте сами и решите — так ли это или я заблуждаюсь.

Книга Гриса на такие высоты не претендует; зато она представляет собой систематический курс построения доказательств правильности алгоритмов и программ. Книга Гриса более техническая, но и более подробная. Любой алгоритм/процедура/функция — рассматривается как теорема, которую необходимо доказать посредством формальных логических выводов. Если такой вывод возможен — теорема (и, следовательно, алгоритм) правильна. В противном случае — увы. Никаких особенных требований к читателю книга не предъявляет: все, что необходимо излагается в ней самой. Книга захватывает, особенно если читателю удается «настроиться на волну» и «попасть в поток». Чтение не самое простое, но вполне доступное. Кроме того, в книге много упражнений как технического, так и творческого характера.

Следующая книга, о которой я хочу упомянуть — это «Математическая логика и автоматическое доказательство теорем» (авторы Ч.Чень и Р.Ли). Книга вышла в серьезной серии «Математическая логика и основания математики», что показывает ее немалый уровень сложности. Вся книга посвящена доказательству теорем методом резолюции (Ж.Эрбран и позже Дж.Робинсон). Теории немало, впрочем, не такой уж страшной. Требования к подготовке читателя тут уже повыше, чем в книге Д.Гриса, но при известном упорстве и усидчивости книга вполне доступна. Практическое значение этой книги я не могу оценить, но для развития навыков математических рассуждений — она очень ценна.

Конечно, нельзя не упомянуть о «нашем все» — «Искусстве программирования» (автор Д.Кнут, кто же еще). Признаюсь, что второй и третий тома я только листал, но не погружался. Математическое введение из первого тома я наскоро просмотрел, а затем приступил к изучению ассемблера компьютера MIX. Вот тут мне было реально тяжело. После СМ-4 (PDP-11) MIX казался настолько неуклюжим, допотопным, избыточным, что мне стоило большого труда преодолеть это препятствие (и то, только потому, что мне было интересно разобраться с интерпретатором MIX, написанном на самом MIX). Зато вторая глава, посвященная структурам данных мне, как говорится, «зашла» и я периодически заглядываю в нее.

Языки программирования

Начну с классики на все времена. Это, прежде всего, «Язык программирования Си» (Б.Керниган и Д.Ритчи). Тут мне комментировать нечего.

Далее, «Систематическое программирование» и, разумеется, «Алгоритмы + структуры данных = программы» (автор обеих книг Н.Вирт) (для второй книги я имею в виду издание 1985 года; последующие были значительно беднее). Ясность слога, изящество программ, широта рассматриваемых тем (включая компилятор простого языка высокого уровня); я, честно говоря, до сих пор в восторге от этих книг. Можно было почитать теорию у Д.Кнута и тут же поискать реализацию у Н.Вирта — очень продуктивно и понятно.

Сразу же упомяну небольшую, но очень изящно написанную книгу «Программирование на языке ПАСКАЛЬ» (автор О.Перминов). После книг самого Н.Вирта это, пожалуй, лучшее изложение языка программирования Pascal из тех, что я встречал.

Теперь — совсем неожиданная книга: «Программирование на языке Пролог» (авторы У.Клоксин и К.Меллиш). Я упоминал в первой статье о том, что в начале 90-х язык Prolog был очень популярен и эта книга служила каноническим его описанием. Причем, описанием подробным, местами — дотошным, с массой примеров и упражнений.

Компиляторы

Да‑да, был такой «грех» — я пробовал писать компиляторы (а кто не пробовал!). Тут выбор книг был небольшой, но отличный. Прежде всего, книга уже упоминавшегося Д.Гриса «Конструирование компиляторов для цифровых вычислительных машин». После небольшой теории следовал ряд глав, посвященных основным частям компиляторов: лексический анализатор, синтаксический анализатор и, конечно, генератор кода. Очень подробно изложение, с большим количеством примеров. Долгое время книга Д.Гриса оставалась единственным столь подробным и ориентированным на практику руководством (знаменитая «книга дракона» была переведена значительно позже, а двухтомник «Теория синтаксического анализа, перевода и компиляции» А.Ахо и Дж.Ульмана был книгой чересчур теоретической, хотя и единственной в своем роде по сию пору).
Другая книга, которую я вспоминаю с благодарностью — «Теоретические основы проектирования компиляторов» (авторы Ф.Льюис, Д.Розенкранц и Р.Стирнз). Теория в книге излагалась весьма неформально, зато в мельчайших деталях рассматривалось построение компилятора примитивного варианта Basic с использованием различных методов, что иллюстрировалось прекрасными рисунками, диаграммами и таблицами. Книга внушала почтение своей толщиной, но была написана ясно и интересно.

И напоследок

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

Вот, кажется, и все. Хороших вам книг, друзья, и — главное — времени на их чтение!

@atues
19.03.2024 17:00 UTC
Первоисточник

Комментарии

@Turbo_Pascal_55
19.03.2024 12:38 UTC
+2

>> После книг самого Н.Вирта это, пожалуй, лучшее изложение языка программирования Pascal из тех, что я встречал.

А как же Фаронов?

@atues
19.03.2024 12:40 UTC
+1

Книги В.Фаронова хороши, но они были посвящены определенной реализации - Turbo Pascal. Поэтому я их и не включал в свой список

@Nikittansk
19.03.2024 14:06 UTC
+1

Спасибо за Ваш труд, у Вас получилась очень интересная статья. Я в первые, читал статью о Книгах с большим интересом?

@victor_1212
19.03.2024 14:30 UTC
+1

Прежде всего, книга уже упоминавшегося Д.Гриса "Конструирование компиляторов для цифровых вычислительных машин".

бинго, много лет назад сдавал по ней аспирантский экзамен, вообще David Gries это человек уровня Вирта и Дейкстры, участвовал в написании одного из первых компиляторов Algol-60 для IBM 7090, около 30 лет преподавал в Cornell University, одно из лучших мест именно по computer science

@sshikov
19.03.2024 17:47 UTC
0

«Теоретические основы проектирования компиляторов» (авторы Ф.Льюис, Д.Розенкранц и Р.Стирнз)

Подпишусь. Аналогичное мнение об этой книге. Я по ней научился и написал LL(1) анализатор. И вообще, понял как в принципе писать компиляторы, и перестал считать эту задачу чем-то невозможным.

@OgrimMolot
20.03.2024 01:12 UTC
0

Спасибо за подборку, почти ничего из упомянутых вами книг не встречал, интересный список.

@Komrus
20.03.2024 13:28 UTC
+1

Вспоминается ещё из студенческой молодости 90х годов "Страуструп: Язык программирования С++"
Причём вспоминается с содроганием.
Как-то с ясностью изложения в ЭТОЙ книге всё было печально. Или излишне академично. Уж не упомню за давностью лет. Но в печали пребывала вся группа :)

@leshabirukov
20.03.2024 15:07 UTC
0

«Математическая логика и автоматическое доказательство теорем» (авторы Ч.Чень и Р.Ли)

Весьма примечательная книга, штудировал (пытался) в аспирантуре, в библиотеке, потом с распечатки позже купил экземпляр у букиниста. Сейчас могу рекомендовать разве что первые главы, где собственно объясняется, как строить логический вывод (*) на теореме Эрбрана. Большая часть книги, - разбор алгоритмов и специальных техник, сейчас совершенно бесполезна: подход с ручной оптимизацией логического вывода себя не оправдал.

*в пропозициональной логике, вывод в алгебре высказываний, каковому учат на курсе дискретки, гораздо проще.

@FrankMorozoff
20.03.2024 15:22 UTC
+1

Где-то в1980-82 году я понял, что однокристальные процессоры в целом съедят разрядные для pdp-11. И недальновидность руководителя диджитал эквипмент это ускорило. А в 1985 я начал с ассемблера i8080, быстро понял, что i8086 наверняка перспективнее. И освоить это нашему коллективу помогли книги Алана Бредли(не помню название) и фирменное руководство программирования на ассемблере Борланд. Последнее - шедевр для понимания (распечатывали книгу и сшивали сами). И это нас обеспечило прогрессом на ближайшие 5 лет. Потом СССР схлопнулся, я забросил, а товарищ сначала перешел на Си-Борланд, потом на Си-майкрософт.

@atues
20.03.2024 15:23 UTC
+2

Присоединяюсь: руководства от Borland были великолепны

@longtolik
21.03.2024 06:30 UTC
+1

«Мини‑ЭВМ PDP-11: программирование и организация машины» М.Сингер - до сих пор на одном из почётных мест на книжной полке. Потом наш НИИЭМ купил документацию в ГПНТБ на RT-11 на английском языке за 800 р. Стопка листов формата А4 была с метр высотой. Почти всё перечитал. Сейчас то же самое есть, по-моему на сайте pdp11.org (или как-то так).
Раз уж речь зашла - по RSX-11 документация была на русском в нескольких мешках (!) за 5000 рублей.
Ассемблер и архитектура PDP-11 - классика, его до сих пор изучают в американском ВУЗе (не помню, каком). Ещё помню коды команд, например, 12737.
Одна только штука чего стоит - когда одной командой можно поменять содержимое ячейки памяти (чтение-модификация-запись). И не надо, как в x86 сначала считывать в регистр, модифицировать, а потом записывать в память разными командами. Да и запись - читаешь слева направо, код команды, операнд источник, операнд приемник. А не так: код, потом почему-то приемник, потом источник в (x86), а в ARM так вообще и так и эдак.

Но, что интересно, потом программировал Palm IIIe, у него - Motorola DragonBall 69328.
Он вообще меня поразил, 32-бита, ассемблер - еще красивее, чем PDP-11 (по крайней мере, тогда мне так показалось).

Еще книга в те годы была "Компьютеры, применение в химии" немецких авторов (книга моя в другом городе). Там были отлично описаны математические алгоритмы решения почти всего с примерами на Basic.

И еще: "Нейроинтеллект: от нейрона к нейрокомпьютеру" авторы Соколов, Е.Н.Вайткявичус, Г.Г. - отлично описано то, что сейчас происходит в нейросетях... Вообще, в те годы было много книг про искусственный интеллект.

@atues
21.03.2024 06:42 UTC
0
@LaptevVV
14.03.2025 14:38 UTC
0

Подписываюсь
Но я б добавил самое первое издание Таненбаума по организации ЭВМ - там тоже описывается PDP-11. И я писал бортовую ось на нашем клоне типа Электроники-60.
Архитектура - просто песня!

@apevzner
30.04.2025 09:33 UTC
0

Э. Дейкстра. Дисциплина программирования.

https://www.labirint.ru/books/847896/

На Озоне вроде есть в продаже (ссылку не даю, на Озоне они быстро протухают). Ну и PDF-ку при некотором старании можно найти и скачать в сети.