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

Грамотное программирование (англ. literate programming — литературное программирование) — концепция, методология программирования и документирования, в которой программа фактически пишется на естественном языке, а инструкции входят в неё в форме макроподстановок и кода на языках программирования. Предложена Дональдом Кнутом в 1981 году при разработке системы компьютерной вёрстки ΤΕΧ, им же разработана исторически первая система поддержки грамотного программирования — WEB для Паскаля. Впоследствии также были реализованы системы CWEB[en] (для Си, C++ и Java), FWEB[en] (для Фортрана) и ряд других (в том числе Noweb[en], FunnelWeb[en], CLiP, cnoweb).

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

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

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

В результате применения подхода программа и документация более не пишутся как код на языке программирования с примечаниями — само конструирование программы идёт в порядке, определяемом логикой мысли или объяснений, где макросы псевдокода играют роль абстракций.

Обычная техническая реализация — применение препроцессора, который раскрывает все макросы и превращает программу (англ. tangle — «спутывает») в код на языке программирования, который впоследствии может быть скомпилирован или интерпретирован стандартными средствами. Также может быть предусмотрена команда «сплетения» (англ. weave), при помощи которой программа превращается в отформатированную документацию (например, для печати или публикации в вебе).

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

Распространение править

Изначально Кнут предлагал этот подход как альтернативу «структурному программированию», набравшему популярность с 1970-х годов, но несмотря на положительные отзывы, подход не получил широкого распространения из-за отсутствия инструментальной поддержки. Другой проблемой явилась ориентация подхода на пакетную обработку, тогда как системы программирования всё больше стали ориентироваться на средства с WYSIWYG[1].

Кроме того, распространению грамотного программирования помешали ложные представления о том, что «грамотные программы» должны быть монолитными и что «грамотная программа» — противоположность гипертекста[1]. Ещё одним ограничением стало представление о том, что грамотное программирование — лишь система документирования или система форматирования обычных комментариев. Самое частое непонимание относится к роли системы макросов, позволяющей строить произвольные системы абстракций над абстракциями и к изменению порядка следования кусков от машинно-ориентированного к тому, который требует мышление (иногда даже неверно относится к грамотному программированию использование систем документирования интерфейсов вроде JavaDoc, doxygen, DOC++, autoduck, POD).

Примечания править

  1. 1 2 Sametinger, 1997, 18. Literate programming.

Литература править

  • Sametinger, J. Software Engineering with Reusable Components. — Springer, 1997. — 272 p. — ISBN 9783540626954.
  • Robinson, J.A. 2.4 Software as literature // Software Design for Engineers and Scientists. — Elsevier Science, 2004. — 414 p. — ISBN 9780080474403.

Ссылки править