- PVSM.RU - https://www.pvsm.ru -
[1]В языке и литературе работает известный принцип начитанности: чем больше человек читает хороших книг, тем больше у него словарный запас, шире кругозор. Развивается понятийный аппарат, сама собой улучшается грамотность без всяких учебников.
Применим ли этот принцип в обучении программированию?
Конечно, изучать исходники классических программ полезно для общего развития. Например, внутренности Linux 0.0.1 [3] демонстрируют пример грамотного системного программирования, а также делают понятнее принципы работы современного ядра Linux. Мы видим, с чего всё начиналось: скромные 8670 строк кода (если не считать пустые), всего 66 системных вызовов, жёсткая оптимизация ядра для архитектуры Intel 386, поддержка исключительно устройств PC/AT и т. д.
Читать этот код (исходники в файле linux-0.01.tar.gz [4]) — удовольствие, сравнимое с чтением Шекспира. Некоторые участки удивительно лаконичны. Скажем, пять строчек для обработки сбоя в ядре (kernel panic):
volatile void panic(const char * s)
{
printk("Kernel panic: %snr",s);
for(;;);
}
Сообщение об ошибке — и система вешается, ничего больше.
Или фрагмент с инициализацией всех подсистем из файла init/main.c, который до сих находится в ядре Linux и инициализирует его. Всё это крайне любопытно и даёт возможность прикоснуться к истории, как будто вы своими руками листаете летописи средневековья. Впрочем, древние летописи хранились в виде свитков/рулонов (англ. scrolls), так что слово «листать» здесь не совсем уместно, скорее свитки «прокручивают» — отсюда же современный жаргонизм «скроллить».
В любом случае, перед нами ценные исторические артефакты и одновременно приятное, а местами забавное чтиво. Например, такой трогательный комментарий от автора в коде ядра:
* For those with more memory than 8 Mb - tough luck. I've
* not got it, why should you :-) The source is here. Change
* it. (Seriously - it shouldn't be too difficult. ...
Молодой Линус Торвальдс (37 лет) читает лекцию о Git в 2007 году (ещё без очков)
Наличие открытых, понятных и хорошо документированных исходников очень важно для потомков. Во-первых, это важно для качественной поддержки кода [5]. Потом это станет важно для истории и для фанатов, которые спустя десятилетия захотят всё-таки запустить эту программу, но без исходников не смогут. Например, в прошлом году в Сеть утекли [6] исходники классической игры Wipeout от Psygnosis, в том числе оригинальной версии для PSX и портированной версии для Windows.


В итоге фанаты за год переписали игру с нуля [7], включая рендерер, физику, управление памятью, звуковые эффекты и всё остальное [8]. Они выпустили современные версии под Windows, Linux, macOS и WASM/WebGL (запускается в браузере [9]).

То есть благодаря утечке и вынужденному открытию исходников легендарный гоночный симулятор получил вторую жизнь. Новые версии Wipeout даже лучше оригинала.
Если сравнивать старые кодовые базы с классической литературой, то нелишне помнить, что до наших дней сохранилось всего 1% античной литературы.

Вполне вероятно, что у существующего программного обеспечения похожая судьба. Через пару веков 99,9% существующего софта исчезнет не то что из активного использования, но даже из архивов. В этом смысле существующим архитекторам ПО можно только посочувствовать: в отличие от настоящих архитекторов, их работа не материальна, не имеет особой важности — и очень скоро исчезнет из реальности без следа.
Любопытно смотреть, как историки и археологи по символам пытаются восстановить древние свитки [2], которые слабо сохранились после извержения Везувия в 79 году н. э.

Сохранившиеся фрагменты греческих папирусов. Слева — обнаружение следов чернил методами машинного обучения, справа — истинное положение дел по ИК-изображению, источник [2]
Точно так же и современные цифровые археологи пытаются скомпилировать старые исходники Linux 0.0.1 с помощью современных компиляторов. Оказалось, что GCC не такой уж обратно совместимый… Адаптировать ядро под современный тулчейн всё-таки удалось с помощью компилятора GCC 4.x [10]. Подготовленные образы [11] нормально работают с современными программами, такими как bash-3.2, coreutils-6.9, dietlibc-0.31 (вместо glibc), bin86-0.16.17, make-3.81, ncurses-2.0.7 и vim-7.1.

Есть мнение [12], что код — не совсем литература, а скорее шифровка, понятная только «посвящённым» после специальной подготовки и погружения в контекст. Мы его не читаем, а декодируем.
Как уже говорилось, начитанность улучшает мыслительные процессы, развивает человека как личность и помогает ему самому писать лучшие тексты, письма, стихи. К сожалению, в программировании система работает немножко не так. Простой начитанности здесь мало.
В этом есть доля смысла. Никто не спорит, что открытый, доступный код с подробной документацией и комментариями — благо для всех. Но вряд ли на таком коде можно в полной мере учиться программированию. Да, можно освоить какие-то необычные приёмы, увидеть что-то забавное. Но для обучения этого недостаточно. Кроме того, кодовые базы стареют. Ну чему можно научиться из ассемблерного кода навигационного компьютера космического Apollo [13]? Всё это уже не применимо на практике, как и многие другие вещи из старых программ. Теперь это просто исторические артефакты, полезные разве что для общего развития. Тем более примеров по-настоящему хорошего кода не так много. А на плохом (обычном) коде не научишься.
С другой стороны, Дональд Кнут пропагандировал концепцию «грамотного программирования» (Literate Programming, LP). Это методология программирования и документирования, в которой программа состоит из прозы на естественном языке вперемешку с макроподстановками и кодом на языках программирования.
Эту концепцию Дональд Кнут сформулировал в 1981 году при разработке языка компьютерной вёрстки TeX. Соответственно, следующие свои программы он реально публиковал в виде книг: например, TeX [14] и METAFONT [15] (в формате PDF). Это реально настоящие книги, литература, которую приятно читать и в бумажном виде. Правда, без картинок, но зато свёрстано лично автором.
Методика LP регулярно используется в науке [16] для подготовки воспроизводимых исследований и обеспечения открытого доступа к данным. Инструменты грамотного программирования сегодня применяются миллионами разработчиков [17], особенно в области data science. Для примера, вот как выглядят сопроводительные материалы к современной научной статье по data science: это преимущественно текст с фрагментами кода и объяснением, а также с иллюстрациями и графиками (результаты применения данного кода):
Всё как завещал учитель (Дональд Кнут).
В чём отличается парадигма грамотного программирования от традиционной разработки, так это в том, что здесь разработка программ ведётся в порядке, требуемом логикой и течением мысли разработчика, а не в порядке выполнения программы или в порядке, навязанном компилятором. То есть первична мысль человека, а не структура машинного кода. В данном случае требуется специальный инструментарий (макросы) для скрытия абстракций и традиционного исходного кода. В итоге программа больше похожа на текст эссе.
В последнем поколении инструменты LP вообще не зависят от языка программирования.
Для чтения в свободное время можно порекомендовать следующие классические «произведения»:
xv6 повторяет структуру и стиль v6, но реализована для современных многоядерных процессоров на базе x86 с использованием ANSI C.
pw = getpwuid(getuid());
if (!pw)
usage("You don't exist. Go away!");
Многие из упомянутых выше программ написаны одним автором в присущем ему стиле, так что действительно читаются как художественная литература. Некоторые в течение десятилетий поддерживались одним мейнтейнером, который вносил 99% всех изменений, как Брам Моленар.
Автор:
ru_vds
Источник [36]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/387607
Ссылки в тексте:
[1] Image: https://habr.com/ru/companies/ruvds/articles/767910/
[2] источник: https://caseyhandmer.wordpress.com/2023/08/05/reading-ancient-scrolls/
[3] внутренности Linux 0.0.1: https://habr.com/ru/articles/754322/
[4] linux-0.01.tar.gz: https://cdn.kernel.org/pub/linux/kernel/Historic/linux-0.01.tar.gz
[5] для качественной поддержки кода: https://addyosmani.com/blog/good-code/
[6] утекли: https://twitter.com/forestillusion/status/1508048268176990209
[7] переписали игру с нуля: https://github.com/phoboslab/wipeout-rewrite
[8] всё остальное: https://phoboslab.org/log/2023/08/rewriting-wipeout
[9] запускается в браузере: http://phoboslab.org/wipegame/
[10] всё-таки удалось с помощью компилятора GCC 4.x: https://web.archive.org/web/20120121065524/http://kerneltrap.org/Linux/Dusting_Off_the_0.01_Kernel
[11] образы: https://web.archive.org/web/20120831005928/http://draconux.free.fr/download/os-dev/linux0.01/Image/
[12] мнение: https://gigamonkeys.com/code-reading/
[13] ассемблерного кода навигационного компьютера космического Apollo: https://github.com/virtualagc/virtualagc
[14] TeX: http://mirrors.ctan.org/info/knuth-pdf/tex/tex.pdf
[15] METAFONT: https://mirror.datacenter.by/pub/mirrors/CTAN/info/knuth-pdf/mf/mf.pdf
[16] регулярно используется в науке: https://www.jstatsoft.org/article/view/v046i03
[17] применяются миллионами разработчиков: https://dl.acm.org/doi/10.1145/3173574.3173748
[18] Unix v6: http://v6.cuzuco.com/
[19] xv6: https://github.com/mit-pdos/xv6-public
[20] Ядро Linux 0.12 с комментариями: http://www.oldlinux.org/download/ECLK-5.0-WithCover.pdf
[21] wolf3d: https://github.com/id-Software/wolf3d
[22] DOOM: https://github.com/id-Software/DOOM
[23] Quake: https://github.com/id-Software/Quake
[24] LCC: https://github.com/drh/lcc
[25] PBRT: https://github.com/mmp/pbrt-v3
[26] книга в открытом доступе: https://pbr-book.org/3ed-2018/contents
[27] «Конструкция компиляторов»: https://people.inf.ethz.ch/wirth/CompilerConstruction/CompilerConstruction1.pdf
[28] SQLite: https://sqlite.org/src/doc/trunk/README.md
[29] vim: https://github.com/vim/vim
[30] умер в августе 2023 г: https://groups.google.com/g/vim_announce/c/tWahca9zkt4?pli=1
[31] MS-DOS: https://github.com/microsoft/MS-DOS
[32] Bitcoin Core: https://github.com/bitcoin/bitcoin
[33] Coreutils: https://www.gnu.org/software/coreutils/
[34] Tiny C Compiler: https://bellard.org/tcc/
[35] Фабриса Беллара: https://bellard.org/
[36] Источник: https://habr.com/ru/companies/ruvds/articles/767910/?utm_source=habrahabr&utm_medium=rss&utm_campaign=767910
Нажмите здесь для печати.