Изменения

Перейти к навигации Перейти к поиску
Импорт https://ru.wikipedia.org/w/index.php?title=%D0%93%D1%80%D0%B0%D0%BC%D0%BE%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&oldid=134212796
'''Литературное программирование''', '''Грамотное программирование''' (ГП; {{lang-en|Literate Programming}}) — концепция, [[методология программирования]] и документирования, в которой программа состоит из прозы на естественном языке вперемешку с макроподстановками и кодом на [[Язык программирования|языках программирования]]<ref>Иногда методологию образно называют «литературным программированием»</ref>. Термин и саму концепцию предложил [[Дональд Кнут]] в 1981 году при разработке системы компьютерной вёрстки {{TeX|link=1}}.

Грамотное программирование подобно объяснениям на лекциях по программированию, использующим фразы на «[[Псевдокод (язык описания алгоритмов)|псевдокоде]]» на естественном языке. Они вносят ясность в сложный код и скрывают под одной фразой множество других вложенных абстракций и программного кода, на формальном языке программирования.

ГП в некотором смысле есть «программирование на псевдокоде» произвольными фразами, которые затем раскрываются как макросы с помощью утилиты из исходного файла, который включает в себя одновременно документированные текстовые объяснения концепций, сам код и псевдокод.

== Сущность подхода ==
* ГП есть цельный метаподход к написанию программ, применимый на метауровне к любой ([[Императивное программирование|процедурной]], [[Функциональное программирование|функциональной]], [[Декларативное программирование|декларативной]], [[Объектно-ориентированное программирование|объектно-ориентированной]]) программе на любом языке программирования;
* ГП есть система макросов, создаваемая из фраз на человеческом языке, которые становятся [[метаязык]]ом над конкретным [[Язык программирования|языком программирования]]. Пользование этими фразами подобно объяснению [[алгоритм]]ов на «псевдокоде», но в случае ГП они становятся точными «новыми операторами» метаязыка;
* Программа и документация более не пишутся как код на языке программирования с примечаниями. Само конструирование программы идёт в порядке, определяемом логикой мысли (или объяснений), где макросы псевдокода играют роль абстракций;
* Технически ГП осуществляется с помощью утилиты, которая одной командой запускает препроцессор, раскрывает все макросы и «спутывает», «запутывает» («tangle») логическое изложение в код на языке программирования, который потом можно откомпилировать или интерпретировать как обычно. Другая команда «сплетает» («weave») из этого общего для программы и объяснений файла отформатированную документацию (для печати, веба и т. д.).

Другими словами, программа строится не как восходящая или нисходящая иерархия, а как «взаимозависимая сеть концепций» (отсюда название первой системы ГП — «Web») и создается как «поток мысли», проходящий по этой сети в связном, логичном виде, что внешне делает форму описания похожей на литературное эссе. Порядок изложения оказывается независим от требований транслятора языка.

{{начало цитаты}}
Давайте изменим традиционные приоритеты в создании программ: вместо представления о нашей задаче как о создании инструкций «Что делать?» для компьютера сконцентрируемся на объяснении другим людям описаний нашего видения того, что под управлением программы должен делать компьютер.
{{конец цитаты|источник=[[Дональд Кнут]], http://community.livejournal.com/ru_perl/249441.html}}

== Принятие ==
Система ГП, которую Кнут предлагал как альтернативу «[[Структурное программирование|структурному программированию]]» 1970-х годов, несмотря на благоприятные отзывы, не получила широкого распространения из-за отсутствия инструментальной поддержки и их интеграции{{sfn|Sametinger|1997|loc=18. Literate programming}}.

Другой проблемой явилась ориентация ГП на [[Пакетное задание|пакетную обработку]], тогда как системы программирования всё больше стали ориентироваться на средства с [[WYSIWYG]]{{sfn|Sametinger|1997|loc=18. Literate programming}}.

Кроме того, распространению ГП помешали ложные представления о том, что «грамотные программы» должны быть монолитными и что ГП — противоположность гипертекста{{sfn|Sametinger|1997|loc=18. Literate programming}}.

Многие полагают, что ГП — лишь система документирования или система форматирования обычных комментариев. На самом деле, программа практически без комментариев может быть написана с применением подхода ГП, равно как и многословные примечания сами по себе не создают ГП-подхода.

Самое частое непонимание относится к роли системы макросов, позволяющей строить произвольные системы абстракций над абстракциями и к изменению порядка следования кусков от машинно-ориентированного к тому, который требует мышление. Так, абсолютно неверно считать ГП-программированием использование систем документирования интерфейсов вроде JavaDoc, doxygen, DOC++, autoduck, POD.

Ещё одним заблуждением считается, что Д. Е. Кнут хотел зафиксировать подход «сверху вниз» в разработке программных систем. На самом деле он предлагает совмещать подходы «сверху вниз» и «снизу вверх», как это следует из цитаты, приведённой в книге TeX:The program: «{{lang-en2|But the author suggests that the best way to understand this program
is to follow pretty much the order of TeX’s components as they appear in the
WEB description you are now reading, since the present ordering is
intended '''to combine the advantages of the „bottom up“ and „top down“ approaches '''
to the problem of understanding a somewhat complicated system.}}»

== Существующие инструменты ==
{{список примеров}}
* [[WEB (система программирования)|WEB]] — система программирования для языка [[Паскаль (язык программирования)|Паскаль]]
* {{нп4|CWEB}} — версия WEB, разработанная для документирования [[Си (язык программирования)|С]], [[C++]] и [[Java]]
* {{нп4|FWEB}} — система программирования для языка [[Фортран]]
* [http://sourceforge.net/projects/pywebtool/ pyWeb] — система, позволяющая создавать программы на любом языке программирования и описывать их с помощью произвольного языка разметки, например, [[HTML]], [[reStructuredText|reStructured Text]] или {{LaTeX}}
* Rambutan — система программирования для языка [[Java]]
* {{нп4|Noweb}}
* {{нп4|FunnelWeb}}
* CLiP, cnoweb
* simplelp (http://gitorious.org/simplelp{{Недоступная ссылка|date=Июнь 2018 |bot=InternetArchiveBot }})

== Примечания ==
{{примечания}}

== Литература ==
* {{книга
| автор = Sametinger, J.
| заглавие = Software Engineering with Reusable Components
| издательство = Springer
| год = 1997
| allpages = 272
| isbn = 9783540626954
| ref = Sametinger
}}
* {{книга
| автор = Robinson, J.A.
| часть = 2.4 Software as literature
| заглавие = Software Design for Engineers and Scientists
| издательство = Elsevier Science
| год = 2004
| allpages = 414
| isbn = 9780080474403
| ref = Robinson
}}

== Ссылки ==
* [http://anonym-mouse.livejournal.com/2323.html отрывок из примера из работы Кнута (пере-размеченного для «noweb» utility)]
* [http://itc.ua/articles/_gramotnoe_programmirovanie_9950/ «Грамотное программирование» Андрей Зубинский, 22 мая 2002 г] ([https://web.archive.org/web/20080619110400/http://itc.ua/node/9950/ архивировано, 19 июня 2008 г])
* [http://www.literateprogramming.com/ Literate programming]{{ref-en}}
* [http://www-cs-faculty.stanford.edu/~knuth/lp.html Книга, полностью объясняющая философию Literate programming]{{ref-en}}
* [http://www.informit.com/articles/article.aspx?p=1193856 Interview with Donald Knuth, Apr 25, 2008] ([https://web.archive.org/web/20120731045910/http://webplanet.ru/interview/soft/2008/05/06/knuth.html перевод на русский] ())

{{Дональд Кнут}}

[[Категория:Дональд Кнут]]
[[Категория:Парадигмы программирования]]

Реклама:

Навигация