Русская Википедия:Грамотное программирование

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:СтильШаблон:Переработать Грамотное программирование (ГП; Шаблон:Lang-en) — концепция, методология программирования и документирования, в которой программа состоит из прозы на естественном языке вперемешку с макроподстановками и кодом на языках программирования[1]. Термин и саму концепцию предложил Дональд Кнут в 1981 году при разработке системы компьютерной вёрстки Шаблон:TeX.

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

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

Сущность подхода

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

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

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

Принятие

Система ГП, которую Кнут предлагал как альтернативу «структурному программированию» 1970-х годов, несмотря на благоприятные отзывы, не получила широкого распространения из-за отсутствия инструментальной поддержки и их интеграцииШаблон:Sfn.

Другой проблемой явилась ориентация ГП на пакетную обработку, тогда как системы программирования всё больше стали ориентироваться на средства с WYSIWYGШаблон:Sfn.

Кроме того, распространению ГП помешали ложные представления о том, что «грамотные программы» должны быть монолитными и что ГП — противоположность гипертекстаШаблон:Sfn.

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

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

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

Существующие инструменты

Шаблон:Список примеров

Примечания

Шаблон:Примечания

Литература

Ссылки

Шаблон:Дональд Кнут

  1. Иногда методологию образно называют «литературным программированием»