?

Log in

No account? Create an account

Previous Entry | Next Entry

О подражании Кнуту

Один из распространенных сюжетов в фантастике - это землянин за штурвалом корабля пришельцев. Или наоборот - пришелец за штурвалом корабля землян. Решался он по-разному: от космической оперы ("Джон слегка нажал на педаль, и мощный корабль послушно лег на курс к далекой Земле") до юмористических вещей (масса примеров есть у Шекли, Пола Андерсона и других классиков "золотого века"). Гораздо меньше фантастов задумывалось над тем, что система управления - это отражение нашего мозга, нашей биологии, физиологии, нашей истории. Чужая машина нам будет прежде всего непонятна. Даже если мы сможем как-то заставить её слушаться наших приказов, это будет сопряжено с ежеминутным насилием над собственным мыслительным аппаратом. Нам нужно будет заставлять себя думать как какой-нибудь марсианский богомол.

Но зачем обращаться к фантастике? Разница между людьми тоже немала. В особенности когда речь идёт об "обычных людях" и гениях; я иногда подозреваю, что гении думают не просто лучше нас - а по-другому. Есть тонкая грань между талантом и гением. Талант - это "как мы, только лучше", а гений - это совсем другое, это иное существо. Было бы очень интересно понять, как отличается мое мышление от мышления другого (тем более - гения!) - хоть одним глазом подсмотреть. Но тут есть большая проблема. Дело в том, что каждый человек значительную часть творческих усилий тратит на то, чтобы сделать свою работу понятной для других. По сути убрать особенности своего мышления, привести всё к общему знаменателю. Это очевидно, когда речь идёт об искусстве, о литературе, о преподавании - но это верно и для любой другой творческой деятельности. Когда человек занимается наукой, он пишет статью - то есть "переводит" свои мысли с внутреннего языка на "общечеловеческий". Хороший пример тут - Ньютон, который получал свои результаты при помощи созданного (частично) им же анализа, но излагал их на языке синтетической греческой математики. Это иногда объясняют тем, что Ньютон "не доверял" новым методам. Я позволю себе не поверить в такое объяснение: прекрасно он им доверял - но ему приходилось подлаживаться под стиль мышления аудитории. Позже эти способы стали общим достоянием - но потребовалось несколько веков усилий преподавателей и методистов, чтобы стало возможным излагать их обычным людям. Мы по сути овладели парой правил "грамматики Ньютона" - ценой огромных усилий. Но это, скорее всего, только малая часть того, что понимал Ньютон. Я прошу прощения за избитую ещё в прошлом веке фразу, но наука - это не взаимодействие объекта исследования и его субъекта, это взаимодействие объекта, субъекта и третьего - студента, ученика, читателя. Как и литература, искусство. И поэтому заглянуть в мозг автора сложно: он показывает не то, что он думает, а то, что он хочет показать.

На первый взгляд кажется, что с компьютерным программированием иначе. Программирование - это ведь взаимодействие человека с машиной, так? Но на самом деле программисты уже очень давно пишут в основном для других программистов. Собственно, технологии программирования направлены на облегчение понимания программ людьми. Это - целевая аудитория программиста; а то, что машины тоже понимают эти тексты - эффект, скорее, побочный. Так что из из программ мы не поймём, как "на самом деле" думает программист.

У меня очень давно зреет мысль, что TeX - одно из исключений из этого правила. Дональд Кнут - один из последних великих программистов героического периода. В те времена писали "для машины", оптимизируя код (см. знаменитую "Историю Мела, настоящего программиста"). Кнут поначалу с подозрением отнесся к идее Дейкстры о структурном программировании. Позже он занялся проблемой понимания кода человеком и предложил своё решение: literate programming. Это очень интересная идея; как-нибудь я напишу о том, почему она не получила большого распространения. И самое главное - Кнут, на мой взгляд, ЗА той гранью, которая отделяет талант от гения.

Статьи Кнута о ранней истории TeXа несколько противоречивы. С одной стороны, он подчеркивает, что изначально писал TeX для себя, точнее, для набора одной книги (The Art of Computer Programming), и что его не перестаёт удивлять, что так много людей использует его программы. С другой - программа написана в стиле literate programming (собственно, TeX и Metafont - это два наиболее характерных примера lp), то есть он заботился о том, чтобы программа была понятна другим?

Моя гипотеза состоит в том, что изначально TeX предназначался для "внутреннего пользования". Ещё в то время, когда Кнут полагал, что ему хватит одного sabbatical, чтобы написать систему. Но потом, когда этот проект занял на порядок больше усилий, а масса людей заинтересовалась, Кнут переориентировал его на систему общего назначения. Это иллюстрирует история перехода к TeX3, когда Кнута убедили добавить серьёзную интернационализацию к системе.

Если это так, то дизайн TeXа отражает способ мышления Кнута более точно, чем другие его вещи. И боже мой, насколько этот дизайн не похож на "нормальное человеческое" мышление!

Оговорюсь, что следует различать две вещи: интерфейс TeXа для авторов (математик, пишущий статью в TeXе) и интерфейс для TeXников (программист, создающий стиль верстки для журнала). Первый довольно естественен. Хотя мне больше нравится LaTeXовский стиль в тех местах, где он отличается от TeXовского: почему-то \frac{a}{b} мне кажется понятнее, чем {a \over b}. Но второй - это совсем другое дело. Некоторые думают, что всё дело в том, что Кнут выбрал расширяемый макроязык. Возможно, это и правда. Но есть разные макроязыки. Я программировал в maximе и lispе - нельзя сказать, чтобы это было просто, но это неизмеримо яснее, чем TeX - и это при том, что я очень неплохо знаю TeX. Чисто программистские примитивы в TeXе поражают. Почему автор выбрал эти \futurelet, \afterassignment и т.д.? С другой стороны, почему цикл - не примитив, а вовсе макро (кстати, слегка по-разному определенный в plain и в LaTeXе)? И совсем безумная идея поиска закрывающего \fi - см. раздел 13.8.4 в книге Victor Eijkhout, Tex by Topic. Я позволю себе привести цитату из этой книги:

TeX's matching of \if, \else, and \fi is easily upset. For instance, the TеXbook warns you that you should not say

\let\ifabc=\iftrue
inside a conditional, because if this text is skipped TеX sees at least one \if to be matched.

The reason for this is that when TеX is skipping it recognizes all \if..., \or, \else, and \fi tokens, and everything that has been declared a synonym of such a token by \let. In \let\ifabc=\iftrue TеX will therefore at least see the \iftrue as the opening of a conditional, and, if the current meaning of \ifabc was for instance \iffalse, it will also be considered as the opening of a conditional statement.

As another example, if

\csname if\sometest\endcsname \someaction \fi
is skipped as part of conditional text, the \fi will unintentionally close the outer conditional. It does not help to enclose such potentially dangerous constructs inside a group, because grouping is independent of conditional structure. Burying such commands inside macros is the safest approach.

В результате вот как выглядит программа, делающая "лексикографическое сравнение" двух строк (из той же книжки):
\let\ex=\expandafter
\def\ifbefore
   #1#2{\ifallchars#1$\are#2$\before}
\def\ifallchars#1#2\are#3#4\before
   {\if#1$\say{true\ex}\else
      \if#3$\say{false\ex\ex\ex}\else
         \ifnum#1>#3 \say{false%
             \ex\ex\ex\ex\ex\ex\ex}\else
              \ifnum#1<#3 \say{true%
                  \ex\ex\ex\ex\ex\ex\ex
                   \ex\ex\ex\ex\ex\ex\ex\ex}\else
               \ifrest#2\before#4\fi\fi\fi\fi}
\def\ifrest#1\before#2\fi\fi\fi\fi
    {\fi\fi\fi\fi
         \ifallchars#1\are#2\before}
\def\say#1{\csname if#1\endcsname}
Человек, для которого такое естественно, определенно мыслит иначе, чем мы. И это НЕ особенно патологический образчик; посмотрите на продвинутые пакеты на CTAN! Собственно, совершенно неудивительно, что эти пакеты часто написаны в стиле, близком к literate programming (единственное известное мне массовое применение этого метода - а по-другому писать их будет совсем непонятно!)

Мне приходилось писать программы (не тексты, а именно программы!) на TeXе. И всякий раз начиная это делать после долгого перерыва, ощущаешь всю неестественность этого занятия. Как сесть за штурвал звездолета пришельцев с Альфы Водолея. Потом начинаешь работать быстрее: мозг переходит на другие рельсы. В какой-то момент вдруг TeXовские хаки кажутся самоочевидными. Естественными. Хочется думать, что в этот момент ты видишь что-то, что видит Кнут. Но у меня это состояние редко, и его надо вызывать специальными методами. Если моя гипотеза верна, то Кнут в таком находится если не всегда, то часто. Это его образ мышления.

Comments

( 45 comments — Leave a comment )
gateya
May. 29th, 2007 09:48 pm (UTC)
очень интересная мысль. Хочется подыскать аналогичные примеры в других областях деятельности.
kvasy_pingvin
May. 29th, 2007 09:54 pm (UTC)
Спасибо за пост
Чистая радость такая.
"понять, как отличается мое мышление от мышления другого " - это мечта моя давняя.
scholar_vit
May. 29th, 2007 10:37 pm (UTC)
Re: Спасибо за пост
Спасибо
rssh
May. 29th, 2007 09:59 pm (UTC)
Время
Не отрицая всего написанного, но принимания во внимание: тут еще фактор времени. Программистких стереотипов, определяющих какие концепции общеприняты (и кажуться нам естественными) -- еще не было. Из тех времен Фортран, где условным переход по трем веткам (<,>,=) показался Бекусу более естественным, чем по двум. Передача значения по имени в Алголе 68. APL со специальной клавиатурой (следующее выражение в скобках печатает все простые числа от одного до R: [(∼R∈R∘.×R)/R←1↓⍳R])
А общепринятые концепции сформировались почти случайно, и повернись история каким-то другим боком -- они нам сейчас казались бы тоже дикими.
vchashu
May. 29th, 2007 10:31 pm (UTC)
Re: Время
Так и есть. Кнут не учился программированию на университетских курсах, а придумывал его сам. Такими же странными выглядят все самоучки, например Рамануджан в математике. Героическая эпоха---это когда все вокруг самоучки. После того как университеты сформируют мейнстрим самоучку заклюют путь он будет десять раз Кнут.
Re: Время - scholar_vit - May. 29th, 2007 10:41 pm (UTC) - Expand
Re: Время - scholar_vit - May. 29th, 2007 10:41 pm (UTC) - Expand
Re: Время - rssh - May. 29th, 2007 11:00 pm (UTC) - Expand
Re: Время - slobin - May. 30th, 2007 03:39 am (UTC) - Expand
spamsink
May. 29th, 2007 11:02 pm (UTC)
Глядя на тексты разных программ-победителей Obfuscated C Contest, ощущаешь разницу в образах мышления как нельзя лучше.
scholar_vit
May. 29th, 2007 11:31 pm (UTC)
David Kastrup сказал: There is an annual obfuscated C programming contest. The same would be rather pointless for TeX: every nontrivial task has only obfuscated solutions, anyway.

Впрочем, бывает и obfuscated TeX code. Вот это написал David Carlisle:

\let~\catcode~`76~`A13~`F1~`j00~`P2jdefA71F~`7113jdefPALLF
PA''FwPA;;FPAZZFLaLPA//71F71iPAHHFLPAzzFenPASSFthP;A$$FevP
A@@FfPARR717273F737271P;ADDFRgniPAWW71FPATTFvePA**FstRsamP
AGGFRruoPAqq71.72.F717271PAYY7172F727171PA??Fi*LmPA&&71jfi
Fjfi71PAVVFjbigskipRPWGAUU71727374 75,76Fjpar71727375Djifx
:76jelse&U76jfiPLAKK7172F71l7271PAXX71FVLnOSeL71SLRyadR@oL
RrhC?yLRurtKFeLPFovPgaTLtReRomL;PABB71 72,73:Fjif.73.jelse
B73:jfiXF71PU71 72,73:PWs;AMM71F71diPAJJFRdriPAQQFRsreLPAI
I71Fo71dPA!!FRgiePBt'el@ lTLqdrYmu.Q.,Ke;vz vzLqpip.Q.,tz;
;Lql.IrsZ.eap,qn.i. i.eLlMaesLdRcna,;!;h htLqm.MRasZ.ilk,%
s$;z zLqs'.ansZ.Ymi,/sx ;LYegseZRyal,@i;@ TLRlogdLrDsW,@;G
LcYlaDLbJsW,SWXJW ree @rzchLhzsW,;WERcesInW qt.'oL.Rtrul;e
doTsW,Wk;Rri@stW aHAHHFndZPpqar.tridgeLinZpe.LtYer.W,:jbye

Попробуйте догадайтесь, что этот код делает (plain TeX)
(no subject) - spamsink - May. 30th, 2007 12:01 am (UTC) - Expand
(no subject) - kdv2005 - May. 30th, 2007 01:50 am (UTC) - Expand
(no subject) - youngracoon - May. 30th, 2007 06:19 am (UTC) - Expand
likeabur
May. 29th, 2007 11:07 pm (UTC)
Вам не кажется, что это обычный эффект разницы между профессиональным и дилетантским мышлением? Я о цепочке решений в развитии ТеХа. В смысле, тут очевидная разница между информатикой и программированием, которая в ту эпоху лишь закладывалась. Кнут занимался информатикой, а обнаружилось программирование, т.е. как раз написание для других. Обнаружилось, что когда проект большой, возникает новое содержание. Но Кнуту можно гордиться, ибо его проект оказался успешным, несмотря на то что растянулся на годы (сейчас считается что время успешного проекта исчисляется месяцами).

Продолжая про дилетантов. Ситуация делали-делали-ой-йопть-что-же-получилось возникает сплошь и рядом, достаточно рассмотреть управленческие решения. От управления IT-проектами (включая преподавание программирования, до сих пор базирующееся на героизме) до административно-бюрократических. По извилистому пути панического исправления ошибок исходного проекта (тоже писанного из зауженного опыта, очень для себя) часто нетрудно представить себе стиль мышления участников. Конечно, ТеХ и программирование в частности - замечательный пример почти прямой доставки смысла в голову, но и в ситуации живого языка восстановить цепочку рассуждений иногда возможно.

По поводу марсианскости TeXа --- +1. Но вот вы поражаетесь стилю программирования пакетов к ТеХу, а я скорее удивляюсь силе авторитета и готовности пойти за марсианином. Ведь из достаточно простых примеров ТеХовского кода лезут ушки ООП (я тоже писал и пишу под ТеХ, увы), но где ж волна "а давайте наведем порядок". Скорее идет волна "как здорово, а давайте секретаршу научим"... И наступают люди на те же самые грабли по 33 раза за день, как лемминги. Ведь текущая архитектура (оставим в сторону марсианскость) вынуждает каждого автора текстов чуть-чуть становиться программистом и даже не всякий профессор математики готов продемонстрировать опыт понимания марсианина, куда там секретаршам. Избежать этого можно в подавляющем числе случаев простой сменой архитектуры. И попытки разговора "а давайте переделаем" приводят лишь к замыканию обсуждения по кругу. Что лишь подчеркивает разницу в мышлении и узость круга пользователей: математики не знают программирования (которое не информатика), программисты почти никогда не сталкивались с ТеХом.
scholar_vit
May. 29th, 2007 11:41 pm (UTC)
Было несколько попыток переписать TeX "с нуля" - в том числе и на ООП. Посмотрите, например, вот тут http://www.tug.org/teTeX/tetex-texmfdist/doc/help/faq/uktug-faq/FAQ-NTS.html

Это очень сложно. TeX - это одна из самых сложных программ в мире. Её очень трудно изменить. И "сила авторитета" тут не при чём: о недостатках TeXа для программирования все прекрасно знают. Почитайте, например, вот тут: http://www.tug.org/interviews/interview-files/david-kastrup.html. Учтите, что интервьюируемый - один из самых уважаемых TeXпертов на сегодняшний день.
(no subject) - likeabur - May. 30th, 2007 12:54 am (UTC) - Expand
(no subject) - scholar_vit - May. 30th, 2007 02:17 am (UTC) - Expand
(no subject) - likeabur - May. 30th, 2007 03:16 am (UTC) - Expand
(no subject) - scholar_vit - May. 30th, 2007 05:28 am (UTC) - Expand
(no subject) - likeabur - May. 30th, 2007 10:27 am (UTC) - Expand
(no subject) - __const__ - May. 30th, 2007 06:43 am (UTC) - Expand
(no subject) - likeabur - May. 30th, 2007 10:22 am (UTC) - Expand
(no subject) - __const__ - May. 30th, 2007 10:38 am (UTC) - Expand
(no subject) - likeabur - May. 30th, 2007 10:55 am (UTC) - Expand
(no subject) - __const__ - May. 30th, 2007 11:08 am (UTC) - Expand
(no subject) - likeabur - May. 30th, 2007 03:31 pm (UTC) - Expand
(no subject) - __const__ - May. 31st, 2007 05:30 am (UTC) - Expand
(no subject) - scholar_vit - May. 30th, 2007 03:54 pm (UTC) - Expand
(no subject) - scholar_vit - May. 30th, 2007 04:10 pm (UTC) - Expand
(no subject) - scholar_vit - May. 30th, 2007 03:37 pm (UTC) - Expand
(no subject) - scholar_vit - May. 30th, 2007 03:35 pm (UTC) - Expand
(no subject) - likeabur - May. 30th, 2007 04:34 pm (UTC) - Expand
(no subject) - scholar_vit - May. 30th, 2007 08:47 pm (UTC) - Expand
(no subject) - vitus_wagner - May. 30th, 2007 02:28 am (UTC) - Expand
(no subject) - likeabur - May. 30th, 2007 03:09 am (UTC) - Expand
(no subject) - vitus_wagner - May. 30th, 2007 03:37 am (UTC) - Expand
(no subject) - mkevac - May. 30th, 2007 03:37 am (UTC) - Expand
singalen
May. 30th, 2007 07:58 am (UTC)
Известно, что внимание человека может удерживать от 5 до 9 объектов, чаще 7.
Весь дизайн, вся структуризация программ — структурное программирование, ООП, ФП, application frameworks — направлены именно на преодоление этого барьера. На то, чтобы одновременно человек работал (программист читал/писал код) с участием только 5-7 объектов на каждом уровне абстракции.
Допускаю, что Кнуту это не нужно.
У Вернера Винжда в "Глубине в небе" программисты, которым искусственно "сфокусировали" мозг исключительно на работе, писали программы, нечитабельные для нормального человека. Думаю, именно потому, что не заботились инкапсуляцией, low-coupling-high-cohencion и т.п., а стремились прямо у функциональности. Или у них предел восприятия стоял не на 7 объектах, а на 700.
v782
May. 30th, 2007 09:25 am (UTC)
После того, как я сделал на техе пару довольно сложных систем, у меня сложилось ощущение, что Кнут типа для себя доказал теорему, что на этом языке можно теоретически задать все, что угодно, не важно через какую задницу :), на том и остановился. Великий человек, несомненно.
ltwood
May. 31st, 2007 12:38 pm (UTC)
Меня всегда интересовало, знал ли Кнут про tron/troff, когда начинал писать TeX. Ведь в каком-то смысле подход tron/troff'а ближе к современному программированию, особенно в том смысле, что сложные задачи верстки там часто преднамеренно упрощают, чтобы с минимальными усилиями получить достаточно хороший результат, а не идеальный как у Кнута.
faceted_jacinth
Jun. 9th, 2007 03:02 pm (UTC)
Ой, так ведь ТеХ -- это же форт! Это действительно другой стиль мышления, но не уникальный Кнутовский, довольно много других людей вокруг думают о программировании в том же стиле, причём я бы не сказал, что он требует какой-то особой гениальности (или, наоборот, даёт средства для её воплощения). Просто другой немножко. Я писал про Форт когда-то, он забавный.

Та же проблема с ифами, если я её правильно понял, объясняется совершенно просто и имеет отчётливые технические причины. Когда интерпретатор встречает слово \if, он на самом деле передаёт управление на кусок кода, описанный в определении слова \if, который читает с входного потока условие, исполняет его, а дальше в зависимости от результата исполняет или пропускает все последующие слова до появления слова \fi. Сам интерпретатор ничего о семантике слова \if не знает. Такой подход позволяет очень быстро и просто оную семантику добавить, но значительно усложняет код \if-а, если хочется корректно парсить вложенные ифы и другие семантические конструкции, так что Кнут, по всей видимости, посчитал, что оно того не стоит. К тому же, не знаю как в ТеХе, а в форте ещё одна проблема появляется: ифоподобные конструкции должны работать по разному в состоянии интерпретации и компиляции (определении нового макроса, то есть), так что сложность добавления нетривиального поведения удваивается.

Тем не менее, если понимать принцип работы всей этой системы, то ничего удивительного в таких вот забавных особенностях нет, в некотором смысле они как раз естественны, в отличие от более сложного поведения.
(Anonymous)
Jun. 10th, 2007 06:08 am (UTC)
Ну да, насчет \ifов все верно: это особенность имплементации: встретив \if, читаем текст до ближайшего \fi или \else. В цитированной книжке TeX by Topic это очень подробно описано. Характерно, что в кнутовской The TeXbook это описано менее подробно: для автора это естественно, так что и писать особенно нечего. Кнут - один из великих ассемблерных программистов героического периода, и в TeXе это видно. Но то, что выбрано именно это, характерно. И примитивы вроде \futurelet, \afterassignment, \aftergroup - это тоже впечатляет.
anonym_mouse
Apr. 29th, 2008 06:08 pm (UTC)
Knuth - роман "Приключение"
Хороший пост, и, к счастью, не политический.
Я на него наткнулся потому что тема Кнута на днях пролетела по всему ЖЖ - кто-то где-то выволок интервью, и понеслось.

Один интересный комментарий к "понять как он думает" - рассмотреть идею "литературного программирования"
http://community.livejournal.com/ru_perl/249441.html

.. а потом прочитать литературный труд Кнута, "Приключение" ("Adventure") - вы удивитесь, но это действительно рассказ, и он действительно описывает приключения:
www.literateprogramming.com/adventure.pdf

Не поленитесь пролистать хотя бы пару страниц ;))
scholar_vit
Apr. 29th, 2008 10:39 pm (UTC)
Re: Knuth - роман "Приключение"
Спасибо
( 45 comments — Leave a comment )

Profile

knot
scholar_vit
scholar_vit

Latest Month

November 2017
S M T W T F S
   1234
567891011
12131415161718
19202122232425
2627282930  

Tags

Powered by LiveJournal.com
Designed by Paulina Bozek