Грамотное программирование

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Грамотное программирование (ГП; англ. Literate Programming) — концепция, методология программирования и документирования. Иногда это словосочетание ошибочно переводят или образно называют «литературное программирование». Термин и саму концепцию разработал Дональд Кнут в 1981 году при разработке системы компьютерной вёрстки TeX.

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

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

Сущность подхода[править | править вики-текст]

  • ГП есть цельный метаподход к написанию программ, то есть «парадигма», применимая на метауровне к любой (процедурной, функциональной, декларативной, объектно-ориентированной) машинной программе на любом машинном языке;
  • ГП есть система макросов, создаваемая из фраз на человеческом языке, которые становятся «метаязыком» над конкретным языком программирования. Пользование этими фразами подобно объяснению алгоритмов на «псевдокоде», но в случае ГП они становятся точными «новыми операторами» метаязыка;
  • программа и документация более не пишутся как машинный код с примечаниями. Само конструирование программы идёт в порядке, определяемом логикой мысли (или объяснений), где макросы псевдокода играют роль абстракций (над абстракциями и/или кодом) для ясности мысли. Меняется кардинально порядок следования в программе, он не машинный, а тот, который требует логика;
  • технически ГП делается с помощью утилиты, которая одной командой запускает препроцессор, раскрывает все макросы и «спутывает», «запутывает» («tangle») логическое изложение в машинный код, который потом можно компилировать или запускать как обычно. Другая команда «сплетает» («weave») из этого общего для программы и объяснений файла отформатированную документацию (для печати, веба и т. д.).

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

Ошибочные представления[править | править вики-текст]

Система ГП, которую Кнут предлагал как альтернативу «структурному программированию» 1970-х годов, несмотря на доказанную эффективность[источник не указан 1297 дней], мало распространена из-за непонимания: многие думают, что ГП — лишь система документирования или система форматирования обычных комментариев. На самом деле, программа практически без комментариев может быть написана с применением подхода ГП, равно как и многословные примечания сами по себе не создают ГП-подхода.

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

Ещё одним заблуждением считается, что Д. Е. Кнут хотел зафиксировать подход «сверху-вниз» в разработке программных систем. На самом деле он предлагает совмещать подходы «сверху вниз» и «снизу вверх», как это следует из цитаты, приведённой в книге TeX:The program: «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.»

Пример ГП[править | править вики-текст]

Давайте изменим традиционные приоритеты в создании программ: вместо представления о нашей задаче как о создании инструкций «Что делать?» для компьютера сконцентрируемся на объяснении другим людям описаний нашего видения того, что под управлением программы должен делать компьютер.

Дональд Кнут, http://community.livejournal.com/ru_perl/249441.html

Существующие инструменты[править | править вики-текст]

См. также[править | править вики-текст]

Ссылки[править | править вики-текст]