Литературное программирование, часть 1
Nov. 17th, 2009 10:05 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Кнут придумал литературное программирование в начале 1980-х годов, во время работы над TeX-ом. Надо сказать, что первую версию TeX-а он написал и отладил на бумаге, а ввёл в компьютер лишь спустя несколько месяцев.
Понятно, что для успеха такой разработки код должно быть легко читать. Вообще читаемость кода, по мнению многих опытных разработчиков - это главное, что сейчас требуется от программистов.
Кнут предложил довести требование читаемости кода до предела и превратить написание программы в написание книги об этой программе. При этом код и документация не разделяются, они описывают решение проблемы формально и неформально. Естественно, что логика изложения может отличаться от последовательности команд. Кроме того, текст должен быть представлен в удобном для читателя виде. Поэтому нужны специальные инструменты, которые позволяют смешивать разметку текста и код.
Кнут, вполне естественно, предложил для текста TeX. Кроме того, в тот момент он использовал язык программирования Pascal, строгость которого усугубляется требованием однопроходной компиляции. Из-за этого порядок определения функций, типов и переменных строго фиксирован, что противоречит требованию понятности изложения. Так что Дональду Кнуту пришлось написать свою систему WEB, которая устроена примерно так. Программа состоит из кусочков (chunks)документации, чередующихся с кусочками кода. В кусочках кода можно ссылаться на другие кусочки, причем ссылки могут идти и вперед, и назад, а на один кусочек может быть несколько ссылок. Получается своего рода сеть, отсюда и название, которое потом использовали для похожей структуры документов в интернет.
Чтобы такую программу можно было использовать, есть две утилиты - tangle, которая вытаскивает кусочки кода, подставляет их на место ссылок и формирует программу, которую можно скомпилировать, и weave , которая форматирует кусочки кода командами TeX и создает документ TeX, который можно распечатать.
TeX и написан таким образом, а человеко-читаемая версия вышла в виде книги "TeX: The program".
Кстати, чтобы получить эту книгу в электронном виде, достаточно скачать исходный код TeX и выполнить следующие команды:
weave tex.web
tex tex.tex
xdvi tex.dvi
или
pdftex tex.tex
xpdf tex.pdf
Потом Кнут перешёл на язык C (который он хвалил в своём интервью, см. предыдущий пост ) и написал CWEB. Возникли и другие инструменты, например, noweb, nuweb, rambutan и другие.
Литературное программирование пока не достигло большой популярности, хотя многие опытные программисты и считают его хорошей идеей. Причина этого в том, что немногие люди умеют и любят писать.
Сам Дональд Кнут в своем интервью в книге описал ситуацию следующим образом, сославшись на Джона Бентли:
"[Т]олько два процента людей могут быть программистами. И только два процента могут быть хорошими писателями. А Кнут хочет чтобы все сочетали эти качества."
Я не думаю, что количество программистов в мире когда-нибудь превысит два процента - я имею в виду программистов, которые действительно способны находить общий язык с машиной от рождения. Однако теперь люди ведут блоги. Поэтому я заметил, что в среднем способность выражать свои мысли сильно растет, поэтому второй аргумент уже не имеет такого значения.
То есть ситуация улучшается благодаря всеобщему увлечению блогами. Программисты начали писать про программирование и иногда получается очень интересно, например у Джоэла Спольски (Joel on software) или у Стива Йегги (Steve Yeggae и тут). Так что литератуное программирование, возможно, ещё достигнет популярности.
Литературные программы, ориентированные на то, что их будут читать люди, хорошо подходят как для сопровождения в течении длительного времени, так и для совместной работы и обучения. Мне кажется, что литературное программирование в этом смыкается с OpenSource-движением. Для совместной работы над кодом существует масса сервисов, начиная от систем управления версиями (и социальных сайтов типа github на их основе) и заканчивая различными pastebin-ами (paste.lisp.org, pastebin.org и т.д.).
Поэтому мне было приятно обнаружить сайт, посвященный совместной работе над литературной реализацией различных алгоритмов на разных языках. Мне кажется, что этот сайт literateprograms.org может быть хорошим подспорьем при изучении новых языков программирования.
В следующем посте этой серии я расскажу о некоторых инструментах для литературного программирования, их достоинствах и недостатках и покажу, какие получаются красивые программы.
no subject
Date: 2009-12-19 09:32 am (UTC)no subject
Date: 2009-12-19 05:41 pm (UTC)Надеюсь, что через несколько дней.