Дональд Кнут: про асемблер, транслятор і грамотне програмування

"Literate programming (грамотне програмування) — ставлення до комп'ютерних програм, як до літератури: комп'ютерна програма пишеться не стільки для комп'ютера, скільки для людей, щоб люди могли її прочитати. І оскільки я пишу програми, і в деякому роді вчитель. "

image

«Давайте змінимо традиційні пріоритети у створенні програм: замість уявлення про нашу задачу як про створення інструкцій «Що робити?» для комп'ютера сконцентруємося на поясненні іншим людям описів нашого бачення того, що під управлінням програми повинен робити комп'ютер.»

Literate programming (66/97)


Тим часом, я також визначився з точною версією TeX і самою концепцією грамотного програмування. Дозвольте мені трохи повернутися назад до історії про утиліті «сплутування» і «сплетіння» (Weave and Tangle). Взагалі, я думаю, що найбільшою користю від заняття друкарською справою була ідея створення того, що зветься «грамотним програмуванням».

Мені подобається вчити. Я не просто навчаю комп'ютер, я вчу читачів моїх програм. Сподіваюся, що одного разу будуть присуджувати Пулітцерівську премію за саму грамотну програму і т. д.

image
Я почав цей експеримент, тому що один мій друг, Професор Хоар з Оксфорда, сказав: «Дон, люди навіть не читають комп'ютерні програми».

Видавництво Оксфордського Університету було зацікавлене в публікації деяких комп'ютерних програм, в якості прикладів як правильно вони повинні бути написані.

І замість якихось прихованих файлів, які люди повинні ще й прочитати, це була б у своєму роді література, як, наприклад, музична нотація. Люди ж публікують партитури симфоній, а не просто слухають їх. Так чому ми не можемо опублікувати комп'ютерні програми? І його ідея засіла у мене в голові, але в той же час вона лякала мене, адже справжні вже створені комп'ютерні програми сповнені компрометаций. Професор комп'ютерних наук не міг допустити цього.

Можна написати маленьку програму і порівняти її з маленькими дорогоцінним камінням, але коли мова йде про велику програму, то ми, звичайно, можемо прикинутися, що це коштовність, але це б не було таким. І я не думаю, що багато творці програм були б раді тому, що інші люди прочитають їх роботи в тому вигляді, в якому це було доступно тоді. І я почав думати, як би написати програму так, щоб людям подобалося читати її.

Так, очевидно, і з'явилася ця ідея грамотного програмування, я знайшов формат, в якому міг би представити програму іншим людям, більше того, я як творець цієї програми, міг зрозуміти її краще. І так я дійшов до цієї системи, в якій міг написати програму мовою програмування, потім з цієї однієї програми я створив ще дві — одна конвертувалася з мови опису веб-сервісів Паскаль, а інша — з мови опису веб-сервісів в документ, який я міг прочитати завдяки верстці, перехресним посиланням і зрозумілим изложениям.

Ця система дуже втішила мене. Я писав програми CWEB — це «нащадок» оригінальної веб-системи, і це приносить мені нескінченне щастя писати програми в такому вигляді, який я знаходжу найбільш підходящим.

image
Donald E. Батіг: 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, але ніде в статті я не згадав імена цих хлопців, і я не знав, що отримаю суму, за ці ідеї, я просто хотів їх описати.

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

Підтримка публікації — компанія Edison, яка розробляє оповещалку для трейдерів, а так само робить систему обліку енергоресурсів і водопостачання для котеджного селища.

Читати ще
Список 97 відеороликів з історіями Дональда КнутаПлейлист на Youtube

1. Family history
2. Learning to read and school
3. My mother
4. My parents' finances
5. Interests in high school
6. Being a nerd of nerds at high school
7. My sense of humor
8. The Potrzebie System of Weights and Measures
9. Feeling the need to prove myself
11. University life: my basketball management system
12. University life: the fraternity system
13. Meeting my wife Jill
14. Bible study at university and a time of personal challenge
15. Extra-curricular activities at Case
16. Taking graduate classes at Case
17. Physics, welding, astronomy and mathematics
18. My maths teacher at Case and a difficult problem
19. My interest in graphs and my first experience of a computer
20. How I got interested in programming
21. Learning how to program on the IBM 650
22. Writing a tic-tac-toe program
23. Learning about Symbolic Optimum Assembly programs
24. The Internal Translator
25. Adding more features to RUNCIBLE
26. Wanting to be a teacher and why I chose to go to Caltech
27. Writing a compiler for the Burroughs Corporation
28. Working for the Burroughs Corporation
29. Burroughs Corporation
30. My interest in context-free languages
31. Getting my PhD and the problem of symmetric block designs with…
32. Finding a solution to an open problem about проективної planes
33. Inception of The Art of Computer Programming
34. 1967: a turbulent year
35. Work on attribute grammars and the Батіг-Bendix Algorithm
36. Being creative in the forest
37. A new field: analysis of algorithms
38. The Art of Computer Programming: underestimating the size of the...
39. The successful first release of The Art of Computer Programming
40. Inspiration to write Surreal Numbers
41. Writing Surreal Numbers in a hotel room in Oslo
42. Finishing the Surreal Numbers
43. The є поява of computer science as an academic subject
44. I want to do computer science instead of arguing for it
45. A year doing National Service in Princeton
46. Moving to Stanford and wondering whether i'd made the right choice
47. Designing the house in Stanford
48. Volume Three of The Art of Computer Programming
49. Working on Volume Four of The Art of Computer Programming
50. Poor quality typesetting on the second edition of my book
51. Deciding to make my own typesetting program
52. Working on my typesetting program
53. Mathematical formula for letter shapes
54. Research into the history of typography
55. Working on my letters and problems with the S
56. Figuring out how to typeset and the problem with specifications
57. Working on TeX
58. Why the designer and the implementer of a program should be the…
59. Converting Volume Two to TeX
60. Writing a users' manual for TeX
61. Giving the Gibbs lecture on my typography work
62. Developing Metafont and TeX
63. Why I chose not to retain rights to any TeX and transcribed it to…
64. Tuning up my fonts and getting funding for TeX
65. Problems with Volume Two
66. Literate programming
67. Re-writing TeX using the feedback I received
68. The importance of stability for TeX
69. LaTeX and ConTeXt
70. A summary of the TeX project
71. A year in Boston
72. Writing a book about the Bible
73. The most beautiful 3:16 in the world
74. Master Chess playing at Adobe Systems
75. Giving a lecture series on science and religion at MIT
76. Back to work at Stanford and taking early retirement
77. Taking up swimming to help me cope with stress
78. My graduate students and my 64th birthday
79. My class on Concrete Mathematics
80. Writing a book on my Concrete Mathematics class
81. Updating Volumes One to Three of The Art of Computer Programming
82. Getting started on Volume Four of «The Art of Computer...
83. Two final major research projects
84. My love of writing and a lucky life
85. Coping with cancer
86. Honorary doctorates
87. The importance of awards and the Kyoto Prize
88. Pipe organ music is one of the great pleasures of life
89. The pipe organ in my living room
90. Playing the organs
91. An international symposium on algorithms in the Soviet Union
92. The Батіг-Morris-Pratt algorithm
93. My advice to young people
94. My children: John
95. My children: Jenny
96. Working on a series of books of my collected papers
97. Why I chose analysis of algorithms as a subject

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.