- Грамотное программирование
-
Стиль этой статьи неэнциклопедичен или нарушает нормы русского языка. Статью следует исправить согласно стилистическим правилам Википедии.Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей.Грамотное программирование (ГП; англ. Literate Programming) — концепция, методология программирования и документирования. Иногда это словосочетание (ошибочно переводят как)/[образно называют] "литературное программирование". Термин и саму концепцию разработал Дональд Кнут в 1981 году при разработке системы компьютерной вёрстки TeX.
Способ понять ГП — вспомнить объяснения в курсах программирования, написанные фразами на «псевдокоде» на «человеческом языке». Они понятны, когда сам код труден, и скрывают под одной фразой-«оператором» множество других вложенных абстракций и/или программного кода на непосредственно машинном языке.
ГП в некотором смысле есть «программирование на псевдокоде» произвольными фразами, которые затем раскрываются как точные макро с помощью утилиты из файла-текста, который включает в себя одновременно документированные текстовые объяснения концепций, сам код и псевдокод.
Содержание
Сущность подхода
- ГП есть цельный мета-подход к написанию программ, то есть «парадигма», применимая на мета-уровне к любой (процедурной, функциональной, декларативной, объектно-ориентированной) машинной программе на любом машинном языке;
- ГП есть система макро, создаваемая из фраз на человеческом языке, которые становятся «метаязыком» над конкретным языком программирования. Пользование этими фразами подобно объяснению алгоритмов на «псевдокоде», но в случае ГП они становятся точными «новыми операторами» метаязыка;
- программа и документация более не пишутся как машинный код с примечаниями. Само конструирование программы идёт в порядке, определяемом логикой мысли (или объяснений), где макро на «псевдокоде» играют роль абстракций (над абстракциями и/или кодом) для ясности мысли. Меняется кардинально порядок следования в программе, он не машинный, а тот, который требует логика;
- технически ГП делается с помощью утилиты, которая одной командой запускает препроцессор, раскрывает все макро и «спутывает», «запутывает» («tangle») логическое изложение в машинный код, который потом можно компилировать или запускать как обычно. Другая команда «сплетает» («weave») из этого общего для программы и объяснений файла сформатированную документацию (для печати, веба и т. д.).
Другими словами, программа мыслится не как иерархия, top-down или bottom-up, но как «взаимозависимая сеть концепций» (отсюда название первой системы ГП — «Web») и создается как «поток мысли», проходящий по этой сети в связном, логичном виде, что внешне делает форму описания похожей на литературное эссе. Программист, таким образом, отказывается от привязки к предписанному машиной порядку.
Ошибочные представления
Система ГП, которую Кнут предлагал как альтернативу «структурному программированию» 1970-х годов, несмотря на доказанную эффективность
, мало распространена из-за непонимания: многие думают, что ГП — лишь система документирования или система форматирования обычных комментариев. На самом деле, программа практически без комментариев может быть ГП, равно как и многословные примечания сами по себе не создают ГП-подхода.Самое частое непонимание относится к роли системы макро, позволяющей строить произвольные системы абстракций над абстракциями и к изменению порядка следования кусков от машинно-ориентированного к тому, который требует мышление. Так, абсолютно неверно считать ГП-программированием использование систем документирования интерфейсов вроде JavaDoc, doxygen, DOC++, autoduck, POD.
Пример ГП
Давайте изменим традиционные приоритеты в создании программ: вместо представления о нашей задаче как о создании инструкций «Что делать?» для компьютера сконцентрируемся на объяснении другим людям описаний нашего видения того, что под управлением программы должен делать компьютер.
— Дональд Кнут, http://community.livejournal.com/ru_perl/249441.html
Существующие инструменты
- WEB — система программирования для языка Паскаль
- CWEB — версия WEB, разработанная для документирования С, C++ и Java
- FWEB — система программирования для языка Фортран
- pyWeb - система, позволяющая создавать программы на любом языке программирования и описывать их с помощью произвольного языка разметки, например, HTML, reStructured Text или LaTeX
- Rambutan — система программирования для языка Java
- Noweb
- FunnelWeb
- CLiP, cnoweb
- simplelp (http://gitorious.org/simplelp, http://fireforge.net/projects/simplelp/)
См. также
Ссылки
- отрывок из примера из работы Кнута (пере-размеченного для «noweb» utility)
- «Грамотное программирование» Андрей Зубинский, 22 мая 2002 г (архивироано, 19 июня 2008 г)
- Literate programming (англ.)
- Книга, полностью объясняющая философию Literate programming (англ.)
- Interview with Donald Knuth, Apr 25, 2008 (перевод на русский)
- Пример литературной программы на Java, написанной с использованием pyWeb
Категории:- Дональд Кнут
- Парадигмы программирования
Wikimedia Foundation. 2010.