[Перевод] Дональд Кнут: про ассемблер, транслятор и грамотное программирование
«Давайте изменим традиционные приоритеты в создании программ: вместо представления о нашей задаче как о создании инструкций «Что делать?» для компьютера сконцентрируемся на объяснении другим людям описаний нашего видения того, что под управлением программы должен делать компьютер.»
Literate programming (66/97)
Тем временем, я также определился с точной версией TeX и самой концепцией грамотного программирования. Позвольте мне немного вернуться назад к истории об утилите «спутывания» и «сплетения» (Weave and Tangle). Вообще, я думаю, что наибольшей пользой от занятия печатным делом была идея создания того, что зовется «грамотным программированием».
Мне нравится учить. Я не просто обучаю компьютер, я учу читателей моих программ. Надеюсь, что однажды будут присуждать Пулитцеровскую премию за самую грамотную программу и т.д.
Я начал этот эксперимент, потому что один мой друг, Профессор Хоар из Оксфорда, сказал: «Дон, люди даже не читают компьютерные программы».
Издательство Оксфордского Университета было заинтересовано в публикации некоторых компьютерных программ, в качестве примеров как правильно они должны быть написаны.
И вместо каких-то скрытых файлов, которые люди должны еще и прочитать, это была бы в своем роде литература, как, например, музыкальная нотация. Люди же публикуют партитуры симфоний, а не просто слушают их. Так почему мы не можем опубликовать компьютерные программы? И его идея засела у меня в голове, но в то же время она пугала меня, ведь настоящие уже созданные компьютерные программы полны компрометаций. Профессор компьютерных наук не мог допустить этого.
Можно написать маленькую программу и сравнить ее с маленькими драгоценными камнями, но когда речь идет о большой программе, то мы, конечно, можем притвориться, что это драгоценность, но это бы не было таковым. И я не думаю, что многие создатели программ были бы рады тому, что другие люди прочитают их работы в том виде, в котором это было доступно тогда. И я начал думать, как бы написать программу так, чтобы и людям нравилось читать ее.
Так, очевидно, и появилась эта идея грамотного программирования, я нашел формат, в котором мог бы представить программу другим людям, более того, я как создатель этой программы, мог понять ее лучше. И так я дошел до этой системы, в которой мог написать программу на этом языке программирования, затем из этой одной программы я создал еще две — одна конвертировалась из языка описания веб-сервисов Паскаль, а другая — из языка описания веб-сервисов в документ, который я мог прочитать благодаря верстке, перекрестным ссылкам и понятным изложениям.
Эта система очень обрадовала меня. Я писал программы в CWEB — это «потомок» оригинальной веб-системы, и это доставляет мне нескончаемое счастье писать программы в таком виде, который я нахожу наиболее подходящим.
Donald E. Knuth: Literate Programming
Learning about Symbolic Optimum Assembly programs (23/97)
Я с семьей ездил в летний лагерь «Линвуд» на неделю, который расположен на берегу озера Эри. И мы снова были там пару лет назад, чтобы освежить воспоминания. Итак, провели две недели на берегу озера. Я играл в теннис со своими дядями и все в таком духе, но я также взял с собой несколько примеров компьютерных программ, о которых я был наслышан. И у меня было немного свободного времени тем летом, чтобы ознакомиться с ними. И, на самом деле, эти программы оказали огромное влияние на мою будущую жизнь.
Одна из программ называлась ассемблер — она позволяла писать программы, используя не машинный язык, а более символический. Это многое упрощало… Я имею ввиду, что, когда я начал писать программы, я все писал в цифрах, и если мне надо было добавить цифру в участок 1 к цифре, расположенной в участке 2, то я должен был записать что-то в роде 20,0,0,1. Мне приходилось выписывать все эти цифры, вбивать их в карты, и только потом использовать в работе — это все, что я знал о программировании на тот момент.
Но та программа была новшеством для того времени, и она позволяла писать программы более простым методом. Вместо того, чтобы выбирать число для каждого участка в программе, я мог дать ему название, и аппарат уже сам определял какое число соотносится с этим названием. Но в те времена, компьютеры не могли хорошо справляться с буквами, они были рассчитаны на работу с цифрами, но можно было использовать заглавные буквы. С этим ассемблером можно было применять до пяти букв на одно слово.
Я точно помню, как я использовал это для своей программы «крестики-нолики», и мне пришлось придумывать, какое слово из пяти букв будет определять определенный участок программы. И я вспоминаю с восторгом, как я играл в крестики-нолики, и как в момент выигрыша программа переходила на участок БИНГО. Я использовал это слово из пяти букв Б, И, Н, Г, О для этого участка программы.
Да, я тогда узнал об ассемблере и научился кодировать. Я использовал это в работе, но в то же время я задавался вопросом: «Как это работает? Что вообще происходило внутри, и как соотносилось слово БИНГО с цифрой? Как аппарат сразу это понимал?» У меня был листинг для этой программы под названием SOAP 2 от Стэна Поли из IBM. я собой у меня также был листинг программы под названием «Транслятор» (IT-Internal Translator) — это новая программа, которая была создана 4 людьми в Карнеги, Университет Карнеги-Меллон. Этот транслятор использовал алгебраический язык, а не машинный. И это задолго до того, как появился Фортран или другие языки программирования высокого уровня. Я же говорю о 1956,1957 годах.
И суть была такова, что вы можете написать X=A+B, ну, на самом деле так нельзя было написать, ведь не было возможности использовать символ »+», так что мы писали, X1, Z, X2, S, X3, где S обозначало »+», и буква Z использовалась вместо »=», а каждая переменная как Х1, Х2, Х3 или чем-то похожим. Но теме не менее, вы могли ввести алгебраическую формулу в карту, и потом аппарат уже определял из этого, как вычислить A+B или что вам нужно сделать.
Вместо того, чтобы обозначать цифрами или символами, там были алгебраические символы. И можно было просто перевести программу на компьютер, и тут же загорались огоньки, и спустя некоторое время вы получали аппарат с компьютерным языком программирования. Магия. Я не мог понять, как это вообще работает, так что я достал копию программы, которую они использовали для написания этого транслятора, и у меня появилась копия программы SOAP
The Internal Translator (24/97)
Я принес это с собой, и провел ночи, изучая и пытаясь выяснить, как же работает программа. И, да, мне удалось… Сначала я выяснил, как транслятор работает, как именно он переводит алгебраическую формулу в инструкции. Но дальше все было сделано ужасно. В программе были ошибки. Каждый раз деля что-либо, у создателей едва получалось довести до конца.
Я тогда обратился к программе SOPE, той, что от Стэна Поли — эта программа была точная, невероятная, словно вы слушаете симфонию. Все соединялось так гармонично, и этот код был простым. Я сказал тогда: «Хотел бы я писать программы, как это делает этот парень». И тот второй код от других разработчиков, он был громоздким и топорным. «А ведь я могу написать лучше, чем это».
Поэтому я и несколько моих друзей написали улучшенную версию и назвали ее RUNCIBLE, ведь у каждой программы в то время должен был быть акроним, и это значило что-то вроде «Исправленный Объединенный Новый Составитель Основного языка» (Revised Unified New Compiler IT Basic Language Extended) или как-то так. У нас было несколько причин, чтобы так назвать программу, но мы хотели переделать тот алгебраический язык, привести в более упорядоченный вид, и затем мы смогли немного улучшить программу, и при это уместиться в те же 10 кбайт.
Вот так я провел свое первое лето в Компьютерном Центре. И потом, уже после того как программа RUNCIBLE была написана, мы также… я также написал инструкцию по эксплуатации для этой программы, и удивительно, эту инструкцию использовали как руководство для студентов на следующий год. И я оказался в довольно необычном положении: на одном из занятий использовали как раз ту самую книгу, которую я написал, будучи на втором курсе.
И RUNCIBLE, мы обновили эту программу следующим летом, добавили туда кучу всяких мелочей, уместив их в 10 кбайт. Но у нас все еще была плавающая точка и другие вещи, над которыми нужно было работать… Поэтому мы снова решили сделать улучшенную версию. И так я написал SOAP 3. Знаете, мне нравилась программа SOAP 2 от IBM. Я написал SOAP 3, которая основывалась на SOAP 2, и в дальнейшем ее мы использовали как ассемблер для улучшения программного обеспечения. И Кейс позволял примерно дюжине студентов писать программы, которые бы в дальнейшем использовались другими студентами или факультетами.
Фред Уэй, директор этой программы, был очень прозорливым, он доверял студентам, и позволял нам…ну, мы здорово проводили время, разговаривая друг с другом обо всем этом. Мы так же получали ежемесячный журнал Ассоциации вычислительной техники в 1958. тогда мы увидели, что люди с всего света публиковали свои идеи как писать программы, и мы тогда поняли, что уже тоже знаем все эти вещи и даже больше.
Так моей второй публикацией, после Potrzebie System для Mad Magazine, стала статья о RUNCIBLE: превращение формул в машинный код. Я отправил свою статью в журнал Ассоциации вычислительной техники, который тогда только начал печататься. Я тогда был очень наивным, не понимал, как правильно печататься в научных журналах. Да, я видел журналы, знал, что туда можно отправить статью, но не имел никакого понятия о значении. Мне важна была сама история, поэтому я и написал.
Я считал себя докладчиком, представителем этих ребят из Компьютерного Центра Кейса, с которыми я вместе работал над созданием RUNCIBLE. И я написал статью о методах, который мы использовали для RUNCIBLE, но нигде в статье я не упомянул имен этих ребят, и я не знал, что получу сумму, за эти идеи, я просто хотел их описать.
Только позднее я все это понял, узнал об условностях. А в тот момент, я просто написал статью. И мы подготовили этот материал правильно, когда статья уже была опубликована, как часть моего собрания сочинений несколько лет назад.