Литературное программирование, часть 2
Обещанного, конечно, три года ждут, но я справился раньше :)
Итак, второй пост про литературное программирование.
В предыдущем посте я описал историю и идеи литературного программирования, сейчас я хочу привести некоторые примеры.
Так как сейчас уже далеко не все пишут на 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-е, что позволяет излагать сложные научные концепции и включать математические формулы там, где они нужны.
В следующем посте из этой серии я расскажу об инструментах для литературного программирования, а также о сложностях, которые вызывает использование литературного подхода.