summaryrefslogtreecommitdiff
path: root/talermerchantdemos/blog/articles/uk/rms-lisp.html
blob: 080cc4dee5effa2b2d00362efbe2aa50661cdb73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
<!--#set var="ENGLISH_PAGE" value="/gnu/rms-lisp.en.html" -->

<!--#include virtual="/server/header.uk.html" -->
<!-- Parent-Version: 1.77 -->

<!-- This file is automatically generated by GNUnited Nations! -->
<title>Мій досвід роботи з Лsспом і розвиток GNU Emacs - Проект GNU - Фонд вільного
програмного забезпечення</title>

<!--#include virtual="/gnu/po/rms-lisp.translist" -->
<!--#include virtual="/server/banner.uk.html" -->
<h2>Мій досвід роботи з Ліспом і розвиток GNU Emacs</h2>

<blockquote><p>(Запис промови Річарда Столмена, виголошеної 28&nbsp;жовтня 2002&nbsp;року
на Міжнародній конференції по Ліспу).</p></blockquote>

<p>Оскільки жодна з моїх звичайних промов не має ніякого відношення до Ліспа,
то ні одна з них не підходить для сьогоднішнього виступу. Тому мені
доведеться імпровізувати. Позаяк у своїй професійній діяльності мені
доводилося виконувати досить багато роботи, пов'язаної з Ліспом, у мене,
мабуть, є що розказати.</p>

<p>Моя перша зустріч з Ліспом сталася, коли я прочитав посібник Лісп&nbsp;1.5 у
старших класах. Саме тоді мене вразила ідея, що може бути така мова
програмування. Можливість зробити що-небудь на Ліспі вперше з'явилася у
мене, коли я був на молодших курсах в Гарварді і писав інтерпретатор Ліспа
для PDP-11. Це була дуже маленька машина&nbsp;&mdash; у ній було щось на
зразок 8k пам'яті,&mdash; і мені вдалося написати інтерпретатор довжиною в
тисячу команд. Це залишало мені трохи місця для даних. Це було до того, як я
дізнався, як виглядають справжні програми, які виконують справжні системні
завдання.</p>

<p>Я почав виконувати роботи над справжньою реалізацією Ліспа з Джоном-Л Уайтом
відразу, коли мене прийняли у <abbr title="Massachusetts Institute of
Technology">MIT</abbr>. Туди мене прийняв не Джон-Л, а Расселл Нофтскер, що
було вельми іронічно з огляду на те, що трапилося згодом&nbsp;&mdash; він,
вірогідно, сильно про це шкодував.</p>

<p>У сімдесяті роки XX&nbsp;століття, до того, як моє життя в політизувалося
внаслідок жахливих подій, я просто робив одне розширення одних програм за
іншими, і більшість з них не мали жодного стосунку до Ліспа. Але водночас я
писав текстовий редактор Emacs. Цікава думка, закладена в Emacs, полягала в
тому, що в ньому була мова програмування, і користувацькі команди
редагування писалися на цій інтерпретованій мові програмування, тому під час
редагування у редактор можна було завантажувати нові команди. Можна було
підредагувати програми, якими користуєшся, а потім продовжувати редагувати
ними. Отже, у нас була система, корисна не для програмування, і все-таки під
час користування нею можна було програмувати. Я не знаю, чи це була перша
така система, але це точно був перший такий редактор.</p>

<p>Ця атмосфера побудови гігантських, складних програм для застосування в
своєму власному редагуванні, а потім обміну ними з іншими людьми, живила дух
вільної співпраці, який панував тоді в Лабораторії штучного інтелекту. Ідея
була в тому, що можна передати копію програми, що в тебе є, тому, кому вона
потрібна. Ми обмінювалися програмами з усіма, хто тільки хотів ними
користуватися, програми були людським знанням. Отож, хоча і не було
організованої політичної думки, яка б поєднувала те, як ми обмінювалися
програмами зі облаштуванням Emacs, я переконаний, що між ними був
зв'язок&nbsp;&nbsp; можливо, неусвідомлений. Я думаю, що саме природа нашого
способу життя в Лабораторії штучного інтелекту привела до створення Emacs і
зробила його таким, яким він був.</p>

<p>У первісному Emacs Ліспа не було. Мовою низького рівня&nbsp;&mdash;
неітерпретованою мовою&nbsp;&nbsp; був асемблер PDP-10. Інтерпретатор, який
ми писали, насправді писався не для Emacs, він писався для TECO&nbsp;<a
href="#tf1">[1]</a>. Це був наш текстовий редактор і вкрай потворна мова
програмування, настільки потворна, наскільки це взагалі можливо. Причина
була в тому, що вона не була спроектована як мова програмування, а натомість
як мова редактора і команд. Були такі команди, як &ldquo;5l&rdquo;, що
означало &ldquo;пересунутися на п'ять рядків&rdquo;, або &ldquo;i&rdquo; з
наступним рядком та <em>ESC</em> для того, щоб вставити цей рядок. Можна
було набрати рядок, який був послідовністю команд, який називався командним
рядком. Він завершувався символами <em>ESC</em> <em>ESC</em>, і тоді
послідовність виконувалася.</p>

<p>Втім люди хотіли доповнити цю мову засобами програмування, тому вони додали
деякі засоби. Наприклад, однією з перших була додана конструкція циклу, це
були <em>&lt;</em> <em>&gt;</em>. Нею оточували команди, і це був цикл. Були
інші незрозумілі команди, якими можна було користуватися для умовного виходу
з циклу. При створенні Emacs ми&nbsp;<a href="#foot-1">(1)</a> додали
можливість створення підпрограм з іменами. До того це був ніби Бейсик, у
назвах підпрограм могло бути тільки по одній букві. Писати на цьому великі
програми було важко, тому ми дописали програму, щоб у них могли мати довгі
назви. Насправді там були доволі хитромудрі засоби; здається, засіб
&ldquo;unwind-protect&rdquo; Лісп запозичив з TECO.</p>

<p>Ми почали закладати досить хитромудрі засоби, і у всіх у них був потворний
синтаксис, який тільки-но можна придумати, і це працювало&nbsp;&nbsp; люди
все одно були у змозі писати на цьому великі програми. Очевидним уроком було
те, що така мова, як TECO, неспроектована як мова програмування,&mdash; є
хибним шляхом. Мова, на якій ви будуєте свої розширення, повинна
замислюватися як мова програмування не заднім числом; її відразу слід
проектувати як мову програмування. Фактично, ми виявили, що найкращою мовою
програмування для цих цілей був Лісп.</p>

<p>Це відкрив Берні Грінберг&nbsp;<a href="#foot-2">(2)</a>. Він написав версію
Emacs на MacLisp в Multics, і він писав свої програми на MacLisp
прямолінійним методом. Сам редактор був повністю написаний на Ліспі. Emacs
для Multics мав великий успіх&nbsp;&nbsp; програмування нових команд
редагування було таким зручним, що навіть секретарки в його конторі почали
навчання користуванню ним. Вони користувалися посібником, яке хтось написав
і в якому було показано, як доповнювати Emacs, але там не говорилося, що це
програмування. Тому секретарок, які думали, що не можуть програмувати, це не
відлякувало. Вони читали посібник, виявляли, що можуть робити щось корисне,
і вчилися програмувати.</p>

<p>Отож, Берні зрозумів, що застосунок &mdash; програма, яка робить щось
корисне для вас&nbsp;&nbsp; всередині якої був Лісп і яку ви можете
доповнювати, переписуючи програми на Ліспі,&mdash; насправді дуже хороший
спосіб навчитися програмувати. Це дає людям можливість писати невеликі
програми, які для них корисні, чого в більшості областей ви напевно не
можете. Вони можуть отримувати заохочення від практичної користі для них
самих на стадії, де це найважче&nbsp;&mdash; коли вони не думають, що можуть
програмувати,&mdash; поки вони не дійдуть до точки, в якої вони вже стали
програмістами.</p>

<p>У цей момент люди почали міркувати, як отримати щось подібне на платформі,
де у них не було повної реалізації Ліспа. У MacLisp для Multics був
компілятор та інтерпретатор&nbsp;&mdash; це була повністю оснащена система
Лісп&nbsp;&mdash; але людям кортілося впровадити подібне на інших системах,
де у них не було вже написаного компілятора Ласпа. Ну, якщо у вас немає
компілятора Ласпа, ви не можете написати весь редактор на Ліспі&nbsp;&mdash;
він був би занадто повільним, особливо перемальовування, якщо б довелося
виконувати Лисп на інтерпретаторі. Таким чином, ми розробили гібридну
техніку. Ідея полягала в тому, щоб писати інтерпретатор Ліспа і
низькорівневі частині редактора разом, тоді частини редактора ставали
вбудованими засобами Ліспа. Це були б будь-які частини, в оптимізації яких
ми відчували необхідність. Цю  методику ми вже свідомо практикували у
первісному Emacs, тому що були певні вельми високорівневі функції, які ми
перереалізували на машинній мові, переробивши їх на примітиви
TECO. Наприклад, був примітив TECO для заповнення абзацу (насправді для
основної роботи із заповнення абзацу, тому що деякі з найменш ресурсомістких
частин роботи виконувалися на вищому рівні програмою TECO). Можна було
виконувати всю роботу, написавши програму на TECO, але вона була занадто
повільною, так що ми оптимізували її, переносячи частину її на машинну
мову. Тут (в гібридної техніки) ми скористалися тією ж ідеєю: велика частина
редактора буде написана на Ліспі, але певні його частини, які потрібно було
виконувати особливо швидко, будуть написані на низькому рівні.</p>

<p>Таким чином, коли я писав свою другу реалізацію Emacs, я дотримувався цієї
схеми. Мова низького рівня більше не була машинною мовою, це був Сі. Сі
виявилася доброю, ефективною мовою для переносних програм, призначених для
виконання у операційних системах на кшталт Unix. Там був інтерпретатор
Ліспа, але я реалізував засоби для вирішення спеціальних завдань редагування
безпоередньо на Сі&nbsp;&nbsp; сюди входили маніпуляція буферами редактора,
вставка тексту на початок, читання і запис файлів, оновлення буфера на
екрані, управління вікнами редактора.</p>

<p>Доречі це був не перший Emacs, написаний на Сі і працював в Unix. Перший був
написаний Джеймсом Гослінгом, його називали GosMacs. З них вийшла дивна
історія. Спочатку він, здавалося, перебував під впливом тієї ж самої
атмосфери обміну і співробітництва початкового Emacs. Я спочатку випускав
початковий Emacs для людей в Массачусетському технологічному
інституті. Дехто захотів перенести його на Twenex&nbsp;&nbsp; спочатку
редактор працював тільки у Несумісній системі поділу часу, якою ми
користувалися в інституті. Вони перенесли його на Twenex, це означало, що в
світі було кілька сотень обчислювальних систем, в яких потенційно можна було
його застосовувати. Ми почали поширення серед них із правилом &ldquo; ви
повинні надсилати назад свої поліпшення&rdquo;, щоб ми всі могли отримувати
з цього користь. Ніхто ніколи не намагався стежити за дотриманням цього, але
наскільки я знаю, люди дійсно співпрацювали.</p>

<p>І Гослінг, на перших порах, здавалося, брав у цьому участь. Він написав
підручник, в якому він називав цю програму Emacs, сподіваючися, що інші
члени співтовариства будуть покращувати її, поки вона не заслугожить цієї
назви. Це був правильний підхід до спільноти&nbsp;&nbsp; просити їх
приєднатися і поліпшувати програму. Але після цього його ставлення,
здається, змінилося, і він продав програму одній компанії.</p>

<p>В цей час я працював над системою GNU (вільною операційною системою типу
Unix, яку багато хто помилково називає &ldquo;Linux&rdquo;). Вільного
редактора Emacs, який працював би в Unix, не існувало. Проте був у мене
знайомий, який брав участь у розробці Emacs Гослінга. Гослінг передав йому,
по електронній пошті, дозвіл поширювати його власну версію. Він запропонував
мені скористатися цією версією. Тоді я виявив, що в Emacs Гослінга не було
справжнього Ліспа. В ньому була мова програмування, відома як
&ldquo;mocklisp&rdquo;, він синтаксично виглядає як Лисп, але у ньому немає
структур даних Лиспа. Тому програми не були даними і не вистачало життєво
важливих елементів Ліспа. Його структурами даних були рядки, числа і деякі
інші спеціалізовані об'єкти.</p>

<p>Я прийшов до висновку, що не можу скористатися цим, і був змушений замінити
це все. Першим кроком було написання справжнього інтерпретатора Ліспа. Я
поступово перебазував кожну частину редактора на справжні структури даних
Ліспа замість написаних так-собі структур даних, створивши можливість
виведення внутрішніх структур даних редактора і маніпуляцій ними у
користувацьких програмах на Ліспі.</p>

<p>Єдиним винятком було відображення на дисплеї. Довгий час оновлення на
дисплеї було іншим світом. Редактор вступав у світ перемальовування, і все
починало проводитися над абсолютно особливими структурами даних, для яких не
було безпечного збору сміття, не було безпечних переривань, і в цей час не
можна було виконувати ніяких програм на Ліспі. З тих пір ми це
змінили&nbsp;&nbsp; зараз можна виконувати програми на Ліспі під час
перемальовування. Це дуже зручно.</p>

<p>Ця друга програма Emacs була &ldquo;вільною програмою&rdquo; сучасному
розумінні цього слова&nbsp;&mdash; вона була частиною відкритої політичної
кампанії за звільнення програм. Сутність цієї кампанії полягала в тому, що
кожен має право вільно робити те, що ми у старі часи робили в
Массачусетському технологічному інституті, працюючи разом над програмами і
працюючи з усіма, хто тільки бажав працювати з нами. Це стало  основою руху
за вільне програмне забезпечення&nbsp;&nbsp; на основі досвіду мого життя в
Лабораторії штучного інтелекту&nbsp;&nbsp; працюйте над людським знанням і
не стовбичте ні в кого на шляху до подальшого застосування та подальшого
поширення людського знання.</p>

<p>В цей час можна було зробити комп'ютер, який коштував приблизно стільки ж,
скільки інші комп'ютери, не призначені для Ліспа, але він виконував би Лісп
набагато швидше, ніж вони, і при цьому з повною перевіркою типів на кожній
операції. Звичайні комп'ютери, як правило, змушували вибирати між швидкістю
виконання і хорошою перевіркою типів. Отож, звичайно, можна було отримати
компілятор Ліспа і швидко виконувати програми, але коли вони намагалися
взяти <code>car</code> від числа, це призводило до безглуздих результатів і
врешті-решт коли-небудь призводило до збою.</p>

<p>Машина Ліспа була в змозі виконувати команди майже так само швидко, як ті
інші машини, але кожна команда... команда <code>car</code> виконувала
перевірку типів&nbsp;&mdash; тому коли ви намагалися взяти <code>car</code>
від числа у скомпілованій програмі, це негайно давало помилку. Ми побудували
машину і у нас була для неї операційна система Ліспа. Вона майже повністю
була написана на Ліспі, за винятком частин, записаних в мікрокоді. Виник
інтерес до виробництва машин, а це означало, що потрібно створити компанію.</p>

<p>Було два різних уявлення про те, якою повинна бути ця компанія. Грінблет
хотів створити те, що він називав &ldquo;хакерською&rdquo; компанією. Це
означало, що це була б компанія під управлінням хакерів і працює сприятливо
для хакерів. Іншою метою була підтримка культури Лабораторії штучного
інтелекту&nbsp;<a href="#foot-3">(3)</a>. На жаль, у Грінблета не було
ніякого ділового досвіду, тому інші люди з групи машини Ліспа говорили, що
вони сумніваються в його спроможності  це зробити. Вони думали, що уникнути
зовнішніх капіталовкладень, як він планував, не вдасться.</p>

<p>Але чому він хотів уникнути зовнішніх капіталовкладень? Тому що коли у
компанії є зовнішні вкладники, вони беруть контроль в свої руки і не
дозволяють вам бути педантичним; а якщо ви скільки-небудь педантичні, то
вони врешті-решт поставлять на керівну посаду кого-небудь іншого.</p>

<p>Отож, у Грінблета була думка, що він знайде клієнта, який заплатить за
комплектуючі вперед. Вони зібрали б машини і поставили їх йому; отримуючи
таким чином дохід з цих комплектуючих, вони змогли б купити комплектуючі ще
для декількох машин, продати їх, а потім купити комплектуючі для більшого
числа машин і так далі. Інші люди з групи думали, що так працювати не вийде.</p>

<p>Гринблэтт залучив Расела Нофтскера, людину, яка найняла мене, а в згодом
пішла з Лабораторії штучного інтелекту і створила прибуткову
компанію. Вважалося, що у Расела є ділова хватка. Він продемонстрував цю
ділову хватку, сказавши людям в групі: &ldquo;Давайте кинемо Грінблета і
забудемо про його ідеї; а ми створимо іншу компанію&rdquo;. Вдарив у спину,
зовсім як справжній підприємець. Ці люди вирішили сформувати компанію під
назвою &ldquo;Symbolics&rdquo;, залучати зовнішній капітал, не бути
педантичними і робити все можливе, щоб перемогти.</p>

<p>Але Грінблет не відступив. Він і деякі лояльні по відношенню до нього люди
вирішили все одно утворити Lisp Machines Inc. і працювати за своїм планом. І
що б ви думали? Їм це вдалося! У них з'явився перший клієнт, і їм заплатили
наперед. Вони збирали машини, продавали їх і збирали ще і ще. Врешті-решт
вони стали на ноги, незважаючи на те, що більшість людей в групі їм не
допомагали. Компанія Symbolics також почала успішну діяльність, тому було
дві конкуруючі компанії, що виробляють машини-Ліспи. Коли в Symbolics
зрозуміли, що LMI не думає вилітати в трубу, вони стали шукати способи
зруйнувати її.</p>

<p>Таким чином, за відходом з нашої лабораторії настала &ldquo;війна&rdquo; в
нашій лабораторії. Відхід стався, коли компанія Symbolics переманила всіх
хакерів, крім мене і тих, хто за сумісництвом працював у LMI. Потім вони
встановили правило і виключили тих, хто за сумісництвом працював в
інституті, тому їм довелося піти повністю, і я залишився один. Тепер
Лабораторія штучного інтелекту була безпорадна. А інститут уклав з цими
двома компаніями одну дуже дурну угоду. Це був тристоронній договір, у якому
обидві компанії ліцензували вихідні тексти системи машини Ліспа. Ці компанії
повинні були надавати свої зміни в користування інституту. Але в договорі не
говорилося, що інститут має право розміщувати їх в системах своїх машин
Ліспів, які ліцензували обидві компанії. Ніхто не передбачав, що групу
хакерів Лабораторії штучного інтелекту розженуть, але так і сталося.</p>

<p> Отже, в Symbolics дозрів план&nbsp;<a href="#foot-4">(4)</a>. Вони сказали
лабораторії: &ldquo;Ми продовжимо надавати у ваше користування свої зміни в
системі, але вам не можна розміщувати їх в системі машини Ліспа
інституту. Замість цього ми надамо вам доступ до системи машини Ліспа
Symbolics, і ви зможете працювати на ній, але це все, що ви можете робити.</p>

<p>Це фактично означало, що вони зажадали від нас стати на ту чи іншу бік і
користуватися або версією інституту, або версією Symbolics. Що б ми не
вибрали, це визначало б, в яку систему підуть наші удосконалення. Якщо б ми
працювали над версією Symbolics і вдосконалювали її, ми підтримували б
тільки Symbolics. Якщо б ми користувалися версією інституту і вдосконалювали
її, ми надавали б роботу в розпорядження обох компаній, але в Symbolics
розуміли, що з нашого боку це було б підтримкою LMI, тому що ми допомагали б
їм продовжувати існування. Отож, нам не дозволили залишатися нейтральними.</p>

<p>Аж до цього моменту я не приймав сторону жодної з компаній, хоча мені було
боляче бачити, що сталося з нашим співтовариством і програмами. Але тепер
компанія Symbolics примушувала мене до цього. Отже, намагаючись допомогти
компанії Lisp Machines Inc. втриматися на плаву&nbsp;<a
href="#foot-5">(5)</a>, я почав дублювати всі поліпшення в системі машини
Ліспа, які робили в Symbolics. Я писав еквівалентні поліпшення сам (тобто
тексти програм були моїми власними).</p>

<p>Через деякий час&nbsp;<a href="#foot-6">(6)</a> я прийшов до висновку, що
було б найкраще, якби я навіть не заглядав у їхні тексти. Коли вони робили
оголошення про випуск попередньої версії, в якому був опис випуску, я бачив,
які там були функції, а потім впроваджував їх. До того часу, як вони
випускали остаточну версію, я теж випускав таку версію.</p>

<p>Таким чином, протягом двох років я не давав їм покінчити з LMI, і ці дві
компанії продовжували роботу. Але я не хотів витрачати довгі роки на те, щоб
покарати когось, просто заважаючи злій справі. Я побачив, що вони покарані
досить ґрунтовно, тому що вони натрапили на конкуренцію, яка не йшла і не
збиралася зникати&nbsp;<a href="#foot-7">(7)</a>. Тим часом прийшла пора
почати облаштування нового співтовариства замість того, яке було знищено
їхніми діями та діями інших.</p>

<p>У сімдесятих роках співтовариство Ліспа не обмежувалося Лабораторією
штучного інтелекту Массачусетського технологічного інституту, і не всі
хакери були в цьому інституті. Війна, яку розпочала компанія Symbolics,
спустошила Массачусетський технологічний інститут, але в той час відбувалися
і інші події. Були люди, які припиняли співпрацю, і все це разом спустошило
наше співтовариство, і від нього майже нічого не залишилося.</p>

<p>Коли я припинив карати Symbolics, мені довелося вигадувати, що робити
далі. Мені потрібно було зробити вільну операційну систему, це було
ясно&nbsp;&nbsp; єдиним способом дати людям спільно працювати і обмінюватися
була вільна операційна система.</p>

<p>Спершу я думав про створення системи на базі Ліспа, але усвідомив, що з
технічної точки зору це не добре. Щоб отримати щось подібне до системи
машини Ліспа, потрібен мікрокод спеціального призначення. Саме це дозволяло
виконувати програми так само швидко, як інші комп'ютери виконували свої
програми, і при цьому ще й користуватися перевіркою типів. Без цього усе
звелося б до чогось на кшталт компіляторів Ліспа для інших машин. Програми
були б швидшими, але водночас нестабільними. Так от, це припустимо, якщо
виконувати одну програму на системі з поділом часу&nbsp;&mdash; якщо одна
програма дає збій, це не катастрофа, це щось, що ваша програма час від часу
робить. Але це робило її не досить гарною, щоб писати на ній операційну
систему, тому я відмовився від думки про те, щоб зробити систему на взірець
машини Ліспа.</p>

<p>Замість цього я вирішив зробити операційну систему типу Unix, в якій були б
реалізації Лиспа для виконання користувальницьких програм. Ядро було б
написаним не на Ліспі, але Лісп у нас був би. Тому сама розробка цієї
операційної системи, операційної системи GNU, привела мене до написання GNU
Emacs. В процесі цього я прагнув зробити абсолютно мінімально можливу
реалізацію Ліспа. Розмір програм мав надзвичайне значення.</p>

<p>В той час, в&nbsp;1985&nbsp;році, існували люди, які мали одномегабайтові
машини без віртуальної пам'яті. Вони хотіли бути в змозі використовувати GNU
Emacs. Це означало, що мені потрібно обмежувати програму якнайменшим
розміром.</p>

<p>Наприклад, у той час єдиною циклічною конструкцією була &ldquo;while&rdquo;,
яка є вкрай простою. Не було ніяких способів дострокового виходу з оператора
&ldquo;while&rdquo;, доводилося просто користуватися механізмом виключень
або перевіряти змінну в циклі. Це показує, як далеко я зайшов у обмеженнях
на розмір. У нас не було &ldquo;caar&rdquo;, &ldquo;cadr&rdquo; і так далі;
&ldquo;вичавити все можливе&rdquo;&nbsp;&nbsp; таким духом був просякнутий
GNU Emacs і його Лісп з самого початку.</p>

<p>Зрозуміло, машин зараз більше і ми вже так не робимо. Ми заклали
&ldquo;caar&rdquo;, &ldquo;cadr&rdquo; і так далі, і зараз при нагоді ми
могли б закласти іншу циклічну конструкцію. Ми охоче розширимо його в деяких
межах, але ми не хочемо розширювати його до рівня Загального Ліспа. Я одного
разу реалізовував Загальний Лісп на машині-Ліспі, і мені він не так вже
сподобався. Одна з речей, які мені страшенно не подобаються&nbsp;&nbsp;
аргументи-ключові слова&nbsp;<a href="#foot-8">(8)</a>. На мій погляд, це
виглядає не зовсім по-ліспівськи; іноді я пишу так, але зводжу до мінімуму
кількість випадків, коли я це роблю.</p>

<p>На цьому проекти GNU, пов'язані з Лиспом, не закінчилися. Згодом, приблизно
в&nbsp;1995&nbsp;році, ми розмірковували над організацією проекту графічного
робочого середовища. Було ясно, що для програм середовища нам потрібна мова
програмування, на якій була б написана значна її частина, щоб зробити його
легко розширюваною, як редактор. Постало питання про те, якою повинна бути
мова.</p>

<p>У той час для цих цілей посилено просувався TCL&nbsp;<a
href="#tf2">[2]</a>. Я був дуже невисокої думки про TCL, в основному тому,
що це був не Лісп. Він виглядав злегка подібним на Лісп, але семантично він
ним не був, і він був не таким зрозумілим. Потім хтось показав мені
оголошення, в якому компанія Sun намагалася найняти кого-небудь для роботи
над TCL, щоб зробити його &ldquo;стандартом де-факто для мови
розширень&rdquo; в усьому світі. А я подумав: &ldquo;Нам потрібно запобігти
цьому&rdquo;. Тому ми почали робити Scheme стандартною мовою розширень
GNU. Не Загальний Лісп, бо він був занадто великий. Ідея була в тому, що у
нас буде інтерпретатор Scheme, спроектований для компонування у додатки так
само, як це робили з TCL. Тоді ми стали б рекомендувати це як бажаний пакет
розширень для всіх програм GNU.</p>

<p>Є одна цікава вигода, яку можна отримати з застосування такого потужної
мови, як варіант Ліспа, в якості первинної мови розширень. Ви можете
реалізовувати інші мови переведенням їх на вашу первинну мову. Якщо ваша
первинна мова&nbsp;&nbsp; TCL, ви не можете легко впровадити Лісп
переведенням його на TCL. Але якщо ваш первинна мова&nbsp;&nbsp; Лісп, то
неважко реалізовувати інші мови, переводячи їх. Наша ідея полягала в тому,
що якщо б кожний відкритий додаток підтримував Scheme, то ви могли б
написати реалізацію TCL, Python або Perl на Scheme, яка переводить цю
програму на Scheme. Тоді ви могли б завантажувати її в будь-який додаток і
надбудовувати його під свою улюблену мову і він працював би і з іншими
надбудовами.</p>

<p>До тих пір, поки мови розширення слабкі, користувачам доводиться
застосовувати тільки ту мову, яку ви їм надаєте. Що означає, що людям,
залюбленим, в яку б то не було дану мову, доводиться боротися за вибір
розробників додатків&nbsp;&nbsp; кажучи розробнику програми:
&ldquo;Закладіть, будь ласка, в свій додаток мою мову, а не
його&rdquo;. Тоді у користувачів взагалі не буде вибору&nbsp;&nbsp; яким би
додатком вони не користувалися, він приходить з однією мовою, і у них немає
іншого виходу. Але коли у вас потужна мова, яка може реалізовувати інші
мови, переводячи з них, то ви надаєте користувачеві вибір мови, і нам більше
не доводиться вести війну мов. Саме це, як ми сподіваємося, зробить Guile,
наш інтерпретатор Scheme. У нас є людина, яка цього літа працює над
завершенням транслятора з Python на Scheme. Я не знаю, чи повністю він
завершений, але якщо хтось зацікавлений у цьому проекті, нехай
зв'яжеться. Ось такі у нас плани на майбутнє.</p>

<p>Я не говорив про вільне програмне забезпечення, але дозвольте мені коротко
розповісти вам трохи про те, що це означає. Вираз &ldquo;вільна
програма&rdquo; передбачає не вартість; воно не означає, що ви отримаєте її
безкоштовно. (Можливо, ви заплатили за копію або отримали копію
безкоштовно.) Воно означає, що у вас як у користувача є свобода. Життєво
важливо те, що ви вільні виконувати програму, вільні вивчати, що вона
робить, можете змінювати її під свої потреби, вільні перерозповсюджувати
копії серед інших і вільні публікувати поліпшені, розширені версії. Ось що
означає вільна програма. Якщо ви користуєтеся невільною програмою, то ви
втратили життєво важливу свободу, тому ніколи цього не робіть.</p>

<p>Призначення проекту GNU полягає в тому, щоб полегшити людям відмову від
зневажаючих свободу, пануючих над користувачем невільних програм наданням
вільних програм для їхньої заміни. Для тих, у кого немає моральних сил для
відмови від невільних програм, коли це означає яку-небудь практичну
незручність,&mdash; для них ми намагаємося дати вільну альтернативу, щоб ви
могли перейти до свободи з меншими зусиллями і меншими жертвами в
практичному сенсі. Чим менші жертви, тим краще. Ми хочемо полегшити для вас
співпрацю і вільне життя.</p>

<p>Співпраця&nbsp;&mdash; це питання свободи. Ми звикли думати про свободу і
співпрацю з товариством як про протилежності. Але в даному випадку вони на
одній стороні. При вільних програмах ви вільні співпрацювати з іншими і
допомагати самим собі. При невільних програмах хтось домінує над вами і
роз'єднує людей. Вам не дозволяють обмінюватися з ними, ви не вільні
співпрацювати або допомагати суспільству, точно так само, як ви не вільні
допомогти самим собі. Роз'єднаність і безпорадність&nbsp;&nbsp; стан
користувачів, які застосовують невільні програми.</p>

<p>Ми виробили запаморочливе число вільних програм. Ми зробили те, що, як
стверджувалося, ми ніколи не зможемо зробити; у нас є дві операційні системи
з вільних програм. У нас є безліч додатків, і нам, очевидно, ще багато
належить пройти. Отож, нам потрібна ваша допомога. Я хотів би попросити вас
стати добровольцями проекту GNU; допоможіть нам розробити вільні програми
для нових завдань. Загляньте на <a href="/help/">
http://www.gnu.org/help</a> за пропозиціями того, як допомогти. Якщо ви
хочете замовити щось, на це є посилання з домашньої сторінки. Якщо ви хочете
почитати про філософських питаннях, загляньте в /philosophy. Якщо ви шукаєте
вільні програми для користування, загляньте в /directory, де зараз
перераховано близько 1900&nbsp;пакетів (це тільки частина всіх вільних
програм, які є). Будь ласка, пишіть нові програми і передавайте нам. Мій
збірник нарисів, &ldquo;Вільні програми і вільне суспільство&rdquo;,
знаходиться у продажу, і його можна придбати на <a
href="http://www.gnu.org/">www.gnu.org</a>. Всього найкращого!</p>

<ol>
<li id="foot-1">Гай Стіл склав початковий симетричний набір команд Emacs; потім ми з ним
почали реалізовувати Emacs (на базі TECO), але після однієї тривалої
спільної сесії розробки Стіл почав відходити, тому Emacs закінчував я. Інші,
зокрема, Юджин Чиччареллі і Майк Мак-Магон внесли свій внесок значно
пізніше.</li>

<li id="foot-2">Берні Грінберг стверджує, що реалізація Emacs Дана Уайнреба для машини-Ліспа
вийшла раніше реалізації Грінберга для Multics. Я прошу вибачення за цю
помилку.</li>

<li id="foot-3">План Ґрінблета наскільки я розумію, полягав у тому, щоб наймати людей з
лабораторії за сумісництвом, щоби вони могли продовжувати працювати в
Лабораторії штучного інтелекту. Symbolics замість цього наймала їх на повний
робочий день, тому вони припиняли працювати в інституті.</li>

<li id="foot-4">Цей план базувався на тому (у тій промові я цього не сказав явно), що в
початковий період колишні хакери Лабораторії штучного інтелекту, як у
Symbolics, так і в LMI, продовжували вносити свої зміни в систему
машини-Ліспа інституту&nbsp;&nbsp; хоча за контрактом цього не
вимагалося. План Symbolics полягав у тому, щоб перервати цю співпрацю у
односторонньому порядку.</li>

<li id="foot-5">Не те щоб мене особливо турбувала доля LMI, але я просто не хотів дозволити
Symbolics нажитися на своїй агресії по відношенню до Лабораторії штучного
інтелекту.</li>

<li id="foot-6">З цього твердження було зроблено неправильний висновок, що я ніколи-ніколи
не заглядав у програми Symbolics. Насправді тут йдеться, що я це робив
спочатку. Вихідний текст Symbolics був доступний в інституті, де я мав право
його читати і спочатку саме так я дізнавався про їхні зміни.

<p>Але це означало, що я був змушений вживати особливі зусилля, щоб вирішувати
кожну задачу по-іншому, аби уникнути копіювання програм Symbolics. Через
деякий час я зробив висновок, що краще навіть не дивитися. Так я міг писати
програми яким завгодно найкращим чином, не озираючись на те, що могло бути в
текстах Symbolics.</p></li>

<li id="foot-7">Symbolics якось висловила в інституті протест, в якому говорилося, що моя
робота, перешкодивши їхнім планом, коштувала компанії Symbolics мільйон
доларів.</li>

<li id="foot-8">Я не заперечую, якщо дуже складна і громіздка функція приймає
аргументи-кодові слова. Турбує мене випадок, коли ними користуються такі
прості функції, як &ldquo;member&rdquo;.</li>
</ol>

<div class="translators-notes">

<!--TRANSLATORS: Use space (SPC) as msgstr if you don't have notes.-->
 </div>
</div>

<!-- for id="content", starts in the include above -->
<!--#include virtual="/server/footer.uk.html" -->
<div id="footer">
<div class="unprintable">

<p>Будь ласка, надсилайте загальні запити фонду та GNU за адресою <a
href="mailto:gnu@gnu.org">&lt;gnu@gnu.org&gt;</a>. Наявні також <a
href="/contact/">інші способи зв'язку</a> з фондом. Звіти про непрацюючі
посилання і інші виправлення чи пропозиції можна надсилати за адресою <a
href="mailto:webmasters@gnu.org">&lt;webmasters@gnu.org&gt;</a>.</p>

<p>
<!-- TRANSLATORS: Ignore the original text in this paragraph,
        replace it with the translation of these two:

        We work hard and do our best to provide accurate, good quality
        translations.  However, we are not exempt from imperfection.
        Please send your comments and general suggestions in this regard
        to <a href="mailto:web-translators@gnu.org">

        &lt;web-translators@gnu.org&gt;</a>.</p>

        <p>For information on coordinating and submitting translations of
        our web pages, see <a
        href="/server/standards/README.translations.html">Translations
        README</a>. -->
Ми намагалися зробити цей переклад точним та якісним, але виключити
можливість помилки ми не можемо. Надсилайте, будь ласка, свої зауваження і
пропозиції щодо перекладу за адресою <a
href="mailto:web-translators@gnu.org">&lt;web-translators@gnu.org&gt;</a>.
</p><p>Відомості з координації та пропозицій перекладів наших статей див. у
<a href="/server/standards/README.translations.html">&ldquo;Посібнику з
перекладу&rdquo;</a>.</p>
</div>

<!-- Regarding copyright, in general, standalone pages (as opposed to
     files generated as part of manuals) on the GNU web server should
     be under CC BY-ND 4.0.  Please do NOT change or remove this
     without talking with the webmasters or licensing team first.
     Please make sure the copyright date is consistent with the
     document.  For web pages, it is ok to list just the latest year the
     document was modified, or published.
     
     If you wish to list earlier years, that is ok too.
     Either "2001, 2002, 2003" or "2001-2003" are ok for specifying
     years, as long as each year in the range is in fact a copyrightable
     year, i.e., a year in which the document was published (including
     being publicly visible on the web or in a revision control system).
     
     There is more detail about copyright years in the GNU Maintainers
     Information document, www.gnu.org/prep/maintain. -->
<p>Copyright &copy; 2003, 2007, 2013, 2014, 2020 Фонд вільного програмного
забезпечення, Inc.</p>

<p>Ця сторінка доступна на умовах <a rel="license"
href="http://creativecommons.org/licenses/by-nd/4.0/deed.uk"> ліцензії
Creative Commons Attribution-NoDerivatives (<em>Із зазначенням
авторства&nbsp;&mdash; Без похідних творів</em>) 4.0 Міжнародна</a>.</p>

<!--#include virtual="/server/bottom-notes.uk.html" -->
<div class="translators-credits">

<!--TRANSLATORS: Use space (SPC) as msgstr if you don't want credits.-->
Підтримка українського перекладу: Андрій Бандура
(andriykopanytsia@gmail.com)</div>

<p class="unprintable"><!-- timestamp start -->
Оновлено:

$Date: 2020/07/04 09:00:35 $

<!-- timestamp end -->
</p>
</div>
</div>
</body>
</html>