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

Поделись знанием:
Перейти к: навигация, поиск

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

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

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





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

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

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

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

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

Принятие

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

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

Кроме того, распространению ГП помешали ложные представления о том, что "грамотные программы" должны быть монолитными и что ГП — противоположность гипертекста[2].

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

Самое частое непонимание относится к роли системы макросов, позволяющей строить произвольные системы абстракций над абстракциями и к изменению порядка следования кусков от машинно-ориентированного к тому, который требует мышление. Так, абсолютно неверно считать ГП-программированием использование систем документирования интерфейсов вроде 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.»

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

  • WEB — система программирования для языка Паскаль
  • CWEB — версия WEB, разработанная для документирования С, C++ и Java
  • FWEB — система программирования для языка Фортран
  • [sourceforge.net/projects/pywebtool/ pyWeb] — система, позволяющая создавать программы на любом языке программирования и описывать их с помощью произвольного языка разметки, например, HTML, reStructured Text или LaTeX
  • Rambutan — система программирования для языка Java
  • Noweb
  • FunnelWeb
  • CLiP, cnoweb
  • simplelp (gitorious.org/simplelp)

Напишите отзыв о статье "Грамотное программирование"

Примечания

  1. Иногда методологию образно называют «литературным программированием»
  2. 1 2 3 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.

Ссылки

  • [anonym-mouse.livejournal.com/2323.html отрывок из примера из работы Кнута (пере-размеченного для «noweb» utility)]
  • [www.itc.ua/node/9950/ «Грамотное программирование» Андрей Зубинский, 22 мая 2002 г] ([web.archive.org/web/20080619110400/itc.ua/node/9950/ архивировано, 19 июня 2008 г])
  • [www.literateprogramming.com/ Literate programming]  (англ.)
  • [www-cs-faculty.stanford.edu/~knuth/lp.html Книга, полностью объясняющая философию Literate programming]  (англ.)
  • [www.informit.com/articles/article.aspx?p=1193856 Interview with Donald Knuth, Apr 25, 2008] ([web.archive.org/web/20080509032349/webplanet.ru/interview/soft/2008/05/06/knuth.html перевод на русский] ([web.archive.org/web/20120731045910/webplanet.ru/interview/soft/2008/05/06/knuth.html архивировано, 31 июля 2012 г]))

Отрывок, характеризующий Грамотное программирование

– Да, много, много мы изменились с тех пор, – сказал князь Андрей.
– Ну а вы? – спрашивал Пьер, – какие ваши планы?
– Планы? – иронически повторил князь Андрей. – Мои планы? – повторил он, как бы удивляясь значению такого слова. – Да вот видишь, строюсь, хочу к будущему году переехать совсем…
Пьер молча, пристально вглядывался в состаревшееся лицо (князя) Андрея.
– Нет, я спрашиваю, – сказал Пьер, – но князь Андрей перебил его:
– Да что про меня говорить…. расскажи же, расскажи про свое путешествие, про всё, что ты там наделал в своих именьях?
Пьер стал рассказывать о том, что он сделал в своих имениях, стараясь как можно более скрыть свое участие в улучшениях, сделанных им. Князь Андрей несколько раз подсказывал Пьеру вперед то, что он рассказывал, как будто всё то, что сделал Пьер, была давно известная история, и слушал не только не с интересом, но даже как будто стыдясь за то, что рассказывал Пьер.
Пьеру стало неловко и даже тяжело в обществе своего друга. Он замолчал.
– А вот что, душа моя, – сказал князь Андрей, которому очевидно было тоже тяжело и стеснительно с гостем, – я здесь на биваках, и приехал только посмотреть. Я нынче еду опять к сестре. Я тебя познакомлю с ними. Да ты, кажется, знаком, – сказал он, очевидно занимая гостя, с которым он не чувствовал теперь ничего общего. – Мы поедем после обеда. А теперь хочешь посмотреть мою усадьбу? – Они вышли и проходили до обеда, разговаривая о политических новостях и общих знакомых, как люди мало близкие друг к другу. С некоторым оживлением и интересом князь Андрей говорил только об устраиваемой им новой усадьбе и постройке, но и тут в середине разговора, на подмостках, когда князь Андрей описывал Пьеру будущее расположение дома, он вдруг остановился. – Впрочем тут нет ничего интересного, пойдем обедать и поедем. – За обедом зашел разговор о женитьбе Пьера.
– Я очень удивился, когда услышал об этом, – сказал князь Андрей.
Пьер покраснел так же, как он краснел всегда при этом, и торопливо сказал:
– Я вам расскажу когда нибудь, как это всё случилось. Но вы знаете, что всё это кончено и навсегда.
– Навсегда? – сказал князь Андрей. – Навсегда ничего не бывает.
– Но вы знаете, как это всё кончилось? Слышали про дуэль?
– Да, ты прошел и через это.
– Одно, за что я благодарю Бога, это за то, что я не убил этого человека, – сказал Пьер.
– Отчего же? – сказал князь Андрей. – Убить злую собаку даже очень хорошо.
– Нет, убить человека не хорошо, несправедливо…
– Отчего же несправедливо? – повторил князь Андрей; то, что справедливо и несправедливо – не дано судить людям. Люди вечно заблуждались и будут заблуждаться, и ни в чем больше, как в том, что они считают справедливым и несправедливым.
– Несправедливо то, что есть зло для другого человека, – сказал Пьер, с удовольствием чувствуя, что в первый раз со времени его приезда князь Андрей оживлялся и начинал говорить и хотел высказать всё то, что сделало его таким, каким он был теперь.
– А кто тебе сказал, что такое зло для другого человека? – спросил он.
– Зло? Зло? – сказал Пьер, – мы все знаем, что такое зло для себя.
– Да мы знаем, но то зло, которое я знаю для себя, я не могу сделать другому человеку, – всё более и более оживляясь говорил князь Андрей, видимо желая высказать Пьеру свой новый взгляд на вещи. Он говорил по французски. Je ne connais l dans la vie que deux maux bien reels: c'est le remord et la maladie. II n'est de bien que l'absence de ces maux. [Я знаю в жизни только два настоящих несчастья: это угрызение совести и болезнь. И единственное благо есть отсутствие этих зол.] Жить для себя, избегая только этих двух зол: вот вся моя мудрость теперь.
– А любовь к ближнему, а самопожертвование? – заговорил Пьер. – Нет, я с вами не могу согласиться! Жить только так, чтобы не делать зла, чтоб не раскаиваться? этого мало. Я жил так, я жил для себя и погубил свою жизнь. И только теперь, когда я живу, по крайней мере, стараюсь (из скромности поправился Пьер) жить для других, только теперь я понял всё счастие жизни. Нет я не соглашусь с вами, да и вы не думаете того, что вы говорите.
Князь Андрей молча глядел на Пьера и насмешливо улыбался.
– Вот увидишь сестру, княжну Марью. С ней вы сойдетесь, – сказал он. – Может быть, ты прав для себя, – продолжал он, помолчав немного; – но каждый живет по своему: ты жил для себя и говоришь, что этим чуть не погубил свою жизнь, а узнал счастие только тогда, когда стал жить для других. А я испытал противуположное. Я жил для славы. (Ведь что же слава? та же любовь к другим, желание сделать для них что нибудь, желание их похвалы.) Так я жил для других, и не почти, а совсем погубил свою жизнь. И с тех пор стал спокойнее, как живу для одного себя.
– Да как же жить для одного себя? – разгорячаясь спросил Пьер. – А сын, а сестра, а отец?
– Да это всё тот же я, это не другие, – сказал князь Андрей, а другие, ближние, le prochain, как вы с княжной Марьей называете, это главный источник заблуждения и зла. Le prochаin [Ближний] это те, твои киевские мужики, которым ты хочешь сделать добро.
И он посмотрел на Пьера насмешливо вызывающим взглядом. Он, видимо, вызывал Пьера.
– Вы шутите, – всё более и более оживляясь говорил Пьер. Какое же может быть заблуждение и зло в том, что я желал (очень мало и дурно исполнил), но желал сделать добро, да и сделал хотя кое что? Какое же может быть зло, что несчастные люди, наши мужики, люди такие же, как и мы, выростающие и умирающие без другого понятия о Боге и правде, как обряд и бессмысленная молитва, будут поучаться в утешительных верованиях будущей жизни, возмездия, награды, утешения? Какое же зло и заблуждение в том, что люди умирают от болезни, без помощи, когда так легко материально помочь им, и я им дам лекаря, и больницу, и приют старику? И разве не ощутительное, не несомненное благо то, что мужик, баба с ребенком не имеют дня и ночи покоя, а я дам им отдых и досуг?… – говорил Пьер, торопясь и шепелявя. – И я это сделал, хоть плохо, хоть немного, но сделал кое что для этого, и вы не только меня не разуверите в том, что то, что я сделал хорошо, но и не разуверите, чтоб вы сами этого не думали. А главное, – продолжал Пьер, – я вот что знаю и знаю верно, что наслаждение делать это добро есть единственное верное счастие жизни.