rms-lisp.html (61506B)
1 <!--#set var="ENGLISH_PAGE" value="/gnu/rms-lisp.en.html" --> 2 3 <!--#include virtual="/server/header.ru.html" --> 4 <!-- Parent-Version: 1.96 --> 5 <!-- This page is derived from /server/standards/boilerplate.html --> 6 <!--#set var="TAGS" value="gnu-history" --> 7 <!--#set var="DISABLE_TOP_ADDENDUM" value="yes" --> 8 9 <!-- This file is automatically generated by GNUnited Nations! --> 10 <title>Мой опыт работы с Лиспом и развитие GNU Emacs - Проект GNU - Фонд свободного 11 программного обеспечения</title> 12 <style type="text/css" media="print,screen"><!-- 13 a[href*='#foot-'] { font-size: .94em; } 14 --> 15 </style> 16 17 <!--#include virtual="/gnu/po/rms-lisp.translist" --> 18 <!--#include virtual="/server/banner.ru.html" --> 19 <!--#include virtual="/gnu/gnu-breadcrumb.ru.html" --> 20 <!--GNUN: OUT-OF-DATE NOTICE--> 21 <!--#include virtual="/server/top-addendum.ru.html" --> 22 <div class="article reduced-width"> 23 <h2>Мой опыт работы с Лиспом и развитие GNU Emacs</h2> 24 25 <div class="infobox"> 26 <p>Запись речи Ричарда Столмена на Международной конференции по Лиспу, 28 27 октября 2002.</p> 28 </div> 29 <hr class="thin" /> 30 31 <p>Поскольку ни одна из моих обычных речей не имеет никакого отношения к Лиспу, 32 ни одна из них не подходит для сегодняшнего выступления. Так что мне 33 придется импровизировать. Поскольку в своей профессиональной деятельности 34 мне доводилось выполнять довольно много работы, связанной с Лиспом, у меня, 35 должно быть, есть что порассказать.</p> 36 37 <p>Моя первая встреча с Лиспом произошла, когда я прочел руководство по 38 Лисп 1.5 в старших классах. Именно тогда меня поразила идея, что может 39 быть такой язык программирования. Возможность сделать что-нибудь на Лиспе 40 впервые появилась у меня, когда я был на младших курсах в Гарварде и писал 41 интерпретатор Лиспа для PDP-11. Это была очень маленькая машина — 42 в ней было что-то вроде 8k памяти,— и мне удалось написать 43 интерпретатор длиной в тысячу команд. Это оставляло мне немного места для 44 данных. Это было до того, как я узнал, как выглядят настоящие программы, 45 которые выполняют настоящие системные задачи.</p> 46 47 <p>Я начал выполнять работы над настоящей реализацией Лиспа с Джоном-Л Уайтом, 48 как только я начал работать в Массачусетском техническом институте. Туда 49 меня принял не Джон-Л, а Расселл Нофтскер, что было в высшей степени 50 парадоксально, если учесть то, что случилось впоследствии — он, 51 должно быть, сильно об этом пожалел.</p> 52 53 <p>В семидесятые годы XX века, до того, как моя жизнь политизировалась в 54 результате ужасных событий, я просто делал одно расширение различных 55 программ за другим, и большинство из них не имело никакого отношения к 56 Лиспу. Но попутно я писал текстовый редактор, Emacs. Интересная мысль, 57 заложенная в Emacs, состояла в том, что в нем был язык программирования, и 58 пользовательские команды редактирования писались на этом интерпретируемом 59 языке программирования, так что во время редактирования в редактор можно 60 было загружать новые команды. Можно было подредактировать программы, 61 которыми пользуешься, а потом продолжать редактировать ими. Итак, у нас была 62 система, полезная не для программирования, и все-таки во время пользования 63 ею можно было программировать. Я не знаю, была ли это первая такая система, 64 но это определенно был первый такой редактор.</p> 65 66 <p>Эта атмосфера построения гигантских, сложных программ для применения в своем 67 собственном редактировании, а затем обмена ими с другими людьми, питала дух 68 нестесненного сотрудничества, который царил тогда в Лаборатории 69 искусственного интеллекта. Идея была в том, что можно передать копию 70 программы, которая у тебя есть, тому, кому она нужна. Мы обменивались 71 программами со всеми, кто только хотел ими пользоваться, программы были 72 человеческим знанием. Так что, хотя и не было организованной политической 73 мысли, связывающей то, как мы обменивались программами, с устройством Emacs, 74 я убежден, что между ними была связь — возможно, неосознанная. Я 75 думаю, что именно природа нашего образа жизни в Лаборатории искусственного 76 интеллекта привела к созданию Emacs и сделала его таким, каким он был.</p> 77 78 <p>В первоначальном Emacs Лиспа не было. Языком низкого уровня — 79 неинтерпретируемым языком — был ассемблер PDP-10. Интерпретатор, 80 который мы писали, на самом деле писался не для Emacs, он писался для 81 TECO <a href="#tf1">(1)</a>. Это был наш текстовый редактор и крайне 82 уродливый язык программирования, настолько уродливый, насколько это только 83 возможно. Причина была в том, что он не был спроектирован как язык 84 программирования, он был спроектирован как язык редактора и команд. Были 85 такие команды, как <code>5l</code>, что означало <code>передвинуться на пять 86 строк</code>, или <code>i</code> с последующим текстом и <kbd>ESC</kbd> для 87 того, чтобы вставить этот текст. Можно было набрать строку, которая была 88 последовательностью команд, это называлось командной строкой. Она 89 завершалась символами <kbd>ESC</kbd> <kbd>ESC</kbd>, и тогда 90 последовательность выполнялась.</p> 91 92 <p>Ну, люди хотели дополнить этот язык средствами программирования, так что они 93 добавили некоторые такие средства. Например, одной из первых была добавлена 94 конструкция цикла, это были <code><</code> <code>></code>. Ими 95 окружали команды, и это был цикл. Были другие непонятные команды, которыми 96 можно было пользоваться для условного выхода из цикла. При создании Emacs 97 мы <a href="#foot-1">[1]</a> добавили возможность создания подпрограмм 98 с именами. До того это было вроде Бейсика, в именах подпрограмм могло быть 99 только по одной букве. Писать на этом большие программы было трудно, так что 100 мы дописали программу, чтобы у них могли быть более длинные имена. На самом 101 деле там были довольно замысловатые средства; по-моему, средство 102 “unwind-protect” Лисп заимствовал из TECO.</p> 103 104 <p>Мы начали закладывать довольно замысловатые средства, и у всех у них был 105 уродливейший синтаксис, какой только можно придумать, и это 106 работало — люди все равно были в состоянии писать на этом крупные 107 программы. Очевидным уроком было то, что такой язык, как TECO, который не 108 был спроектирован как язык программирования,— это был неверный 109 путь. Язык, на котором вы строите свои расширения, должен задумываться как 110 язык программирования не задним числом; его следует проектировать как язык 111 программирования. Фактически, мы обнаружили, что лучшим языком 112 программирования для этих целей был Лисп.</p> 113 114 <p>Это открыл Берни Гринберг <a href="#foot-2">[2]</a>. Он написал версию 115 Emacs на MacLisp в Multics, и он писал свои программы на MacLisp 116 прямолинейным манером. Сам редактор был полностью написан на Лиспе. Emacs 117 для Multics имел большой успех — программирование новых команд 118 редактирования было таким удобным, что даже секретарши в его конторе начали 119 учиться пользованию им. Они пользовались руководством, которое кто-то 120 написал и в котором было показано, как дополнять Emacs, но там не 121 говорилось, что это программирование. Так что секретарш, которые думали, что 122 не могут программировать, это не отпугивало. Они читали руководство, 123 обнаруживали, что могут делать что-то полезное, и учились программировать.</p> 124 125 <p>Так что Берни понял, что приложение— программа, которая делает что-то 126 полезное для вас — внутри которого был Лисп и которое вы можете 127 дополнять, переписывая программы на Лиспе,— на самом деле очень 128 хороший способ научиться программировать. Это дает людям возможность писать 129 небольшие программы, которые для них полезны, чего в большинстве областей 130 вы, наверное, не можете. Они могут получать поощрение от практической пользы 131 для них самих на стадии, где это труднее всего — когда они не 132 думают, что могут программировать,— пока они не дойдут до точки, в 133 которой они уже стали программистами.</p> 134 135 <p>В этот момент люди начали размышлять, как получить что-то вроде этого на 136 платформе, где у них не было полнофункциональной реализации Лиспа. У MacLisp 137 для Multics был как компилятор, так и интерпретатор — это была 138 полностью оснащенная система Лисп — но люди хотели реализовать 139 что-то подобное на других системах, где у них не было уже написанного 140 компилятора Лиспа. Ну, если у вас нет компилятора Лиспа, вы не можете 141 написать весь редактор на Лиспе — он был бы слишком медленным, 142 особенно перерисовка, если бы пришлось выполнять Лисп на интерпретаторе. Так 143 что мы разработали гибридную технику. Идея состояла в том, чтобы писать 144 интерпретатор Лиспа и низкоуровневые части редактора вместе, так что части 145 редактора были встроенными средствами Лиспа. Это были бы любые части, в 146 оптимизации которых мы ощущали необходимость. Это была техника, которую мы 147 уже сознательно практиковали в первоначальном Emacs, потому что были 148 определенные весьма высокоуровневые функции, которые мы перереализовали на 149 машинном языке, переделав их в примитивы TECO. Например, был примитив TECO 150 для заполнения абзаца (на самом деле для основной работы по заполнению 151 абзаца, потому что некоторые из наименее ресурсоемких частей работы 152 выполнялись на более высоком уровне программой TECO). Можно было выполнять 153 всю работу, написав программу на TECO, но она была слишком медленной, так 154 что мы оптимизировали ее, перенеся часть ее на машинный язык. Здесь (в 155 гибридной технике) мы воспользовались той же идеей: большая часть редактора 156 будет написана на Лиспе, но определенные его части, которые нужно было 157 выполнять особенно быстро, будут написаны на низком уровне.</p> 158 159 <p>Таким образом, когда я писал свою вторую реализацию Emacs, я следовал такого 160 же рода схеме. Язык низкого уровня больше не был машинным языком, это был 161 Си. Си был хорошим, эффективным языком для переносимых программ, 162 предназначенных для выполнения в операционной системе типа Unix. Там был 163 интерпретатор Лиспа, но я реализовал средства для решения специальных задач 164 редактирования прямо на Си — сюда входили манипуляция буферами 165 редактора, вставка текста в начало, чтение и запись файлов, перерисовка 166 буфера на экране, управление окнами редактора.</p> 167 168 <p>Так вот, это был не первый Emacs, написанный на Си и работавший в 169 Unix. Первый был написан Джеймсом Гослингом, его называли GosMacs. С ним 170 вышла странная история. Вначале он, казалось, находился под влиянием той же 171 самой атмосферы обмена и сотрудничества первоначального Emacs. Я сначала 172 выпускал первоначальный Emacs для людей в Массачусетском техническом 173 институте. Кое-кто захотел перенести его на Twenex — сначала 174 редактор работал только в Несовместимой системе разделения времени, которой 175 мы пользовались в институте. Они перенесли его на Twenex, это означало, что 176 в мире было несколько сотен вычислительных систем, в которых его 177 потенциально можно было применять. Мы начали распространять его среди них с 178 правилом “вы должны присылать назад все свои улучшения”, чтобы 179 мы все могли извлекать из этого пользу. Никто никогда не пытался следить за 180 соблюдением этого, но насколько я знаю, люди действительно сотрудничали.</p> 181 182 <p>И Гослинг, на первых порах, казалось, принимал в этом участие. Он написал 183 руководство, в котором он называл эту программу Emacs в надежде, что другие 184 члены сообщества будут улучшать ее, пока она не заслужит этого названия. Это 185 был верный подход к сообществу — просить их присоединиться и 186 улучшать программу. Но после этого его отношение, кажется, изменилось, и он 187 продал программу одной компании.</p> 188 189 <p>В это время я работал над системой GNU (свободной операционной системой типа 190 Unix, которую многие ошибочно называют “Linux”). Свободного 191 редактора Emacs, который работал бы в Unix, не было. Однако был у меня 192 знакомый, который участвовал в разработке Emacs Гослинга. Гослинг передал 193 ему, по электронной почте, разрешение распространять его собственную 194 версию. Он предложил мне воспользоваться этой версией. Тогда я обнаружил, 195 что в Emacs Гослинга не было настоящего Лиспа. В нем был язык 196 программирования, известный как “mocklisp”, он синтаксически 197 выглядит как Лисп, но в нем нет структур данных Лиспа. Так что программы не 198 были данными и не хватало жизненно важных элементов Лиспа. Его структурами 199 данных были строки, числа и некоторые другие специализированные объекты.</p> 200 201 <p>Я пришел к выводу, что не могу воспользоваться этим, и был вынужден заменить 202 это все, и первым шагом было написание настоящего интерпретатора Лиспа. Я 203 постепенно перебазировал каждую часть редактора на настоящие структуры 204 данных Лиспа взамен написанных по случаю структур данных, создав возможность 205 вывода внутренних структур данных редактора и манипуляций ими в 206 пользовательских программах на Лиспе.</p> 207 208 <p>Единственным исключением была перерисовка. Долгое время перерисовка была 209 своего рода другим миром. Редактор вступал в мир перерисовки, и все начинало 210 проводиться над совершенно особыми структурами данных, для которых не было 211 безопасной сборки мусора, не было безопасных прерываний, и в это время 212 нельзя было выполнять никаких программ на Лиспе. С тех пор мы это 213 изменили — сейчас можно выполнять программы на Лиспе во время 214 перерисовки. Это очень удобно.</p> 215 216 <p>Эта вторая программа Emacs была “свободной программой” в 217 современном смысле этого слова — она была частью открытой 218 политической кампании за освобождение программ. Сущность этой кампании 219 состояла в том, что всякий должен быть волен делать то, что мы в старые 220 времена делали в Массачусетском техническом институте, работая вместе над 221 программами и работая со всеми, кто только желал работать с нами. Это было 222 основой движения за свободное программное обеспечение — опыт моей 223 жизни в Лаборатории искусственного интеллекта — работать над 224 человеческим знанием и не стоять ни у кого на пути к дальнейшему применению 225 и дальнейшему распространению человеческого знания.</p> 226 227 <p>В это время можно было сделать компьютер, который стоил примерно столько же, 228 сколько другие компьютеры, не предназначенные для Лиспа, но он выполнял бы 229 Лисп гораздо быстрее, чем они, и при этом с полной проверкой типов на каждой 230 операции. Обычные компьютеры, как правило, вынуждали выбирать между 231 скоростью выполнения и хорошей проверкой типов. Так что, конечно, можно было 232 получить компилятор Лиспа и быстро выполнять программы, но когда они 233 пытались взять <code>car</code> от числа, это приводило к бессмысленным 234 результатам и в конце концов когда-нибудь приводило к сбою.</p> 235 236 <p>Машина-Лисп была в состоянии выполнять команды почти так же быстро, как те 237 другие машины, но каждая команда... команда <code>car</code> выполняла 238 проверку типов — так что когда вы пытались взять <code>car</code> 239 от числа в скомпилированной программе, это немедленно давало ошибку. Мы 240 построили машину, и у нас была для нее операционная система Лиспа. Она почти 241 полностью была написана на Лиспе, за исключением только частей, записанных в 242 микрокоде. Возник интерес к производству машин, это означало, что нужно 243 создать компанию.</p> 244 245 <p>Было два разных представления о том, какой должна быть эта 246 компания. Гринблэтт хотел создать то, что он называл “хакерской” 247 компанией. Это означало, что это была бы компания под управлением хакеров и 248 работающая благоприятным для хакеров образом. Другой целью была поддержка 249 культуры Лаборатории искусственного интеллекта <a 250 href="#foot-3">[3]</a>. К сожалению, у Гринблэтта не было никакого делового 251 опыта, так что другие люди из группы машины-Лиспа говорили, что они 252 сомневаются в том, что он сможет это сделать. Они думали, что избежать 253 внешних капиталовложений, как он планировал, не удастся.</p> 254 255 <p>Но почему он хотел избежать внешних капиталовложений? Потому что когда у 256 компании есть внешние вкладчики, они берут контроль в свои руки и не 257 позволяют вам быть щепетильным; а если вы сколько-нибудь щепетильны, то они 258 в конце концов поставят на руководящую должность кого-нибудь другого.</p> 259 260 <p>Так что у Гринблэтта была мысль, что он найдет клиента, который заплатит за 261 комплектующие вперед. Они собрали бы машины и поставили их ему; извлекая 262 таким образом доход из этих комплектующих, они смогли бы купить 263 комплектующие еще для нескольких машин, продать их, а потом купить 264 комплектующие для большего числа машин и так далее. Другие люди из группы 265 думали, что так работать не получится.</p> 266 267 <p>Гринблэтт привлек Расселла Нофтскера, человека, который нанял меня, а в 268 последствии ушел из Лаборатории искусственного интеллекта и создал 269 прибыльную компанию. Считалось, что у Расселла есть деловая хватка. Он 270 продемонстрировал эту деловую хватку, сказав людям в группе: “Давайте 271 бросим Гринблэтта и забудем о его идеях; а мы создадим другую 272 компанию”. Ударил в спину, совсем как настоящий предприниматель. Эти 273 люди решили сформировать компанию под названием “Symbolics”, 274 привлекать внешний капитал, не быть щепетильными и делать все возможное, 275 чтобы победить.</p> 276 277 <p>Но Гринблэтт не отступил. Он и немногие лояльные по отношению к нему люди 278 решили все равно образовать Lisp Machines Inc. и работать по своему плану. И 279 что бы вы думали? Им это удалось! У них появился первый клиент, и им 280 заплатили вперед. Они собирали машины, продавали их и собирали еще и еще. В 281 конце концов они встали на ноги, несмотря на то, что большинство людей в 282 группе им не помогало. Компания Symbolics также начала успешную 283 деятельность, так что было две конкурирующих компании, производящих 284 машины-Лиспы. Когда в Symbolics поняли, что LMI и не думает вылетать в 285 трубу, они стали искать способы разрушить ее.</p> 286 287 <p>Таким образом, за уходом из нашей лаборатории последовала 288 “война” в нашей лаборатории. Уход произошел, когда компания 289 Symbolics переманила всех хакеров, кроме меня и тех немногих, кто по 290 совместительству работал в LMI. Потом они установили правило и исключили 291 тех, кто по совместительству работал в институте, так что им пришлось уйти 292 полностью, и я остался один. Теперь Лаборатория искусственного интеллекта 293 была беспомощна. А институт заключил с этими двумя компаниями одно очень 294 глупое соглашение. Это был трехсторонний договор, в котором обе компании 295 лицензировали исходные тексты системы машины-Лиспа. Эти компании должны были 296 предоставлять свои изменения в пользование института. Но в договоре не 297 говорилось, что институт вправе размещать их в системах своих машин-Лиспов, 298 которые лицензировали обе компании. Никто не предвидел, что группу хакеров 299 Лаборатории искусственного интеллекта разгонят, но так и случилось.</p> 300 301 <p> Итак, в Symbolics созрел план <a href="#foot-4">[4]</a>. Они сказали 302 лаборатории: “Мы продолжим предоставлять в ваше пользование свои 303 изменения в системе, но вам нельзя размещать их в системе машины-Лиспа 304 института. Вместо этого мы предоставим вам доступ к системе машины-Лиспа 305 Symbolics, и вы сможете работать на ней, но это все, что вы можете делать.</p> 306 307 <p>Это фактически означало, что они потребовали от нас встать на ту или другую 308 сторону и пользоваться либо версией института, либо версией Symbolics. Что 309 бы мы ни выбрали, это определяло бы, в какую систему пойдут наши 310 усовершенствования. Если бы мы работали над версией Symbolics и 311 совершенствовали ее, мы поддерживали бы только Symbolics. Если бы мы 312 пользовались версией института и совершенствовали ее, мы предоставляли бы 313 работу в распоряжение обеих компаний, но в Symbolics понимали, что с нашей 314 стороны это было бы поддержкой LMI, потому что мы помогали бы им продолжать 315 существование. Так что нам не позволили оставаться нейтральными.</p> 316 317 <p>Вплоть до этого момента я не принимал сторону ни одной из компаний, хотя мне 318 было больно видеть, что произошло с нашим сообществом и программами. Но 319 теперь компания Symbolics принуждала меня к этому. Итак, пытаясь помочь 320 компании Lisp Machines Inc. удержаться на плаву <a 321 href="#foot-5">[5]</a>, я начал дублировать все улучшения в системе 322 машины-Лиспа, которые делали в Symbolics. Я писал эквивалентные улучшения 323 сам (т.е. тексты программ были моими собственными).</p> 324 325 <p>Через некоторое время <a href="#foot-6">[6]</a> я пришел к заключению, 326 что было бы лучше всего, если бы я даже не заглядывал в их тексты. Когда 327 они делали объявление о выпуске предварительной версии, в котором было 328 описание выпуска, я видел, какие там были функции, а потом реализовывал 329 их. К тому времени, как они выпускали окончательную версию, я тоже выпускал 330 такую версию.</p> 331 332 <p>Таким образом в течение двух лет я не давал им покончить с LMI, и эти две 333 компании продолжали работу. Но я не хотел тратить долгие годы на то, чтобы 334 наказать кого-то, просто мешая злому делу. Я увидел, что они наказаны 335 довольно основательно, потому что они наткнулись на конкуренцию, которая не 336 уходила и не собиралась исчезать <a href="#foot-7">[7]</a>. Тем 337 временем пришла пора начать обустройство нового сообщества взамен того, 338 которое было уничтожено их действиями и действиями других.</p> 339 340 <p>В семидесятых годах сообщество Лиспа не ограничивалось Лабораторией 341 искусственного интеллекта Массачусетского технического института, и не все 342 хакеры были в этом институте. Война, которую начала компания Symbolics, 343 опустошила Массачусетский технический институт, но в то время происходили и 344 другие события. Были люди, которые прекращали сотрудничество, и все это 345 вместе опустошило наше сообщество, и от него почти ничего не осталось.</p> 346 347 <p>Когда я прекратил наказывать Symbolics, мне пришлось придумывать, что делать 348 дальше. Мне нужно было сделать свободную операционную систему, это было 349 ясно — единственным способом дать людям совместно работать и 350 обмениваться была свободная операционная система.</p> 351 352 <p>Сперва я подумывал о создании системы на базе Лиспа, но я осознал, что с 353 технической точки зрения это не хорошо. Чтобы получить что-то подобное 354 системе машины-Лиспа, нужен микрокод специального назначения. Именно это 355 позволяло выполнять программы так же быстро, как другие компьютеры выполняли 356 свои программы, и при этом еще и пользоваться проверкой типов. Без этого все 357 свелось бы к чему-то наподобие компиляторов Лиспа для других 358 машин. Программы были бы быстрее, но они были бы нестабильны. Так вот, это 359 допустимо, если выполнять одну программу на системе с разделением 360 времени — если одна программа дает сбой, это не катастрофа, это 361 нечто, что ваша программа время от времени делает. Но это делало ее 362 недостаточно хорошей, чтобы писать на ней операционную систему, так что я 363 отказался от мысли о том, чтобы сделать систему наподобие машины-Лиспа.</p> 364 365 <p>Вместо этого я решил сделать операционную систему типа Unix, в которой были 366 бы реализации Лиспа, чтобы выполнять пользовательские программы. Ядро было 367 бы написано не на Лиспе, но Лисп у нас был бы. Так что именно разработка 368 этой операционной системы, операционной системы GNU, привела меня к 369 написанию GNU Emacs. В процессе этого я стремился сделать абсолютно 370 минимально возможную реализацию Лиспа. Размер программ имел чрезвычайное 371 значение.</p> 372 373 <p>В то время, в 1985 году, были люди, у которых были одномегабайтные 374 машины без виртуальной памяти. Они хотели быть в состоянии использовать GNU 375 Emacs. Это значило, что мне нужно ограничивать программу как можно меньшим 376 размером.</p> 377 378 <p>Например, в то время единственной циклической конструкцией была 379 <code>while</code>, которая была крайне проста. Не было никаких способов 380 досрочного выхода из оператора <code>while</code>, приходилось просто 381 пользоваться механизмом исключений или проверять переменную в цикле. Это 382 показывает, как далеко я зашел в ограничениях на размер. У нас не было 383 <code>caar</code>, <code>cadr</code> и так далее; “выжать все 384 возможное” — таким духом был пропитан GNU Emacs и его Лисп 385 с самого начала.</p> 386 387 <p>Разумеется, машины сейчас больше, и мы уже так не делаем. Мы заложили 388 <code>caar</code>, <code>cadr</code> и так далее, и сейчас при случае мы 389 могли бы заложить другую циклическую конструкцию. Мы охотно расширим его в 390 некоторых пределах, но мы не хотим расширять его до уровня Общего Лиспа. Я 391 однажды реализовывал Общий Лисп на машине-Лиспе, и мне он не так уж 392 понравился. Одна из вещей, которые мне ужасно не нравятся — 393 аргументы-ключевые слова <a href="#foot-8">[8]</a>. На мой взгляд, это 394 выглядит не совсем по-лисповски; иногда я пишу так, но я свожу к минимуму 395 число случаев, когда я это делаю.</p> 396 397 <p>На этом проекты GNU, связанные с Лиспом, не кончились. Впоследствии, 398 примерно в 1995 году, мы размышляли над организацией проекта 399 графической рабочей среды. Было ясно, что для программ среды нам нужен язык 400 программирования, на котором была бы написана значительная ее часть, чтобы 401 сделать ее легко расширяемой, как редактор. Встал вопрос о том, каким должен 402 быть язык.</p> 403 404 <p>В то время для этих целей усиленно продвигался TCL <a 405 href="#tf2">(2)</a>. Я был очень невысокого мнения о TCL, в основном потому, 406 что это был не Лисп. Он выглядел слегка похожим на Лисп, но семантически он 407 им не был, и он был не таким ясным. Потом кто-то показал мне объявление, в 408 котором компания Sun пыталась нанять кого-нибудь для работы над TCL, чтобы 409 сделать его “стандартом де-факто для языка расширений” во всем 410 мире. А я подумал: “Нам нужно предотвратить это”. Так что мы 411 начали делать Scheme стандартным языком расширений GNU. Не Общий Лисп, 412 потому что он был слишком велик. Идея была в том, что у нас будет 413 интерпретатор Scheme, спроектированный для компоновки в приложения так же, 414 как это делали с TCL. Тогда мы стали бы рекомендовать это как 415 предпочтительный пакет расширений для всех программ GNU.</p> 416 417 <p>Есть одна интересная выгода, которую можно извлечь из применения такого 418 мощного языка, как вариант Лиспа, в качестве первичного языка расширений. Вы 419 можете реализовывать другие языки переводом их на ваш первичный язык. Если 420 ваш первичный язык — TCL, вы не можете легко реализовать Лисп 421 переводом его на TCL. Но если ваш первичный язык — Лисп, то 422 нетрудно реализовывать другие языки, переводя их. Наша идея состояла в том, 423 что если бы каждое расширяемое приложение поддерживало Scheme, то вы могли 424 бы написать реализацию TCL, Python или Perl на Scheme, которая переводит эту 425 программу на Scheme. Тогда вы могли бы загружать ее в любое приложение и 426 надстраивать его под свой любимый язык, и оно работало бы и с другими 427 надстройками.</p> 428 429 <p>До тех пор, пока языки расширения слабы, пользователям приходится применять 430 только тот язык, который вы им предоставляете. Что означает, что людям, 431 влюбленным в какой бы то ни было данный язык, приходится бороться за выбор 432 разработчиков приложений — говоря разработчику приложения: 433 “Заложите, пожалуйста, в свое приложение мой язык, а не 434 его”. Тогда у пользователей вообще не будет выбора — каким 435 бы приложением они ни пользовались, оно приходит с одним языком, и у них нет 436 другого выхода. Но когда у вас мощный язык, который может реализовывать 437 другие языки, переводя с них, то вы предоставляете пользователю выбор языка, 438 и нам больше не приходится вести войну языков. Именно это, как мы надеемся, 439 сделает Guile, наш интерпретатор Scheme. У нас есть человек, который этим 440 летом работает над завершением транслятора с Python на Scheme. Я не знаю, 441 полностью ли он завершен, но если кто-то заинтересован в этом проекте, пусть 442 свяжется. Так что вот какие у нас планы на будущее.</p> 443 444 <p>Я не говорил о свободном программном обеспечении, но позвольте мне кратко 445 рассказать вам немного о том, что это означает. Выражение “свободная 446 программа” подразумевает не стоимость; оно не означает, что вы 447 получаете ее бесплатно. (Возможно, вы заплатили за копию или получили копию 448 бесплатно.) Оно означает, что у вас как у пользователя есть 449 свобода. Жизненно важно то, что вы вольны выполнять программу, вольны 450 изучать, что она делает, вольны изменять ее под свои нужды, вольны 451 перераспространять копии среди других и вольны публиковать улучшенные, 452 расширенные версии. Вот что значит свободная программа. Если вы пользуетесь 453 несвободной программой, вы утратили жизненно важную свободу, так что никогда 454 этого не делайте.</p> 455 456 <p>Назначение проекта GNU заключается в том, чтобы облегчить людям отказ от 457 попирающих свободу, господствующих над пользователем, несвободных программ 458 предоставлением свободных программ для их замены. Для тех, у кого нет 459 моральных сил для отказа от несвободных программ, когда это означает 460 какое-то практическое неудобство,— для них мы пытаемся дать свободную 461 альтернативу, чтобы вы могли перейти к свободе с меньшими усилиями и 462 меньшими жертвами в практическом смысле. Чем меньше жертвы, тем лучше. Мы 463 хотим облегчить для вас сотрудничество и свободную жизнь.</p> 464 465 <p>Сотрудничество — это вопрос свободы. Мы привыкли думать о свободе 466 и сотрудничестве с обществом как о противоположностях. Но в данном случае 467 они на одной стороне. При свободных программах вы вольны и сотрудничать с 468 другими, и помогать самим себе. При несвободных программах кто-то доминирует 469 над вами и разобщает людей. Вам не позволяют обмениваться с ними, вы не 470 вольны сотрудничать или помогать обществу, точно так же, как вы не вольны 471 помочь самим себе. Разобщенность и беспомощность — состояние 472 пользователей, применяющих несвободные программы.</p> 473 474 <p>Мы выработали умопомрачительное количество свободных программ. Мы сделали 475 то, что, как утверждалось, мы никогда не сможем сделать; у нас есть две 476 операционных системы из свободных программ. У нас есть множество приложений, 477 и нам, очевидно, еще много предстоит пройти. Так что нам нужна ваша 478 помощь. Я хотел бы попросить вас стать добровольцами проекта GNU; помогите 479 нам разработать свободные программы для новых задач. Загляните на <a 480 href="/help/">gnu.org/help</a> за предложениями того, как помочь. Если вы 481 хотите заказать что-то, на это есть ссылка с домашней страницы. Если вы 482 хотите почитать о философских вопросах, загляните в /philosophy. Если вы 483 ищете свободные программы для пользования, загляните в /directory, где 484 сейчас перечислено около 1900 пакетов (это только часть всех свободных 485 программ, какие есть). Пожалуйста, пишите новые программы и передавайте 486 нам. Мой сборник очерков, “Свободные программы и свободное 487 общество”, находится в продаже, и его можно приобрести на 488 www.gnu.org. Всего доброго!</p> 489 <div class="column-limit"></div> 490 491 <h3 class="footnote">Примечания</h3> 492 <ol> 493 <li id="foot-1">Гай Стил составил первоначальный симметричный набор команд Emacs; потом мы с 494 ним начали реализовывать Emacs (на базе TECO), но после одной длительной 495 совместной сессии разработки Стил начал отходить, так что Emacs заканчивал 496 я. Другие, в частности, Юджин Чиччарелли и Майк Мак-Магон, внесли свой вклад 497 значительно позднее.</li> 498 499 <li id="foot-2">Берни Гринберг утверждает, что реализация Emacs Дана Уайнреба для 500 машины-Лиспа вышла раньше реализации Гринберга для Multics. Я приношу 501 извинения за эту ошибку.</li> 502 503 <li id="foot-3">План Гринблэтта, насколько я понимаю, заключался в том, чтобы нанимать людей 504 из лаборатории по совместительству, так что они могли продолжать работать в 505 Лаборатории искусственного интеллекта. Symbolics вместо этого нанимала их на 506 полный рабочий день, так что они прекращали работать в институте.</li> 507 508 <li id="foot-4">Этот план основывался на том (в той речи я этого не сказал явно), что в 509 начальный период бывшие хакеры Лаборатории искусственного интеллекта, как в 510 Symbolics, так и в LMI, продолжали вносить свои изменения в систему 511 машины-Лиспа института — хотя по контракту этого не 512 требовалось. План Symbolics заключался в том, чтобы прервать это 513 сотрудничество в одностороннем порядке.</li> 514 515 <li id="foot-5">Не то чтобы меня особенно заботила судьба LMI, но я просто не хотел 516 позволить Symbolics нажиться на своей агрессии по отношению к Лаборатории 517 искусственного интеллекта.</li> 518 519 <li id="foot-6">Из этого утверждения был неверно сделан вывод, что я никогда-никогда не 520 заглядывал в программы Symbolics. В действительности здесь говорится, что я 521 это делал, поначалу. Исходный текст Symbolics был доступен в институте, где 522 я был вправе его читать, и сначала именно так я узнавал об их изменениях. 523 524 <p>Но это значило, что я был вынужден предпринимать особые усилия, чтобы решать 525 каждую задачу по-другому, чтобы избежать копирования программ 526 Symbolics. Через некоторое время я сделал вывод, что лучше даже не 527 смотреть. Так я мог писать программы каким угодно наилучшим образом, не 528 оглядываясь на то, что могло быть в текстах Symbolics.</p></li> 529 530 <li id="foot-7">Symbolics как-то раз выразила в институте протест, в котором говорилось, что 531 моя работа, помешав их плану, стоила компании Symbolics миллион долларов.</li> 532 533 <li id="foot-8">Я не возражаю, если очень сложная и громоздкая функция принимает 534 аргументы-кодовые слова. Беспокоит меня случай, когда ими пользуются такие 535 простые функции, как “member”.</li> 536 537 <li id="foot-9">В 2021 году эту книгу можно купить в магазине <a 538 href="https://shop.fsf.org/books-docs/free-software-free-society-selected-essays-richard-m-stallman-3rd-edition">GNU 539 Press</a>.</li> 540 </ol> 541 </div> 542 543 <div class="translators-notes"> 544 545 <!--TRANSLATORS: Use space (SPC) as msgstr if you don't have notes.--> 546 <h3>Примечания переводчиков</h3> 547 <ol> 548 <li id="tf1"><span lang="en" xml:lang="en">TECO, Text Editor and 549 COrrector</span> — англ. текстовый редактор и корректор.</li> 550 <li id="tf2"><span lang="en" xml:lang="en">TCL, Tool 551 Command Language</span> — англ. инструментальный командный 552 язык.</li> 553 </ol></div> 554 </div> 555 556 <!-- for id="content", starts in the include above --> 557 <!--#include virtual="/server/footer.ru.html" --> 558 <div id="footer" role="contentinfo"> 559 <div class="unprintable"> 560 561 <p>Пожалуйста, присылайте общие запросы фонду и GNU по адресу <a 562 href="mailto:gnu@gnu.org"><gnu@gnu.org></a>. Есть также <a 563 href="/contact/">другие способы связаться</a> с фондом. Отчеты о 564 неработающих ссылках и другие поправки или предложения можно присылать по 565 адресу <a href="mailto:webmasters@gnu.org"><webmasters@gnu.org></a>.</p> 566 567 <p> 568 <!-- TRANSLATORS: Ignore the original text in this paragraph, 569 replace it with the translation of these two: 570 571 We work hard and do our best to provide accurate, good quality 572 translations. However, we are not exempt from imperfection. 573 Please send your comments and general suggestions in this regard 574 to <a href="mailto:web-translators@gnu.org"> 575 576 <web-translators@gnu.org></a>.</p> 577 578 <p>For information on coordinating and contributing translations of 579 our web pages, see <a 580 href="/server/standards/README.translations.html">Translations 581 README</a>. --> 582 Мы старались сделать этот перевод точным и качественным, но исключить 583 возможность ошибки мы не можем. Присылайте, пожалуйста, свои замечания и 584 предложения по переводу по адресу <a 585 href="mailto:web-translators@gnu.org"><web-translators@gnu.org></a>. 586 </p><p>Сведения по координации и предложениям переводов наших статей см. в 587 <a href="/server/standards/README.translations.html">“Руководстве по 588 переводам”</a>.</p> 589 </div> 590 591 <!-- Regarding copyright, in general, standalone pages (as opposed to 592 files generated as part of manuals) on the GNU web server should 593 be under CC BY-ND 4.0. Please do NOT change or remove this 594 without talking with the webmasters or licensing team first. 595 Please make sure the copyright date is consistent with the 596 document. For web pages, it is ok to list just the latest year the 597 document was modified, or published. 598 599 If you wish to list earlier years, that is ok too. 600 Either "2001, 2002, 2003" or "2001-2003" are ok for specifying 601 years, as long as each year in the range is in fact a copyrightable 602 year, i.e., a year in which the document was published (including 603 being publicly visible on the web or in a revision control system). 604 605 There is more detail about copyright years in the GNU Maintainers 606 Information document, www.gnu.org/prep/maintain. --> 607 <p>Copyright © 2003, 2007, 2021, 2013, 2021 Free Software Foundation, Inc.</p> 608 609 <p>Это произведение доступно по <a rel="license" 610 href="http://creativecommons.org/licenses/by-nd/4.0/deed.ru">лицензии 611 Creative Commons Attribution-NoDerivs (<em>Атрибуция — Без 612 производных произведений</em>) 4.0 Всемирная</a>.</p> 613 614 <!--#include virtual="/server/bottom-notes.ru.html" --> 615 <div class="translators-credits"> 616 617 <!--TRANSLATORS: Use space (SPC) as msgstr if you don't want credits.--> 618 <em>Внимание! В подготовке этого перевода участвовал только один человек. Вы 619 можете существенно улучшить перевод, если проверите его и расскажете о 620 найденных ошибках в <a 621 href="http://savannah.gnu.org/projects/www-ru">русской группе переводов 622 gnu.org</a>.</em></div> 623 624 <p class="unprintable"><!-- timestamp start --> 625 Обновлено: 626 627 $Date: 2021/11/02 17:04:14 $ 628 629 <!-- timestamp end --> 630 </p> 631 </div> 632 </div> 633 <!-- for class="inner", starts in the banner include --> 634 </body> 635 </html>