Литературное программирование, часть 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-11-17 08:05 pm (UTC)Мне даже комментировать стыдно :-)
(no subject)
From:(no subject)
From:(no subject)
From:Newlisp
From: (Anonymous) - Date: 2009-11-17 10:22 pm (UTC) - ExpandRe: Newlisp
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:возьмите пример
From: (Anonymous) - Date: 2009-11-22 04:26 pm (UTC) - ExpandДа, пункт 2, отвечает на ваш вопрос ...
From: (Anonymous) - Date: 2009-11-22 04:33 pm (UTC) - ExpandRe: Да, пункт 2, отвечает на ваш вопрос ...
From:ишу документацию потому ..
From: (Anonymous) - Date: 2009-11-22 06:38 pm (UTC) - ExpandBROKEN
From: (Anonymous) - Date: 2009-11-22 06:40 pm (UTC) - ExpandExplanation - 1
From: (Anonymous) - Date: 2009-11-22 06:44 pm (UTC) - ExpandExplanation-2
From: (Anonymous) - Date: 2009-11-22 06:48 pm (UTC) - Expandno subject
Date: 2009-11-17 08:13 pm (UTC)Где попыриться на пример кода? Есть ли веб для SQL?
(no subject)
From:no subject
Date: 2009-11-17 10:10 pm (UTC)0. Вы написали верно. Это не такое малое достижение, учитывая количество непонимания вокруг совершенно конкретной техники программирования. Её смешивают (а) с системой документации и (б) с особенной разговорчивостью в комментариях к коду.
Однако Л.П. (и "сеть" кода) может существовать вообще без комментариев, хотя это было бы субстандартным применением техники.
1. Отсылать людей к оригинальному ВЕБу (или СиВЕБу) пожалуй слишком жестоко.
Де-факто стандарт для повседневного употребления - "noweb" Нормана Рамзи, который
написал его как свой еще более упрощённый вариант упрощенного инструмента nuweb.
И nuweb, и noweb не привязаны к одному языку программирования, а noweb к тому же не провязан жестко и к ТеХу.
noweb написан на скриптовом языке (-ых -ах, есть две версии), и в очень стабильном виде существует уже больше десятка лет.
Есть еще и независимый от ТеХа написанный на Си funnelweb, монолитный самодостаточный инструмент. Его проблема - в уродском выборе разметки, который заставляет отказаться от набивки макро. То ли я разучился писать aliases для моего редактора ;))
Так что отсылайте к noweb'у для первого знакомства
2. Написано все правильно. Однако для понимания нужны примеры.
(а) я в свое время переписал статью в английской википедии и выдержал маленькую войну с идиотами, которые отказывались верить каждому из сделанных мной основополагающих утверждений. В результате я переделал ту статью ( http://en.wikipedia.org/wiki/Literate_programming ) еще раз, сделав её ПОЛНОСТЬЮ из Кнутовских цитат.
Атака и. ослабла, и они нанесли последний, вялый удар, изгнав все цитаты в "ссылки", где их никто никогда не прочитает.
В той статье есть обрывок, недостаточный, примера того, как Л.П. делается. Подробнее в ЖЖ и на русском примеры рассматриваются например здесь:
http://anonym-mouse.livejournal.com/2323.html
(кстати одно из эссе Стива Егге переведено в том же журнале:
http://anonym-mouse.livejournal.com/1294.html )
3. Я может быть все же доведу скрипт Молли до сколько-то пригодного вида. Встроил в него tangler (пока еще не подгрузил версию на github, но добавлю скоро), который вроде бы дает на тестах те же результаты, что и notangle.
Хочу сделать одно расширение: чтобы он мог tangle из НЕСКОЛЬКИХ файлов.
Т.е. вы ведете проект, в какой-то момент разрезаете механически свой Literate Source file на куски, не заботясь о том, чтобы они были самодостаточны. Потом просто дав все куски на командной строке скрипту, который вызывается в роли tangler'а, вы можете получить свой код, где бы он там по кускам не извивался.
Насколько я знаю, никто так почему-то не делал. А это в принципе элементарно.
4. Да, еще вот что. После написания статьи в Википедию я начал было делать русский вариант и сломался.
Можно добавить/заменить текст в русской википедии на ваше объяснение, оно разумно.
Туда же надо дать и кусочек конкретного примера, можно или из ссылки или из второй части вашей заметки.
(no subject)
From:(no subject)
From: (Anonymous) - Date: 2009-11-17 10:31 pm (UTC) - ExpandВпрочем, я посмотрел код альтернатив
From: (Anonymous) - Date: 2009-11-22 04:39 pm (UTC) - Expandno subject
Date: 2009-11-18 07:08 am (UTC)(no subject)
From:no subject
Date: 2009-11-28 07:27 am (UTC)Article {Rnews:Leisch:2002}
Author: Leisch, Friedrich
Title: Sweave, part I: mixing R and LaTeX
Journal: R News
Date: 2002
Volume: 2
Number: 3
Pages: 28--31
month: December
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2002-3.pdf
Article {Rnews:Leisch:2003}
Author: Leisch, Friedrich
Title: Sweave, part II: package vignettes
Journal: R News
Date: 2003
Volume: 3
Number: 2
Pages: 21--24
month: October
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2003-2.pdf
Article {Rnews:Betebenner:2005}
Author: Betebenner, Damian
Title: Using control structures with Sweave
Journal: R News
Date: 2005
Volume: 5
Number: 1
Pages: 40--44
month: May
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2005-1.pdf
Article {Rnews:Kuhn:2006}
Author: Kuhn, Max
Title: Sweave and the open document format -- the odfWeave package
Journal: R News
Date: 2006
Volume: 6
Number: 4
Pages: 2--8
month: October
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2006-4.pdf
(no subject)
From:(no subject)
From: (Anonymous) - Date: 2009-12-19 09:32 am (UTC) - Expand(no subject)
From:Экономьте до 30% на заправке Вашего автомобиля!
Date: 2011-06-20 12:52 pm (UTC)Как экономить 10-30% топлива автомобиля?
Использовать кондиционер для камеры сгорания двигателя!
Вы получаете реальную ЭКОНОМИЮ ТОПЛИВА благодаря более быстрому и эффективному его сгоранию.
Экономия составляет от 7 до 14% бензина или дизельного топлива - гарантировано, а по факту, в среднем 20%. Этот уникальный продукт изготавливается в США, является 100% органическим катализатором топлива, а не обычной химической присадкой, и поэтому абсолютно безопасен для двигателя и человека. Главное что получает водитель - это защита автомобиля от плохого топлива и новое качество езды. Увеличение ресурса двигателя, срока службы катализатора, свечей, форсунок и поршневой системы. Уменьшение вредных выбросов выхлопных газов на 70-90%.
Стоимость продукта на 1 заправку обходится всего ~1-1,2 долл., но сэкономит Вам ~6,5-24 долл. топлива.
Зайдите на презентационный [url=http://economy20.prav.tv][b]сайт[/b][/url] и забронируйте билет на бесплатный Тест-Драйв, чтобы узнать об этом подробнее!
С вопросами обращайтесь сюда - support-eco20(а)ukr.net или в контактные данные на сайте.
ключевые слова
----------------------
автомобили, машины, авто, автомашины, бензин, бережливость бензина, экономия топлива, экономить бензин, экономить топливо, дизель, дизельное топливо, экономить дизель, экономить дизельное топливо, экономить на заправке, экономить быть заправке, сэкономить при заправке, уменьшить выхлоп, уменьшить вредные вещества при выхлопе, уменьшить выхлоп вредных веществ, уменьшить выхлоп CO2, выхлоп CO2, BMW, БМВ, mpg-boost, mpg-caps, ffi, сэкономить для заправке, toyota, nissan, аукционное авто, тойота, нисан ..
Компьютерный портал Беларуси
Date: 2011-10-10 05:25 pm (UTC)