Свежий номер №10 (387) / В плену у совершенства
 
Дата публикации: 12.03.2001

Игорь Гордиенко, gordi@computerra.ru

 
<< Врезка 1: Дональд Э. Кнут. Искусство программирования. Пер. с англ. - М.: Издательский дом «Вильямс», 2000

Страница 3
Врезка 2: WEB-мастер

WEB-мастер

Должен признаться, что выбор названия отчасти злонамерен. В семидесятые я, как и все, был насильно вовлечен в реализацию идей структурного программирования, поскольку не мог вынести обвинения в неструктурированности своих программ. Теперь у меня есть возможность поквитаться. Вводя термин «грамотное программирование», я возлагаю на всякого, кто его слышит, моральное обязательство. Никто ведь не захочет признать, что пишет неграмотные программы.
Дональд Э. Кнут  [1]

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

  • Во-первых, «нормальный» код гораздо чаще читается людьми, чем компилятором.

  • Во-вторых, «нормальный» программист читает гораздо больше кода, чем пишет.

  • В-третьих, очень небольшая часть производимого всеми программистами кода превращается в «устройства» (регулярно используемый исполняемый код).

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

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

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

В своей ранней статье «Грамотное программирование» («Literate Programming» можно перевести и как «просвещенное программирование») Кнут предлагает изменить основную парадигму: «Вместо того, чтобы полагать своей главной задачей инструктирование компьютера, давайте сконцентрируемся на объяснении того, чего мы хотим от компьютера, человеку»  [1].

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

WEB 1 - это, по сути, метаязык, строящийся на основе двух формальных языков: языка программирования и языка разметки текста. Первоначально Кнут использовал Паскаль и TеX, соответственно, но заложил подход достаточно общий, чтобы впоследствии круг поддерживаемых языков программирования расширился (сегодня он включает C, C++, Java, Lisp, ML и др.).

Из используемых систем на базе WEB (их число перевалило за дюжину) наибольшее распространение получила, видимо, CWEB, разрабатываемая Кнутом и Сильвио Леви с 1987 года  [4]; CWEB адаптирована к использованию C в качестве языка программирования. На сайте  [3] можно найти примеры использования других языков программирования и эксперименты с другими языками разметки. В этой главке я использую CWEB как пример WEB-системы.

CWEB предполагает, что программист структурирует свою работу, разбивая ее на «секции» (которым могут соответствовать «модули», «подпрограммы/функции» или просто фрагменты кода; Кнут и Сильвио рекомендуют ограничиться «дюжиной строчек»  [4]), причем каждая секция состоит из трех частей:

  1. TеX-часть, содержащую разработческую документацию: разъяснение содержимого секции,

  2. промежуточную часть, содержащую специфические для секции макроопределения, и

  3. C-часть, содержащую собственно код.

Далее предполагается, что все изменения, которые вносятся в программу, производятся на уровне CWEB-файлов - «метаисходников» в своем роде. CWEB-файл подвергается двоякой обработке:

  1. программа CTANGLE генерирует из него C-файл, подвергающийся затем трансляции (причем он снабжается директивами препроцессора, потребными для того, чтобы отладчик и другие штатные инструменты программиста отсылали его к CWEB-«метаисходнику», а не к тексту на C);

  2. программа CWEAVE создает TеX-файл, содержащий код секции (оформленный в соответствии с традиционными типографскими соглашениями о публикации исходных текстов) и пояснения к нему. Новейшая версия (3.61) допускает «отливку» также в формат PDF с гиперссылками. Вполне логично разработчики назвали возможность создания гипертекстовой документации «гипердокументацией».

Таким образом поддерживается синхронность нелинейного (состоящего из «переплетающихся», как паутина (web), кусков) кода и разработческой документации. Будучи использованной, WEB-система навязывает программисту элементы грамотности по Кнуту - концентрацию на экспозиции материала и стиле (что, разумеется, не гарантирует адекватность этого стиля), начиная от декомпозиции программ на секции и кончая такими вещами, как выбор адекватных имен и использование понятных конструкций.

WEB и Web: код как публичный контент

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

Эти соображения, а также недавно введенная в инструментарий упомянутая идея «гипердокументации» (как с перекрестными ссылками, так и ссылками на код) позволяют взглянуть на идеи грамотного программирования в несколько ином аспекте: исходный код становится просто одним из видов публичного контента, доступного посредством совокупности соглашений и их реализаций, известных как WWW. И оказывается, что WEB-мастер Кнут намного опередил время, еще в середине восьмидесятых введя идею - говоря языком гипермедиа - множественного рендеринга контента - ныне лежащего в ядре развития Web, - я имею в виду X(HT)ML.

Построение исполняемого кода (или интерпретация кода) становится одним из типов рендеринга. И, может быть, не менее важно то, что развитые браузеры и редакторы гипермедиа потенциально способны стать средством, гораздо более приспособленным для чтения и написания кода программистами «безбумажной» эпохи, чем ориентированные в основном на бумагу TеX и LaTеX.

Максим Отставнов
[maksim@otstavnov.com]


1 (обратно к тексту) - Его существование - одна из причин, по которым программисты предпочитают труднопроизносимое «triple-double-U (WWW)» попсовому «Web» (читающемуся так же, как «WEB»). «WEB» изначально обозначало «паутину», в то время, как «Web» в «WorldWide Web» на студенческом сленге - Webster’s (равно как и любой другой объемный словарь или справочник).

Источники

[1] (обратно к тексту) - Donald E. Knuth. Literate Programming // The Computer Journal, 27(2):97{111, May 1984. - Ранняя статья, компактно излагающая концепцию грамотного программирования.

[2] (обратно к тексту) - Donald E. Knuth. Literate Programming (CSLI Lecture Notes, No. 27). - Stanford: Center for the Study of Language and Information, 1992, ISBN 0-937073-80-6. - Книга, пространно излагающая концепцию грамотного программирования.

[3] (обратно к тексту) - www.literateprogramming.com - Центр «тусовки» приверженцев идеи грамотного программирования. Содержит массу ссылок на инструментарий, документацию, публикации, другие сайты, посвященные тому же предмету. Несмотря на «замерзший» список обновлений, актуальные обновления достаточно часты.

[4] (обратно к тексту) - Дональд Э. Кнут, Сильвио Леви. «Система структурного документирования CWEB» (пер. с англ. Сергея Коропа), 36 с. - Очень хороший перевод Руководства пользователя CWEB.



 
<< Врезка 1: Дональд Э. Кнут. Искусство программирования. Пер. с англ. - М.: Издательский дом «Вильямс», 2000

Страница 3
Врезка 2: WEB-мастер


Игорь Гордиенко
gordi@computerra.ru
 


<< Ирина Маховая: «…Было обидно наблюдать общий упадок»
Все материалы номера
Структура подвига >>