Русская Википедия:Грамотное программирование
Шаблон:СтильШаблон:Переработать Грамотное программирование (ГП; Шаблон:Lang-en) — концепция, методология программирования и документирования, в которой программа состоит из прозы на естественном языке вперемешку с макроподстановками и кодом на языках программирования[1]. Термин и саму концепцию предложил Дональд Кнут в 1981 году при разработке системы компьютерной вёрстки Шаблон:TeX.
Грамотное программирование подобно объяснениям на лекциях по программированию, использующим фразы на «псевдокоде» на естественном языке. Они вносят ясность в сложный код и скрывают под одной фразой множество других вложенных абстракций и программного кода, на формальном языке программирования.
ГП в некотором смысле есть «программирование на псевдокоде» произвольными фразами, которые затем раскрываются как макросы с помощью утилиты из исходного файла, который включает в себя одновременно документированные текстовые объяснения концепций, сам код и псевдокод.
Сущность подхода
- ГП есть цельный мета подход к написанию программ, применимый на мета уровне к любой (процедурной, функциональной, декларативной, объектно-ориентированной) программе на любом языке программирования;
- ГП есть система макросов, создаваемая из фраз на человеческом языке, которые становятся мета языком над конкретным языком программирования. Пользование этими фразами подобно объяснению алгоритмов на «псевдокоде», но в случае ГП они становятся точными «новыми операторами» метаязыка;
- Программа и документация более не пишутся как код на языке программирования с примечаниями. Само конструирование программы идёт в порядке, определяемом логикой мысли (или объяснений), где макросы псевдокода играют роль абстракций;
- Технически ГП осуществляется с помощью утилиты, которая одной командой запускает препроцессор, раскрывает все макросы и «спутывает», «запутывает» («tangle») логическое изложение в код на языке программирования, который потом можно откомпилировать или интерпретировать как обычно. Другая команда «сплетает» («weave») из этого общего для программы и объяснений файла отформатированную документацию (для печати, веба и т. д.).
Другими словами, программа строится не как восходящая или нисходящая иерархия, а как «взаимозависимая сеть концепций» (отсюда название первой системы ГП — «Web») и создается как «поток мысли», проходящий по этой сети в связном, логичном виде, что внешне делает форму описания похожей на литературное эссе. Порядок изложения оказывается независим от требований транслятора языка.
Шаблон:Начало цитаты Давайте изменим традиционные приоритеты в создании программ: вместо представления о нашей задаче как о создании инструкций «Что делать?» для компьютера сконцентрируемся на объяснении другим людям описаний нашего видения того, что под управлением программы должен делать компьютер. Шаблон:Конец цитаты
Принятие
Система ГП, которую Кнут предлагал как альтернативу «структурному программированию» 1970-х годов, несмотря на благоприятные отзывы, не получила широкого распространения из-за отсутствия инструментальной поддержки и их интеграцииШаблон:Sfn.
Другой проблемой явилась ориентация ГП на пакетную обработку, тогда как системы программирования всё больше стали ориентироваться на средства с WYSIWYGШаблон:Sfn.
Кроме того, распространению ГП помешали ложные представления о том, что «грамотные программы» должны быть монолитными и что ГП — противоположность гипертекстаШаблон:Sfn.
Многие полагают, что ГП — лишь система документирования или система форматирования обычных комментариев. На самом деле, программа практически без комментариев может быть написана с применением подхода ГП, равно как и многословные примечания сами по себе не создают ГП-подхода.
Самое частое непонимание относится к роли системы макросов, позволяющей строить произвольные системы абстракций над абстракциями и к изменению порядка следования кусков от машинно-ориентированного к тому, который требует мышление. Так, абсолютно неверно считать ГП-программированием использование систем документирования интерфейсов вроде JavaDoc, doxygen, DOC++, autoduck, POD.
Ещё одним заблуждением считается, что Д. Е. Кнут хотел зафиксировать подход «сверху вниз» в разработке программных систем. На самом деле он предлагает совмещать подходы «сверху вниз» и «снизу вверх», как это следует из цитаты, приведённой в книге TeX:The program: «Шаблон:Lang-en2»
Существующие инструменты
- WEB — система программирования для языка Паскаль
- Шаблон:Нп4 — версия WEB, разработанная для документирования С, C++ и Java
- Шаблон:Нп4 — система программирования для языка Фортран
- pyWeb — система, позволяющая создавать программы на любом языке программирования и описывать их с помощью произвольного языка разметки, например, HTML, reStructured Text или Шаблон:LaTeX
- Rambutan — система программирования для языка Java
- Шаблон:Нп4
- Шаблон:Нп4
- CLiP, cnoweb
- simplelp (http://gitorious.org/simplelpШаблон:Недоступная ссылка)
Примечания
Литература
Ссылки
- отрывок из примера из работы Кнута (пере-размеченного для «noweb» utility)
- «Грамотное программирование» Андрей Зубинский, 22 мая 2002 г (архивировано, 19 июня 2008 г)
- Literate programmingШаблон:Ref-en
- Книга, полностью объясняющая философию Literate programmingШаблон:Ref-en
- Interview with Donald Knuth, Apr 25, 2008 (перевод на русский ())
- ↑ Иногда методологию образно называют «литературным программированием»