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

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

/ Европейский центр программирования им. Леонарда Эйлера, 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. Она вполне убедительно доказала свою практичность. И всё же то был лишь первый подобный опыт.

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

Чтобы добиваться качественного прорыва, компьютерному программированию, как ни крути, требуется выйти за рамки своих формальных границ. Что же помимо изящной словесности здесь можно предложить? Поверьте, немало… Да хотя бы архитектуру, зодчество. Его законы, каноны и пропорции. Невольно вспоминается знаменитое эссе «Собор и базар» Эрика Реймонда (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


Рецензии