summaryrefslogtreecommitdiff
path: root/talermerchantdemos/blog/articles/ru/rms-lisp.html
blob: 2a5fdab041c3500dc4e635757c83b47713b1226b (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
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
<!--#set var="ENGLISH_PAGE" value="/gnu/rms-lisp.en.html" -->

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

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

<!--#include virtual="/gnu/po/rms-lisp.translist" -->
<!--#include virtual="/server/banner.ru.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>Я начал выполнять работы над настоящей реализацией Лиспа с Джоном-Л Уайтом,
как только я начал работать в Массачусетском техническом институте. Туда
меня принял не Джон-Л, а Расселл Нофтскер, что было в высшей степени
парадоксально, если учесть то, что случилось впоследствии&nbsp;&mdash; он,
должно быть, сильно об этом пожалел.</p>

<p>В семидесятые годы XX&nbsp;века, до того, как моя жизнь политизировалась в
результате ужасных событий, я просто делал одно расширение различных
программ за другим, и большинство из них не имело никакого отношения к
Лиспу. Но попутно я писал текстовый редактор, Emacs. Интересная мысль,
заложенная в Emacs, состояла в том, что в нем был язык программирования, и
пользовательские команды редактирования писались на этом интерпретируемом
языке программирования, так что во время редактирования в редактор можно
было загружать новые команды. Можно было подредактировать программы,
которыми пользуешься, а потом продолжать редактировать ими. Итак, у нас была
система, полезная не для программирования, и все-таки во время пользования
ею можно было программировать. Я не знаю, была ли это первая такая система,
но это определенно был первый такой редактор.</p>

<p>Эта атмосфера построения гигантских, сложных программ для применения в своем
собственном редактировании, а затем обмена ими с другими людьми, питала дух
нестесненного сотрудничества, который царил тогда в Лаборатории
искусственного интеллекта. Идея была в том, что можно передать копию
программы, которая у тебя есть, тому, кому она нужна. Мы обменивались
программами со всеми, кто только хотел ими пользоваться, программы были
человеческим знанием. Так что, хотя и не было организованной политической
мысли, связывающей то, как мы обменивались программами, с устройством Emacs,
я убежден, что между ними была связь&nbsp;&mdash; возможно, неосознанная. Я
думаю, что именно природа нашего образа жизни в Лаборатории искусственного
интеллекта привела к созданию Emacs и сделала его таким, каким он был.</p>

<p>В первоначальном Emacs Лиспа не было. Языком низкого уровня&nbsp;&mdash;
неинтерпретируемым языком&nbsp;&mdash; был ассемблер 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;&mdash; люди все равно были в состоянии писать на этом крупные
программы. Очевидным уроком было то, что такой язык, как TECO, который не
был спроектирован как язык программирования,&mdash; это был неверный
путь. Язык, на котором вы строите свои расширения, должен задумываться как
язык программирования не задним числом; его следует проектировать как язык
программирования. Фактически, мы обнаружили, что лучшим языком
программирования для этих целей был Лисп.</p>

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

<p>Так что Берни понял, что приложение&mdash; программа, которая делает что-то
полезное для вас&nbsp;&mdash; внутри которого был Лисп и которое вы можете
дополнять, переписывая программы на Лиспе,&mdash; на самом деле очень
хороший способ научиться программировать. Это дает людям возможность писать
небольшие программы, которые для них полезны, чего в большинстве областей
вы, наверное, не можете. Они могут получать поощрение от практической пользы
для них самих на стадии, где это труднее всего&nbsp;&mdash; когда они не
думают, что могут программировать,&mdash; пока они не дойдут до точки, в
которой они уже стали программистами.</p>

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

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

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

<p>И Гослинг, на первых порах, казалось, принимал в этом участие. Он написал
руководство, в котором он называл эту программу Emacs в надежде, что другие
члены сообщества будут улучшать ее, пока она не заслужит этого названия. Это
был верный подход к сообществу&nbsp;&mdash; просить их присоединиться и
улучшать программу. Но после этого его отношение, кажется, изменилось, и он
продал программу одной компании.</p>

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

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

<p>Единственным исключением была перерисовка. Долгое время перерисовка была
своего рода другим миром. Редактор вступал в мир перерисовки, и все начинало
проводиться над совершенно особыми структурами данных, для которых не было
безопасной сборки мусора, не было безопасных прерываний, и в это время
нельзя было выполнять никаких программ на Лиспе. С тех пор мы это
изменили&nbsp;&mdash; сейчас можно выполнять программы на Лиспе во время
перерисовки. Это очень удобно.</p>

<p>Эта вторая программа Emacs была &ldquo;свободной программой&rdquo; в
современном смысле этого слова&nbsp;&mdash; она была частью открытой
политической кампании за освобождение программ. Сущность этой кампании
состояла в том, что всякий должен быть волен делать то, что мы в старые
времена делали в Массачусетском техническом институте, работая вместе над
программами и работая со всеми, кто только желал работать с нами. Это было
основой движения за свободное программное обеспечение&nbsp;&mdash; опыт моей
жизни в Лаборатории искусственного интеллекта&nbsp;&mdash; работать над
человеческим знанием и не стоять ни у кого на пути к дальнейшему применению
и дальнейшему распространению человеческого знания.</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;&mdash; единственным способом дать людям совместно работать и
обмениваться была свободная операционная система.</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;&mdash; таким духом был пропитан GNU Emacs и его Лисп
с самого начала.</p>

<p>Разумеется, машины сейчас больше, и мы уже так не делаем. Мы заложили
&ldquo;caar&rdquo;, &ldquo;cadr&rdquo; и так далее, и сейчас при случае мы
могли бы заложить другую циклическую конструкцию. Мы охотно расширим его в
некоторых пределах, но мы не хотим расширять его до уровня Общего Лиспа. Я
однажды реализовывал Общий Лисп на машине-Лиспе, и мне он не так уж
понравился. Одна из вещей, которые мне ужасно не нравятся&nbsp;&mdash;
аргументы-ключевые слова&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;&mdash; TCL, вы не можете легко реализовать Лисп
переводом его на TCL. Но если ваш первичный язык&nbsp;&mdash; Лисп, то
нетрудно реализовывать другие языки, переводя их. Наша идея состояла в том,
что если бы каждое расширяемое приложение поддерживало Scheme, то вы могли
бы написать реализацию TCL, Python или Perl на Scheme, которая переводит эту
программу на Scheme. Тогда вы могли бы загружать ее в любое приложение и
надстраивать его под свой любимый язык, и оно работало бы и с другими
надстройками.</p>

<p>До тех пор, пока языки расширения слабы, пользователям приходится применять
только тот язык, который вы им предоставляете. Что означает, что людям,
влюбленным в какой бы то ни было данный язык, приходится бороться за выбор
разработчиков приложений&nbsp;&mdash; говоря разработчику приложения:
&ldquo;Заложите, пожалуйста, в свое приложение мой язык, а не
его&rdquo;. Тогда у пользователей вообще не будет выбора&nbsp;&mdash; каким
бы приложением они ни пользовались, оно приходит с одним языком, и у них нет
другого выхода. Но когда у вас мощный язык, который может реализовывать
другие языки, переводя с них, то вы предоставляете пользователю выбор языка,
и нам больше не приходится вести войну языков. Именно это, как мы надеемся,
сделает Guile, наш интерпретатор Scheme. У нас есть человек, который этим
летом работает над завершением транслятора с Python на Scheme. Я не знаю,
полностью ли он завершен, но если кто-то заинтересован в этом проекте, пусть
свяжется. Так что вот какие у нас планы на будущее.</p>

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

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

<p>Сотрудничество&nbsp;&mdash; это вопрос свободы. Мы привыкли думать о свободе
и сотрудничестве с обществом как о противоположностях. Но в данном случае
они на одной стороне. При свободных программах вы вольны и сотрудничать с
другими, и помогать самим себе. При несвободных программах кто-то доминирует
над вами и разобщает людей. Вам не позволяют обмениваться с ними, вы не
вольны сотрудничать или помогать обществу, точно так же, как вы не вольны
помочь самим себе. Разобщенность и беспомощность&nbsp;&mdash; состояние
пользователей, применяющих несвободные программы.</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;&mdash; хотя по контракту этого не
требовалось. План 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.-->
<h3>Примечания переводчиков</h3>
<ol>
<li id="tf1"><span lang="en" xml:lang="en">TECO, Text Editor and
COrrector</span>&nbsp;&mdash; англ. текстовый редактор и корректор.</li>
<li id="tf2"><span lang="en" xml:lang="en">TCL, Tool
Command Language</span>&nbsp;&mdash; англ. инструментальный командный
язык.</li>
</ol></div>
</div>

<!-- for id="content", starts in the include above -->
<!--#include virtual="/server/footer.ru.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 Free Software Foundation, Inc.</p>

<p>Это произведение доступно по <a rel="license"
href="http://creativecommons.org/licenses/by-nd/4.0/deed.ru">лицензии
Creative Commons Attribution-NoDerivs (<em>Атрибуция&nbsp;&mdash; Без
производных произведений</em>) 4.0 Всемирная</a>.</p>

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

<!--TRANSLATORS: Use space (SPC) as msgstr if you don't want credits.-->
<em>Внимание! В подготовке этого перевода участвовал только один человек. Вы
можете существенно улучшить перевод, если проверите его и расскажете о
найденных ошибках в <a
href="http://savannah.gnu.org/projects/www-ru">русской группе переводов
gnu.org</a>.</em></div>

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

$Date: 2020/07/01 17:02:57 $

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