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 может быть хорошим подспорьем при изучении новых языков программирования.

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

Date: 2009-11-17 08:05 pm (UTC)
From: [identity profile] andrastro.livejournal.com
Супер!
Мне даже комментировать стыдно :-)

Date: 2009-11-17 08:42 pm (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Спасибо.
Но лучше всё-таки прокомментируй :)
Наверняка найдётся что добавить или за что покритиковать.
Хотя бы за то, что пост не провоцирует комментирование ;-)

Date: 2009-11-17 09:30 pm (UTC)
From: [identity profile] sergeif.livejournal.com
Это плохой пост! Тут нет ни слова про монады. Может быть ты даже гуманитарий?

Date: 2009-11-17 09:57 pm (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Я уже писал посты про философию ([1] (http://anton-nazarov.livejournal.com/34477.html), [2] (http://anton-nazarov.livejournal.com/34282.html), [3] (http://anton-nazarov.livejournal.com/33236.html), [4] (http://anton-nazarov.livejournal.com/30946.html)), неужели тебе мало? :)

Кстати, смотри как прикольно - объектная система на Scheme всего в 50 строчек: http://github.com/naa/Articles/blob/master/AffineLieAlgebras/SchemePrograms/LispMeObjects.scm
Работает и на Palm-е, и на PC, причём в разных реализациях Scheme.
Или ты по-прежнему настаиваешь на монадах?! :)

Newlisp

Date: 2009-11-17 10:22 pm (UTC)
From: (Anonymous)
Еще один превед.
Scheme - хороший язык, да. Есть один минималистский лисп, www.newlisp.org, сделанный немцем живущим в США Lutz Mueller'ом. На любой платформе, одна программка <250кб размером. Больше 300 операторов, покрывают практически все, что надо. Прямая работа с библиотеками на Си. Сам язык - скриптовый, быстрый и т.д. Он однако позволяет "привязывать" ваш скрипт к самому исполняемому файлу-языку. Получается псевдо-монолитная программа 250к+размер вашего скрипта, приблизительно говоря.

Автор в него встроил "контексты" (на основе black-red trees, т.е. "hashes"), весьма интересный минималистский инструмент сам по себе.

Рекомендую.

Re: Newlisp

Date: 2009-11-17 10:47 pm (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Я его когда-то давно смотрел, но как-то не оценил, хотя в нём много чего есть.
Вообще всяких lisp-ов много. Вот, например, сейчас Clojure (http://clojure.org/) активно развивается, а ещё arc (http://arclanguage.org/) есть, там даже online-REPL дают: http://dabuttonfactory.com:8080/ .
Просто Scheme - один из двух "стандартных" диалектов и есть для всех платформ, включая старые Palm-ы, Pocket PC и всякие микроконтроллеры. Я с программками на Scheme в транспорте играюсь.

Date: 2009-11-17 10:23 pm (UTC)
From: [identity profile] sergeif.livejournal.com
Комментарии перед кодом напоминают молитву перед едой.

Это какие-то структуры. Так и С объектный язык, что ли? Все это зачем-то нужно?

BTW, Haskell type class и таких "объектов" нам не надо!

Date: 2009-11-17 10:25 pm (UTC)
From: [identity profile] sergeif.livejournal.com
Ладно, так и быть, не совсем структуры, но даже до питоновских объектов далеко.

Date: 2009-11-17 11:03 pm (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Мне понравилось, что такой маленький кусочек кода, а уже полезный. То есть можно начать буквально с лямбда-исчисления или metacircular-evaulator-а из SICP и собрать из таких кусочков язык, на котором можно будет писать что-то интересное.

Date: 2009-11-17 11:12 pm (UTC)
From: [identity profile] sergeif.livejournal.com
Ты так спокойно об этом говоришь, что это меня успокаивает и придётся опять идти читать теоркат для придания себе агрессивности.

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

А что за математической библиотеки ты хочешь в Haskell? В смысле, чего тебе не хватает?

Date: 2009-11-18 12:05 am (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Это требует серьёзного обсуждения, конечно, но сейчас могу привести пару ссылок, чтобы пояснить суть проблемы. Во-первых, Haskell - мощный язык, поэтому хочется что-то вроде http://haskell.org/haskellwiki/Numeric_Prelude , но это всё не в стандарте и не работает.
Кроме того, библиотеки для линейной алгебры тоже как-то странно выглядят - если использовать враппер вокруг CLAPACK, то зачем нам вообще мощный функциональный язык с системой типов?
То есть библиотеки для линейной алгебры какие-то неготовые - их несколько и нет одной "стандартной", хотя HMatrix (http://hackage.haskell.org/cgi-bin/hackage-scripts/package/hmatrix) вроде бы не плоха, но она появилась чуть ли не в 2008 году, то есть совсем недавно.

Date: 2009-11-18 12:08 pm (UTC)
From: [identity profile] sergeif.livejournal.com
1)В scheme есть встроенная математическая библиотека?
2)Под !не работает! ты имеешь в виду !не работает на нераспространенных платформах! ?
3)Я может ересь скажу, но для линейки лучше биндинги с GPU-шными библиотеками налаживать, вот уж где линейка работает быстро и почти безглючно. С другой стороны, в palm и во многих других девайсах подобные вещи появятся не скоро, если вообще появятся.

У нас с тобой разные требования. Мне не так важно, чтобы мои программы работали на каких-то платформах, кроме тех, на которых работаю я. Результат намного важнее самой программы. Хотя я бы не отказался от программирования на haskell под айфон, но пока все что видел либо слишком сложно в установке и происходят в процессе вещи, которые нигде не описаны, либо просто вылетает при запуске без объяснения причин.

Date: 2009-11-18 01:08 pm (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Я не имел в виду сравнение Haskell со Scheme, совсем. Понятно, что это сравнение будет в пользу более нового и продвинутого языка. Мой комментарий скорее можно интерпретировать как сравнение Haskell с тем, как народ сейчас пишет вычислительные вещи (C++, SciPy/NumPy, Mathematica, Matlab, и т.п.).
У меня есть кусок кода на Maple, в котором выражены всякие алгебраические вещи, которыми я занимаюсь. Он выглядит ужасно, так как Maple довольно кривой язык, в котором сложно выражать новые абстракции. Я думал переписать этот код на каком-то другом языке, но от переписывания на Haskell пока отказался из-за упомянутых сложностей. Ведь из-за них этим кодом вряд ли сможет воспользоваться кто-то кроме меня и даже мне будет трудно на других машинах, так как придётся доустанавливать какие-то билиотеки и т.п. Вот сейчас думаю про Математику, она вроде лучше Maple как язык и вообще на Lisp похожа.

Насчёт проблем с платформами ты уже и сам отписался, у меня были некоторые трудности со сборкой ghc на машине с OpenSUSE 10.2 без прав рута (это совсем не старый дистрибутив, но тем не менее).
Под не работает по отношению к NumericPrelude я имел в виду, что если использовать эту библиотеку, то сломаются все остальные, то есть я окажусь с более хорошими числами, но без линейной алгебры.

Date: 2009-11-18 02:49 pm (UTC)
From: [identity profile] sergeif.livejournal.com
Не очень понимаю почему с этой библиотекой должно перестать работать то, что работало раньше, но не пробовал, и верю тебе.

Народ вычислительные вещи все-таки на plain C пишет, наверное. Благо и библиотек достаточно. А лучше всего Intel C compiler + Intel Math Library, работает понятно на каких платформах, но рулит по скорости безмерно (интересно, что иногда на бинарник ругается мой антивирусник). А если еще и Intel Parallel Studio заюзать... Но это все около 2К$ стоит, хотя и вполне оправдывает цену. Делаешь библиотеку с нужным тебе вычислительным ядром и после этого пишешь GUI на каком-нибудь Qt -- супер!

Вот с NumPy у меня схожая ситуация, что у тебя с Numeric в Haskell. Мне NumPy был нужен исключительно для установки Biopython'а, версию поставил из списка совместимых. Очень часто эксепшены появляются в части, которая юзает NumPy. Моей квалификации не хватает, чтобы понять что именно не так, но вот с точки зрения пользователя Biopython, NumPy -- зло.

Matlab из твоего списка наиболее мощный инструмент, пожалуй, тут я не спорю. И вывод нативный -- картинки рисовать и работает всё из коробки. И, пожалуй, да, это самое эффективный инструмент для сложных расчетов, тем более алгебраических, с точки зрения продуктивности программиста и отладки. Но если ты хочешь писать инструмент, требующий некой не банальной интерактивности, то он не подойдет.

Date: 2009-11-17 10:59 pm (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Конечно структуры - зато работает и на LispMe и на нормальных реализациях Scheme, у которых совсем другие макросы.
Естественно, что на C можно писать объектно-ориентированный код - взять хоть тот же GTK+.
Тут довольно забавно получается, вполне похоже на человеческое ООП в духе SmallTalk:
 (class 'test 'object
	'(test 1)                           ; Slot
	`(display-test                      ; Method (signal)
	  ,(lambda (self)
	     (display (send self 'test)))))

(define *instance* (new 'test '(test 5)))

(send *instance* 'display-test)
; 5


Зачем нужно - очевидно, чтобы поиграться =). Я, например, на досуге пишу программку, чтобы на Palm-е всякие картиночки с корневыми/весовыми диаграммами для разных алгебр рисовать.

А Haskell - это хорошо, конечно, только он меня слегка разочаровал отсутствием стандартной математической библиотеки и тем, что с трудом заводится на разных платформах.

Date: 2009-11-22 11:36 am (UTC)
From: [identity profile] andrastro.livejournal.com
А насколько сложнее написать "литературную" программу, чем просто хорошо откомментировать обычный код?
Есть у меня ощущение, что литературное программирование может быть оправдано только для очень больших кодов с нетривиальными алгоритмами (я то с примитивными программами работаю. Даже комментировать в них почти нечего :-) ). И, кстати, не затрудняет ли оно разделение программ на части, которые проще отладить по отдельности?

возьмите пример

Date: 2009-11-22 04:26 pm (UTC)
From: (Anonymous)
А вы возьмите пример - файл с объяснениями "MOLLY.html" из
http://github.com/unixtechie/Literate-Molly/

и даже особо не читая его, пролистайте третью часть, где код.

По-моему, ЛП собой _заменяет_ деление на функции и подпрограммы там, где
это нужно лишь программисту чтобы не потерять нить (и если он этого хочет,
разумеется его никто не заставляет перестать оформлять куски как подпрограммы)

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

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

Пролистайте мой код, читая MOLLY.html - а затем просмотрите тот код, который
программа из него извлекает, MOLLY.pl

Для отладки в таком ЛП существует несколько очевидных приемов.

--1-- складной ЛП-файл (впрочем, и традиционный, просто там этим реже пользуются) может включать в себя сколько угодно реальный файлов с кодом.
Поэтому я могу просто открыть подраздел, в нем написать тест, взять его
из Лит_исходника командой
"notangle -R 'my_test' > my_test.pl"
или "MOLLY.pl -R 'my_test' >my_test.pl" 

и его попробовать

Я могу держать в лит-исходнике сколько угодно тестов, мейкфайлы и т.д. в
поддержку основного проекта. И могу держать также несколько файлов проекта
в одном лит-исходнике, например, "prog.c" и "prog.h"

--2-- лит-программирование позволяет _добавлять_ к уже существующему куску текста в любом месте далее вниз.
Т.е. я пишу:
    <<секция раз>>=
    код-код-код
    @

    много объяснений.

    Другой раздел
    Теперь мы добавим новую функциональность поверх уже работающей основы.
    <<секция раз>>=
    новые строчки
    @

Для машины же они будут положены в то место, где "секция раз" была начата.

Это первый приём изменения порядка следования, от машинного к тому, как хочется человеку по смыслу.

Второй в том, что сами куски "секция раз" могут писаться в произвольном порядке, а попадут в код точно в том месте, где на них сослались:
    <<начало моей программы>>=
    	<<задекларировать>>
    	<<первый кусок обработки>>
    	<<секция раз>>
    	<<второй кусок обработки>>
    
    @
    



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

    <<моя программа>>=
    код-код-код
    код-код-код
    <<буду менять здесь>>
    код-код-код
    код-код-код
    @
    
    <<буду менять здесь - рабочий, отложить в сторону>>=
    код-код-код
    код-код-код
    @
    
    <<буду менять здесь>>=
    код-новый код-код
    код-код-подновленный код-код
    код-код-код
    @
    


Понятно, что делать такие обходы и откаты чрезвычайно легко,
никаких синтаксических ошибок не насажаешь, все куски можно оставлять
в лит-исходнике, а в моем складном они просто идут в подраздел, которого
НЕ ВИДИШЬ ВООБЩЕ, пока не надо.

Вообще вся идея моего расширения со складным ХТМЛ в том, что у вас может
быть 20 мегабайт кода, но читать вы будете только 5 логически нужных вам для работы сейчас страниц. Остальное для вас просто невидимо. Оно сложено.


-----------
В традиционном Лит-прог всё описанное возможно технически, но сами файлы - "плоские", в них всё идет подряд, а потому человеку, даже работающему в редакторе со "складыванием" (вроде emacs, vim и т.д.), всё равно надо держать в голове всю структуру лит-файла.
Я в Molly убрал эту нагрузку с программиста.


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

Просмотрите MOLLY.html Когда будете его читать, держите включенным JavaScript в браузере.


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, говорят, элементов в краткосрочной памяти) и
необходимости решать и увязывать детали.

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

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

Date: 2009-11-17 08:13 pm (UTC)
From: [identity profile] urich.livejournal.com
Я правильно понял, веб занимается разделением написанных специальным образом программизмов на, собственно, программу и документашку?
Где попыриться на пример кода? Есть ли веб для SQL?

Date: 2009-11-17 08:48 pm (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Да, всё правильно.
Можешь посмотреть на исходник TeX-а по ссылке в посте.
Вообще я хотел в следующем посте примеры показывать, но можешь глянуть вот сюда:
http://github.com/naa/Articles/raw/master/AffineLieAlgebras/MaplePrograms/ClassicalBranching.nw

Вообще noweb не различает языки, я его вообще для Maple использовал. К сожалению, я не знаю примеров именно для SQL, а на http://LiteratePrograms.org на SQL есть только Hello World! (http://en.literateprograms.org/Hello_World_%28SQL%29), который не использует возможностей средств литературного программирования по реорганизации порядка кода для удобства чтения.

Date: 2009-11-17 10:10 pm (UTC)
From: (Anonymous)
Превед от автора Молли

0. Вы написали верно. Это не такое малое достижение, учитывая количество непонимания вокруг совершенно конкретной техники программирования. Её смешивают (а) с системой документации и (б) с особенной разговорчивостью в комментариях к коду.
Однако Л.П. (и "сеть" кода) может существовать вообще без комментариев, хотя это было бы субстандартным применением техники.

1. Отсылать людей к оригинальному ВЕБу (или СиВЕБу) пожалуй слишком жестоко.
Де-факто стандарт для повседневного употребления - "noweb" Нормана Рамзи, который
написал его как свой еще более упрощённый вариант упрощенного инструмента nuweb.

И nuweb, и noweb не привязаны к одному языку программирования, а noweb к тому же не провязан жестко и к ТеХу.

noweb написан на скриптовом языке (-ых -ах, есть две версии), и в очень стабильном виде существует уже больше десятка лет.

Есть еще и независимый от ТеХа написанный на Си funnelweb, монолитный самодостаточный инструмент. Его проблема - в уродском выборе разметки, который заставляет отказаться от набивки макро. То ли я разучился писать aliases для моего редактора ;))

Так что отсылайте к noweb'у для первого знакомства


2. Написано все правильно. Однако для понимания нужны примеры.
(а) я в свое время переписал статью в английской википедии и выдержал маленькую войну с идиотами, которые отказывались верить каждому из сделанных мной основополагающих утверждений. В результате я переделал ту статью ( http://en.wikipedia.org/wiki/Literate_programming ) еще раз, сделав её ПОЛНОСТЬЮ из Кнутовских цитат.
Атака и. ослабла, и они нанесли последний, вялый удар, изгнав все цитаты в "ссылки", где их никто никогда не прочитает.

В той статье есть обрывок, недостаточный, примера того, как Л.П. делается. Подробнее в ЖЖ и на русском примеры рассматриваются например здесь:
http://anonym-mouse.livejournal.com/2323.html

(кстати одно из эссе Стива Егге переведено в том же журнале:
http://anonym-mouse.livejournal.com/1294.html )

3. Я может быть все же доведу скрипт Молли до сколько-то пригодного вида. Встроил в него tangler (пока еще не подгрузил версию на github, но добавлю скоро), который вроде бы дает на тестах те же результаты, что и notangle.

Хочу сделать одно расширение: чтобы он мог tangle из НЕСКОЛЬКИХ файлов.
Т.е. вы ведете проект, в какой-то момент разрезаете механически свой Literate Source file на куски, не заботясь о том, чтобы они были самодостаточны. Потом просто дав все куски на командной строке скрипту, который вызывается в роли tangler'а, вы можете получить свой код, где бы он там по кускам не извивался.
Насколько я знаю, никто так почему-то не делал. А это в принципе элементарно.

4. Да, еще вот что. После написания статьи в Википедию я начал было делать русский вариант и сломался.
Можно добавить/заменить текст в русской википедии на ваше объяснение, оно разумно.
Туда же надо дать и кусочек конкретного примера, можно или из ссылки или из второй части вашей заметки.

Date: 2009-11-17 10:20 pm (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Спасибо за содержательный комментарий и интересные ссылки.
Я русскую википедию прочитал когда текст этого поста уже был в основном написан и понял, что я фактически переписал вашу статью своими словами :)
В следующем посте на эту тему я попробую описать noweb и Molly, единственное, что я вряд ли смогу как следует разобраться в исходниках - очень давно не писал на Perl.

Кстати, какой редактор вы используете для noweb-файлов?
Мне не очень нравится noweb-mode в emacs неправильной подсветкой, а noweb2-mumamo-mode из состава nxhtml к сожалению падает.

Date: 2009-11-17 10:31 pm (UTC)
From: (Anonymous)
Не надо разбираться в моем коде на перле. Я с ним сам разберусь ;))
Скрипт написан довольно неряшливо, и его надо чистить. Т.е. сохранить функциональность, но почистить код.
Хотя он небольшой сам по себе. Вместе с новым tangler'ом - меньше 1000 строчек кода (из которых большой кусок - вставленный html stylesheet)

Сейчас с ним трудно работать из-за излишней болтливости комментариев.
Она возникла:
(а) потому что я намеренно пробовал, как можно крутить этот формат, "складной хтмл"
(б) порезал на слишком мелкие кусочки, наверно
(в) проверяя концепцию, что Л.П. - не создание отполированного эссе (это лишь одна из целей), пользовался файлом чтобы держать заметки для памяти, обрывки тестов или кода, который я не стал применять и т.д.

Может быть еще одно расширение - добавить conditional weaving и/или conditional tangling, когда подразделы документа включаются или нет в "чистый" вариант.
Тогда разработчик может держать полную, неряшливую версию, а посторонним выдавать лишь набор "чистых" разделов из документа.

Технически это все довольно прямолинейно.
From: (Anonymous)
Впрочем, я посмотрел код альтернатив, и начал уважать свой скрипт гораздо больше ;))))))))
В нем _всего_ 1000 строчек, он состоит из _одного_ маленького куска, который не надо "устанавливать на систему", и он при том делает основные операции вполне себе ОК.

Так что код почищу, но прибедняться больше не буду ;))

Date: 2009-11-18 07:08 am (UTC)
From: [identity profile] abreslav.livejournal.com
Аргумент про писателей -- странный. Если у пяти человек получились хоршие программистские блоги, а у всех остальных -- по пять невразумительных потстов, это совершенно не значит, что способность выражать свои мысли растет. Хорошо, если она не падает.

Date: 2009-11-18 11:29 am (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Если человек постоянно пишет, то способность растёт.
Программисты пишут много и вообще люди стали много писать. Кстати, посты про программирование часто получаются похожими на литературные программы - как раз двойной рассказ на формальном и естественном языке о том, как сделать что-то.

Другое дело, что это началось не с блогов, сначала стали писать письма по электронной почте и участвовать в usenet-обсуждениях, потом ещё всякие форумы появились и так далее.
Кнут, очевидно, сравнивает с тем временем, когда он придумывал литературное программирование (первая статья вышла в 1982 году), тогда явно средний программист писал меньше текста.
Хотя недавно я читал интереснейшее обсуждение (http://ivanov-petrov.livejournal.com/1316002.html) о том, что молодёжь разучилась писать и выражать свои мысли. Но это явно не относится к программистам, тем более в других странах.

Date: 2009-11-28 07:27 am (UTC)
From: (Anonymous)
Еще следует упомянуть в Вашей статье о широко применяемой практике использования Sweave для языка статобработки R(S).

Article {Rnews:Leisch:2002}

Author: Leisch, Friedrich
Title: Sweave, part I: mixing R and LaTeX
Journal: R News
Date: 2002
Volume: 2
Number: 3
Pages: 28--31

month: December
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2002-3.pdf

Article {Rnews:Leisch:2003}

Author: Leisch, Friedrich
Title: Sweave, part II: package vignettes
Journal: R News
Date: 2003
Volume: 3
Number: 2
Pages: 21--24

month: October
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2003-2.pdf

Article {Rnews:Betebenner:2005}

Author: Betebenner, Damian
Title: Using control structures with Sweave
Journal: R News
Date: 2005
Volume: 5
Number: 1
Pages: 40--44

month: May
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2005-1.pdf

Article {Rnews:Kuhn:2006}

Author: Kuhn, Max
Title: Sweave and the open document format -- the odfWeave package
Journal: R News
Date: 2006
Volume: 6
Number: 4
Pages: 2--8

month: October
pdf: http://CRAN.R-project.org/doc/Rnews/Rnews_2006-4.pdf

Date: 2009-11-28 12:33 pm (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Спасибо, попробую в одной из следующих частей. К сожалению, я сам R не использую и, хотя и слышал про sweave, не могу про него что-то особенно содержательное написать.

Date: 2009-12-19 09:32 am (UTC)
From: (Anonymous)
когда планируете продолжение?

Date: 2009-12-19 05:41 pm (UTC)
From: [identity profile] anton-nazarov.livejournal.com
Я что-то написал, но закончить сейчас не получается - надо всякие более серьёзные дела заканчивать.
Надеюсь, что через несколько дней.
From: (Anonymous)
[b]Цены на топливо растут! ...Вы еще не экономите на топливе?[/b]

Как экономить 10-30% топлива автомобиля?

Использовать кондиционер для камеры сгорания двигателя!
Вы получаете реальную ЭКОНОМИЮ ТОПЛИВА благодаря более быстрому и эффективному его сгоранию.
Экономия составляет от 7 до 14% бензина или дизельного топлива - гарантировано, а по факту, в среднем 20%. Этот уникальный продукт изготавливается в США, является 100% органическим катализатором топлива, а не обычной химической присадкой, и поэтому абсолютно безопасен для двигателя и человека. Главное что получает водитель - это защита автомобиля от плохого топлива и новое качество езды. Увеличение ресурса двигателя, срока службы катализатора, свечей, форсунок и поршневой системы. Уменьшение вредных выбросов выхлопных газов на 70-90%.

Стоимость продукта на 1 заправку обходится всего ~1-1,2 долл., но сэкономит Вам ~6,5-24 долл. топлива.


Зайдите на презентационный [url=http://economy20.prav.tv][b]сайт[/b][/url] и забронируйте билет на бесплатный Тест-Драйв, чтобы узнать об этом подробнее!
С вопросами обращайтесь сюда - support-eco20(а)ukr.net или в контактные данные на сайте.



ключевые слова
----------------------
автомобили, машины, авто, автомашины, бензин, бережливость бензина, экономия топлива, экономить бензин, экономить топливо, дизель, дизельное топливо, экономить дизель, экономить дизельное топливо, экономить на заправке, экономить быть заправке, сэкономить при заправке, уменьшить выхлоп, уменьшить вредные вещества при выхлопе, уменьшить выхлоп вредных веществ, уменьшить выхлоп CO2, выхлоп CO2, BMW, БМВ, mpg-boost, mpg-caps, ffi, сэкономить для заправке, toyota, nissan, аукционное авто, тойота, нисан ..
From: (Anonymous)
зайдите на наш [URL="http://tehnik.by"]белорусский портал о ИТ[/URL]. У нас вы всегда найдете свежие ИТ новости про мониторы, комплектующие и мобильные телефоны в Беларуси, а также скачать без регистрации бесплатные программы, игры и soft. участвуйте в жизни интернет ресурса, присылайте свои статьи, обзоры - мы их обязательно опубликуем. Участвуйте в опросах и голосованиях , находя лучшее. Если у Вас есть сайт ИТ тематики, то регистрируйте его в нашем каталоге сайтов ИТ тематики. [URL="http://tehnik.by"]бесплатные программы[/URL]

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. 18th, 2025 11:52 pm
Powered by Dreamwidth Studios