Эстетика мышления и литературное программирование

Руслан Богатырев
Записки о кибернетике | Эстетика мышления и литературное программирование

/ Европейский центр программирования им. Леонарда Эйлера, 2023.
/ Руслан Богатырев, 2021.
\ Арт-журнал «Пантеон»: https://panteono.ru/2021-04-01

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

Мы не просто говорим, а мыслим, думаем, рассуждаем на конкретном языке. Чаще всего, на своём родном. Вне зависимости от того, сколько реально других знаем. Родной язык накладывает огромный отпечаток на всё мировосприятие человека. На всю его жизнь.

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

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

В общей сложности их не один десяток и даже не одна сотня. По разным оценкам, общее их число оценивается в 5-10 тысяч. Для сравнения на звёздном небе человек невооружённым глазом в Северном и Южном полушариях в силах увидеть в общей сложности около 6 тысяч звёзд. Ровно те, видимая яркость которых ограничена 7-й/8-й звёздной величиной. Мягко говоря, немало.

Сами языки постоянно меняются, развиваются, эволюционируют. Их системы программирования непрерывно обновляются. Новые версии, новые возможности, новые ограничения, новые проблемы...

А сколько на Земле живых, естественных языков? Практически столько же: по данным авторитетного каталога Ethnologue, на 2020 г. их насчитывается 7117. Т.е. свыше 7 тысяч.

Стоит ли объяснять, что для живого языка, для его письменной формы очень важен алфавит. В широком смысле: если мы сюда относим также идеографическое письмо (понятийные знаки и иероглифы).

Языки программирования, где письменная форма — просто основная, также имеют своё подобие алфавита. У них есть своя грамматика и, разумеется, своя семантика.

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

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

Обратите внимание: если раньше специалисты говорили «исходный текст» (source text, sources), то в последние два десятилетия превалирующим стал «исходный код» (source code).

Попробуем разобраться, почему так произошло и к чему это в принципе ведёт. Не секрет, что исходный текст нередко выполняет роль промежуточного представления, промежуточного кода. Скажем, есть промышленный, проверенный компилятор языка C, и для нового языка достаточно тогда написать транслятор (конвертер, транскомпилятор) с этого языка на C. А дальше проблема уже решена. Всё, как и в математике. Сведение задачи к уже решённой.

Но дело далеко не только в этом: сегодня практически невозможно представить, что некогда программированию в институтах учились у доски с мелом в руке. Потрясающая дисциплина мышления. Это вам не на кнопочки давить. Не глядя, на автомате. Мел надо взять в руку. Мысленно сформулировать предложения на языке программирования и написать их на доске. Аккуратно и разборчиво. Чтобы было понятно всей аудитории. Если что не так — придётся стирать и переписывать.

Чем-то это напоминает работу за пишущей машинкой, но перед взыскательной публикой. Попросите нынешних бравых компьютерных умельцев напечатать под диктовку без ошибки хотя бы пару страниц. На машинке. И всю их беспомощность вы сразу прекрасно увидите. Как на ладони.

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

Люди отдавали себе отчёт в том, что истина и красота идут рука об руку. Но штучное, элитарное постепенно растворяется в массовом, ширпотребном. Это неизбежно. Какая там уже типографика: сегодня даже элементарной вычиткой пренебрегают. До корректоров дело редко где доходит. Клепай и строгай, побольше и побыстрее.

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

«Пустое вы сердечным ты она, обмолвясь, заменила и все счастливые мечты в душе влюблённой возбудила. Пред ней задумчиво стою, свести очей с неё нет силы; и говорю ей: как вы милы! и мыслю: как тебя люблю!»

И то же самое в привычном для поэзии виде:

Пустое вы сердечным ты
Она, обмолвясь, заменила
И все счастливые мечты
В душе влюблённой возбудила.

Пред ней задумчиво стою,
Свести очей с неё нет силы;
И говорю ей: как вы милы!
И мыслю: как тебя люблю!

В контексте программирования первый вариант ближе к исходному коду. Второй — к исходному тексту. Вот и вся разница. Буквы, знаки препинания и слова те же самые. Но картина совсем иная.

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

В своё время Дональд Кнут, лауреат Премии Тьюринга (компьютерная Нобелевка), попытался совершить серьёзный прорыв в этом направлении и в начале 1980-х ввёл понятие literate programming (грамотное/литературное программирование).

«Я верю, — писал Кнут в 1983 г., — что настало время для существенно лучшего документирования программ, и что мы можем достичь этого, рассматривая программы как литературные произведения. Потому так и называю: литературное программирование. Стоит изменить традиционное отношение к построению программ: нашей главной задачей теперь будет не передача компьютеру инструкций того, что именно делать; давайте сосредоточимся на объяснении человеку, что же мы хотим, чтобы этот компьютер сделал… Программиста в литературном программировании можно рассматривать как эссеиста, основная забота которого — изложение и изящество стиля. Такой автор с толковым словарём в руках заботливо выбирает имена переменных и объясняет, что каждая из них означает. Он стремится к программе, которая была бы понятна, потому что используемые в ней концепции направлены на восприятие человеком. Причём формальные и неформальные методы дополняют друг друга».

В той же статье «Literate Programming» Дональд Кнут сослался на мудрое высказывание другого лауреата Премии Тьюринга — англичанина Тони Хоара, которое прозвучало на 10 лет раньше — в 1973 г. Вот, что сказал тогда Хоар на организованном ассоциацией ACM Международном симпозиуме по принципам языков программирования (ACM Symposium on Principles of Programming Languages): «Документирование следует рассматривать как неотъемлемую часть часть процесса проектирования и кодирования. Хороший язык программирования будет поощрять и помогать программисту писать понятные, самодокументированные программы и даже, быть может, разрабатывать и применять изящный стиль письма».

Так почему же столь красивая и революционная идея канула в Лету? Дональд Кнут спустя многие годы признаётся: большинству нет необходимости что-то уже менять. Хорошо пишут литературные эссе немногие. А умение сочетать программирование и литературный стиль — так вообще единицы.

Литературное программирование в трактовке Кнута невольно перекликается с Андреем Петровичем Ершовым и его концепцией «Программирование — вторая грамотность» (1981). В обоих случаях программирование сродни привычной грамоте — умению читать и писать. Извлекать мысли и их формулировать в отчуждаемом виде. В статье 1983 г. Кнут предложил конкретику для реализации данной идеи: систему WEB. Она вполне убедительно доказала свою практичность. И всё же то был лишь первый подобный опыт.

Стало очевидным: программы в своём внешнем представлении должны быть ближе к человеку, нежели к компьютеру. А отображение на машинный код — удел компьютерной трансляции (компиляторов, интерпретаторов). Но если мы осознаём, что читать, проверять (верифицировать) и хотя бы частично интерпретировать программный текст будет в идеале человек, значит, здесь стоит призадуматься над привлечением и всего того интеллектуального инструментария, интеллектуального богатства, которое человечество накопило за минувшие тысячелетия. Речь о науке и искусстве. В широком смысле. А не об одной лишь филологии, к которой сводится идея Дональда Кнута.

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

Си-нотация пришла из американских исследовательских лабораторий AT&T Bell Labs.  Из основы  UNIX — языка Си (C, 1972)  Денниса Ритчи. Точнее даже,  из языка Би (B, 1969) Кена Томпсона и Денниса Ритчи. Это был крен в сторону инженеров-практиков. Тогда как Паскаль-нотация будучи детищем швейцарского профессора Никлауса Вирта (ETH Zurich, 1970) во многом унаследовала графику своего предшественника — Алгола — скорее, европейского языка, созданного на международной научной конференции в ETH Zurich в 1958 г. при активном участии Фридриха Бауэра,  Хайнца Рутисхаузера,  Петера Наура и др. Паскаль ориентировался на научный мир и в этом было его принципиальное отличие от Си.

Технологическая гегемония и экспансия США к концу XX века не только привели к потере компьютерного суверенитета как в Европе, так и в Советском Союзе, но и к полному доминированию Си-нотации в ключевой ментальной сфере программирования — в области языков и компиляторов.

Насколько это важно?

Вспомним, что писал академик Д.С.Лихачев в своих "Тезисах доклада о старой орфографии" (1928): "XVII век, знавший толк в грамоте больше нашего, имел массу графических знаков... Чем больше в языке графических знаков, тем легче он при чтении, так как каждое слово становится характернее, индивидуальнее, приобретает определённую физиономию... Интересы чтения должны возобладать над интересами письма (пишет книгу один, а читают 30000 в подолжении около 50 лет)... Для того чтобы слово стало характернее, важно иметь не только достаточное количество знаков, но чтобы эти знаки сами по себе были характеры. Часть букв должна выступать за строку. Чем больше этих выступающих букв, тем совершеннее алфавит (конечно, до известных пределов). Самым совершенным алфавитом является с этой точки зрения греческий. В нём не только выступает значительный процент букв, но выступает именно вверх от строки, что гораздо важнее, чем вниз. В английском, немецком и французском алфавитах на 100 букв в печатном тексте выступают около 40 букв, в русском же только 16, а без ять и «і» — 11. Причём наверх выступают 7, а вниз 9. Это самый крупный недостаток русской графики, созданной указом Петра Великого. До Петра Великого русская графика приближалась в отношении своего совершенства к греческой".

Чтобы добиваться качественного прорыва, компьютерному программированию, как ни крути, требуется выйти за рамки своих формальных границ. Что же помимо изящной словесности здесь можно предложить? Поверьте, немало… Да хотя бы архитектуру, зодчество. Его законы, каноны и пропорции. Невольно вспоминается знаменитое эссе «Собор и базар» Эрика Реймонда (The Cathedral and the Bazaar, 1997). Хотя там дело ограничилось простой аналогией.

Литературное программирование Кнута так или иначе перекликается и с ментальным программированием — созданием и исполнением самим человеком самых разных программ. Программ в самом широком смысле. Далеко не все из которых могут быть «вербализированы» компьютером.

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

В 2005 г., когда швейцарский профессор Юрг Гуткнехт из ETH Zurich, ученик и сподвижник тьюринговского лауреата Никлауса Вирта, приезжал в Россию в рамках Большого турне, мы с ним в погожий осенний день гуляли по Московскому Кремлю. Осматривали великолепные достопримечательности. Нашу русскую античность, уходящую в глубь веков. Помнится, тогда ему сказал: «Юрг, подумай, как было бы замечательно, если бы и у компьютерных наук была своя Оружейная палата, свой Алмазный фонд. Свои сокровища. Был бы свой потрясающе красивый музей, музей алгоритмов, где каждый экспонат — драгоценность вечности — миниатюрная программа с изящным бессмертным алгоритмом на каком-нибудь позабытом языке программирования».

И знаете, как он отреагировал? Он ответил мне просто: «Да, об этом можно только мечтать!»


• Соджетто о соджетто: http://proza.ru/2020/09/27/1704
• Соджетто. С двустволкой в светлое будущее: http://proza.ru/2020/09/29/1615
• Соджетто. Как полагаться на доверие. В науке и в жизни: http://proza.ru/2021/03/30/1565
• Соджетто. Геронтология софта. И программы тоже стареют: http://proza.ru/2021/03/31/1114