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


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

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

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

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

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

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