anton_nazarov: (Default)
[personal profile] anton_nazarov

Кнут придумал литературное программирование в начале 1980-х годов, во время работы над TeX-ом. Надо сказать, что первую версию TeX-а он написал и отладил на бумаге, а ввёл в компьютер лишь спустя несколько месяцев.

Понятно, что для успеха такой разработки код должно быть легко читать. Вообще читаемость кода, по мнению многих опытных разработчиков - это главное, что сейчас требуется от программистов.

Кнут предложил довести требование читаемости кода до предела и превратить написание программы в написание книги об этой программе. При этом код и документация не разделяются, они описывают решение проблемы формально и неформально. Естественно, что логика изложения может отличаться от последовательности команд. Кроме того, текст должен быть представлен в удобном для читателя виде. Поэтому нужны специальные инструменты, которые позволяют смешивать разметку текста и код.

Кнут, вполне естественно, предложил для текста TeX. Кроме того, в тот момент он использовал язык программирования Pascal, строгость которого усугубляется требованием однопроходной компиляции. Из-за этого порядок определения функций, типов и переменных строго фиксирован, что противоречит требованию понятности изложения. Так что Дональду Кнуту пришлось написать свою систему WEB, которая устроена примерно так. Программа состоит из кусочков (chunks)документации, чередующихся с кусочками кода. В кусочках кода можно ссылаться на другие кусочки, причем ссылки могут идти и вперед, и назад, а на один кусочек может быть несколько ссылок. Получается своего рода сеть, отсюда и название, которое потом использовали для похожей структуры документов в интернет.

Чтобы такую программу можно было использовать, есть две утилиты - tangle, которая вытаскивает кусочки кода, подставляет их на место ссылок и формирует программу, которую можно скомпилировать, и weave , которая форматирует кусочки кода командами TeX и создает документ TeX, который можно распечатать.

TeX и написан таким образом, а человеко-читаемая версия вышла в виде книги "TeX: The program".

Кстати, чтобы получить эту книгу в электронном виде, достаточно скачать исходный код TeX и выполнить следующие команды:

weave tex.web
tex tex.tex
xdvi tex.dvi

или

pdftex tex.tex
xpdf tex.pdf

Потом Кнут перешёл на язык C (который он хвалил в своём интервью, см. предыдущий пост ) и написал CWEB. Возникли и другие инструменты, например, noweb, nuweb, rambutan и другие.

Литературное программирование пока не достигло большой популярности, хотя многие опытные программисты и считают его хорошей идеей. Причина этого в том, что немногие люди умеют и любят писать.

Сам Дональд Кнут в своем интервью в книге описал ситуацию следующим образом, сославшись на Джона Бентли:

"[Т]олько два процента людей могут быть программистами. И только два процента могут быть хорошими писателями. А Кнут хочет чтобы все сочетали эти качества."
Я не думаю, что количество программистов в мире когда-нибудь превысит два процента - я имею в виду программистов, которые действительно способны находить общий язык с машиной от рождения. Однако теперь люди ведут блоги. Поэтому я заметил, что в среднем способность выражать свои мысли сильно растет, поэтому второй аргумент уже не имеет такого значения.

То есть ситуация улучшается благодаря всеобщему увлечению блогами. Программисты начали писать про программирование и иногда получается очень интересно, например у Джоэла Спольски (Joel on software) или у Стива Йегги (Steve Yeggae и тут). Так что литератуное программирование, возможно, ещё достигнет популярности.

Литературные программы, ориентированные на то, что их будут читать люди, хорошо подходят как для сопровождения в течении длительного времени, так и для совместной работы и обучения. Мне кажется, что литературное программирование в этом смыкается с OpenSource-движением. Для совместной работы над кодом существует масса сервисов, начиная от систем управления версиями (и социальных сайтов типа github на их основе) и заканчивая различными pastebin-ами (paste.lisp.org, pastebin.org и т.д.).

Поэтому мне было приятно обнаружить сайт, посвященный совместной работе над литературной реализацией различных алгоритмов на разных языках. Мне кажется, что этот сайт literateprograms.org может быть хорошим подспорьем при изучении новых языков программирования.

В следующем посте этой серии я расскажу о некоторых инструментах для литературного программирования, их достоинствах и недостатках и покажу, какие получаются красивые программы.

From: (Anonymous)
Да, пункт 2, об изменении порядка следования, отвечает на ваш вопрос "зачем лит-прог, если можно откомментировать".

Потому что литпрог - В ПОРЯДКЕ МЫСЛИ, а не в порядке машины, ради которой я должен изгибать мысль.

Пример в MOLLY.html - раздел 3, с кодом, в конце есть "ADD-ON" с добавкой
дополнительного языка разметки (т.е. док-секции можно размечать хтмл-ом, дефолт, но можно ма каком-нибудь маркдауне и т.д.)

не только я выделил кусок вне порядка следования, "по логике", но и из ничего, никаких подпрограмм или изменений кода, такой раздел даст пользователям место и точную инструкцию куда вставить свой кусок кода с их разметкой.

Т.е. создал полу-интерфейс для вставления плагинов, ничего не меняя в коде.


Другими словами, возможность держать "мета-язык" с произвольным порядком следования кусков, дает новые возможности и может отчасти заменять деление на функции и подпрограммы, которые программисты делают не из-за вычислительных нужд, а просто чтобы не сойти с ума.

По-моему, очень удобно.
From: [identity profile] andrastro.livejournal.com
Спасибо за подробный ответ!
Постараюсь посмотреть-разобраться.

Главное преимущество лит. программирования я вроде понял. Действительно интересный подход и, при наличии привычки, должно быть удобно.

ишу документацию потому ..

Date: 2009-11-22 06:38 pm (UTC)
From: (Anonymous)
Я сейчас пишу документацию, как пользоваться скриптом Молли, а потому
использую ваши вопросы чтобы понять, что вообще объяснять надо ;))

Давайте я воспроизведу один комментарий, который написан без выдумки, его
надо литературно подправить, но в которм автор пытался обЪяснить подход
на не-программном примере



    Если бы целью вашей была не программа, а роман или статья-эссе, то "писать на ЛП"
    означало бы писать примерно так:

      <  >=
      A HISTORICAL CURIOSITY
      this is a <  > that was used
      by Emperor Friedrich II when he replied
      to <  > of France, famously:
      "bla-bla-bla.
      <  >"
      @
      
      <  >=
      histoical quote that first surfaced in a lesser-known Austrian publication in 1843
      @
      
      <  >=
      Earl Marra and Count Swiepolski
      @
      
      <  >=
      Hrrrrrr mbrruaghhhrch
      awwrraghrtps
      pst pst pst.
      @
      


    И на самом деле так можно писать любые тексты, например журналистскую статью, в которой
    есть некая последовательная мысль, а отдельные куски или неизвестные сразу факты
    разрабатываются и добавляются позже.

    ЛП - метод организации мыслей и придания тексту структуры на мета-уровне, на основе неких
    фраз, скрывающих за собой любой "оконечный код" или любые подобые абстракции.

    Пре-процессор их автоматически подставит и развернет все в нужной последовательности


    Кстати часто думают, что ЛП - это жирные комментарии. Как можно больше текста.
    Как видите в последнем примере ВООБЩЕ НЕТ НИ ОДНОГО КОММЕНТАРИЯ, и вместе с тем это
    "программа на ЛП": она написана на "псевдокоде", т.е. с использованием макро, которые
    становятся точными операторами мета-языка.

    Т.е. ЛП в нормальном случае связан с текстом (который объясняет концепции и идеи кода),
    но сама техника введения макро вместо кропотливых кусков чтобы теми кусками заняться в
    их очередь и избавить мозг от нагрузки по ведению учета и контроля тысячи мыслей -- то
    есть для того, чтобы в конечном счете СТАТЬ УМНЕЕ за счет механизма абстрагирования --
    эта техника возможна и совершенно без комментариев.

    Которые почему-то все настаивают есть не заметки в помощь программисту, а некая "документация"
    якобы для посторонних людей.

    Нет, запись мыслей ПОМОЖЕТ и будет служить документацией идей, да. Но создается это не для
    Идеального Читателя васи, а для себя в момент программирования.











BROKEN

Date: 2009-11-22 06:40 pm (UTC)
From: (Anonymous)
shit, this one's broken: I forgot to escape < and >

Explanation - 1

Date: 2009-11-22 06:44 pm (UTC)
From: (Anonymous)
Если бы целью вашей была не программа, а роман или статья-эссе, то "писать на ЛП"
означало бы писать примерно так:

    <<quote>>=
    A HISTORICAL CURIOSITY
    this is a <<story>> that was used
    by Emperor Friedrich II when he replied
    to <<ambassadors>> of France, famously:
    "bla-bla-bla.
    <<quote_continued>>"
    @
    
    <<story>>=
    histoical quote that first surfaced in a lesser-known Austrian publication in 1843
    @
    
    <<ambassadors>>=
    Earl Marra and Count Swiepolski
    @
    
    <<quote_continued>>=
    Hrrrrrr mbrruaghhhrch
    awwrraghrtps
    pst pst pst.
    @
    


И на самом деле так можно писать любые тексты, например журналистскую статью, в которой
есть некая последовательная мысль, а отдельные куски или неизвестные сразу факты
разрабатываются и добавляются позже.

ЛП - метод организации мыслей и придания тексту структуры на мета-уровне, на основе неких
фраз, скрывающих за собой любой "оконечный код" или любые подобые абстракции.

Пре-процессор их автоматически подставит и развернет все в нужной последовательности


Кстати часто думают, что ЛП - это жирные комментарии. Как можно больше текста.
Как видите в последнем примере ВООБЩЕ НЕТ НИ ОДНОГО КОММЕНТАРИЯ, и вместе с тем это
"программа на ЛП": она написана на "псевдокоде", т.е. с использованием макро, которые
становятся точными операторами мета-языка.

Т.е. ЛП в нормальном случае связан с текстом (который объясняет концепции и идеи кода),
но сама техника введения макро вместо кропотливых кусков чтобы теми кусками заняться в
их очередь и избавить мозг от нагрузки по ведению учета и контроля тысячи мыслей -- то
есть для того, чтобы в конечном счете СТАТЬ УМНЕЕ за счет механизма абстрагирования --
эта техника возможна и совершенно без комментариев.

Которые почему-то все настаивают есть не заметки в помощь программисту, а некая "документация"
якобы для посторонних людей.

Нет, запись мыслей ПОМОЖЕТ и будет служить документацией идей, да. Но создается это не для
Идеального Читателя васи, а для себя в момент программирования.

Explanation-2

Date: 2009-11-22 06:48 pm (UTC)
From: (Anonymous)
Цитата о "людях, которые умеют хорошо писать" (их как бы мало среди программистов, а потому
ЛП не популярно) не к месту потому что ПОХЕРУ хорошо ли программист пишет или так себе: он
пишет для себя в помощь мыслям. По-моему неверно сразу ставить психологический барьер: "вы
обязаны извлечь из себя блестящее эссе-программу".

Чтобы стало понятнее, возьмем последний литературный пример. Он был без комментариев. Если
теперь "восстановить" те реалистические комментарии, которые там могли бы появиться в процессе,
это выглядело бы примерно так:


    Анекдот пойдет в эпиграф третьего раздела (? - или в основной текст?)

    <<quote>>=
    A HISTORICAL CURIOSITY
    this is a <<story>> that was used
    by Emperor Friedrich II when he replied
    to <<ambassadors>> of France, famously:
    "bla-bla-bla.
    <<quote_continued>>"
    @


    Уточнить дату и обстоятельства:
    <<story>>=
    histoical quote that first surfaced in a lesser-known Austrian publication in 1843
    @

    Нужны имена; если нет, выдумать: публика дура и любит "точность"
    <<ambassadors>>=
    Earl Marra and Count Swiepolski
    @

    Кажется цитата была в моих архивах: сделать поиск на хррр? пст?
    Брал её из гугла; вспомнить еще какие-то слова
    <<quote_continued>>=
    Hrrrrrr mbrruaghhhrch
    awwrraghrtps
    pst pst pst.
    @


.. ну а заполненные позже куски составят уже полный чистый текст, который НЕ НАДО лазить править
руками.

То есть в момент написания мы отодвинули массу соображений, которые занимают весьма
ограниченные ресурсы мозга (всего-то до 7, говорят, элементов в краткосрочной памяти) и
необходимости решать и увязывать детали.

Мы стали "умнее" за счет того, что убрали, отодвинули куски деятельнопсти, заменив их на
время фразами-абстракциями.

Вот в чем суть.

Profile

anton_nazarov: (Default)
anton_nazarov

September 2014

S M T W T F S
 123456
78910111213
14 151617181920
21222324252627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 19th, 2025 08:45 pm
Powered by Dreamwidth Studios