anton_nazarov: (Default)

Обещанного, конечно, три года ждут, но я справился раньше :)


Итак, второй пост про литературное программирование.


В предыдущем посте я описал историю и идеи литературного программирования, сейчас я хочу привести некоторые примеры.
Так как сейчас уже далеко не все пишут на Pascal или C, я не буду описывать системы WEB и CWEB, которые использует сам Дональд Кнут. Я приведу примеры с использованием системы noweb, которая не привязана к какому-то конкретному языку программирования, а может использоваться с практически любым языком.


Литературна программа в системе noweb состоит из следующих частей:



  • кусочков документации, которые начинаются со строки, состоящей из символа @ и продолжаются до следующего кусочка кода, вот так:


    @
    In the next code chunk <<Chunkname>> we compute something using the formula
    \begin{equation}
    y=f(x)
    \end{equation}
    This computation is crucial for the algorithm in the chunk <<OtherChunkName>>


  • кусочков кода.
    Они начинаются со строки, состоящей из названия,
    заключенного в двойные угловые скобки и знака присваивания и продолжаются до следующего кусочка документации:


        <<Chunkname>>=
        <<Chunk with the initialisation>>
        (define (f x)
          (* (sin x) (* x x)))
        (define y (f x))
        <<Debug output>>
        <<Save results to database>>
    


Как кусочки документации, так и кусочки кода могут содержать ссылки на другие кусочки кода. При этом программа notangle, которая собирает из документа компилируемую программу, подставляет на место ссылок соответствующие кусочки кода, а программа noweave просто добавляет гиперссылку в документ.


Вот тут можно посмотреть пример литературной программы на языке Scheme), а здесь и здесь - получающийся код и документацию.
После компиляции LaTeX-ом


    noweb LiterateLie.nw
    latex LiterateLie.tex
    bibtex LiterateLie
    latex LiterateLie.tex

получается очень сипатичный листинг, вполне подходящий для чтения человеком.


В этом файле изложены некоторые понятия теории алгебр Ли и приведены некоторые вычислительные алгоритмы теории представлений. Код написан на scheme), причём используется минимальное подмножество языка, так что программа должна работать на любой реализации scheme) на любой платформе (Windows, Unix, Palm OS, Pocket PC, iPhone, Java, Web browser).


Как видно, литературное программирование позволяет изменить порядок чтения на более естественный и получить удобную для человека документацию.
Кроме того, документация пишется в TeX-е, что позволяет излагать сложные научные концепции и включать математические формулы там, где они нужны.


В следующем посте из этой серии я расскажу об инструментах для литературного программирования, а также о сложностях, которые вызывает использование литературного подхода.

anton_nazarov: (Default)

Кнут придумал литературное программирование в начале 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 может быть хорошим подспорьем при изучении новых языков программирования.

В следующем посте этой серии я расскажу о некоторых инструментах для литературного программирования, их достоинствах и недостатках и покажу, какие получаются красивые программы.

Profile

anton_nazarov: (Default)
anton_nazarov

September 2014

S M T W T F S
 123456
78910111213
14 151617181920
21222324252627
282930    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 21st, 2025 07:08 pm
Powered by Dreamwidth Studios