Lisp Deneyimlerim ve GNU Emacs'in Geliştirilmesi
Richard Stallman'ın Uluslararası Lisp Konferansı'ndaki konuşmasının dökümü, 28 Ekim 2002.
Her zamanki konuşmalarımın hiçbiri Lisp ile ilgili olmadığı için hiçbiri bugüne uygun değildi. Bu yüzden bu sefer hazırlıksız konuşacağım. Kariyerimde Lisp ile bağlantılı yeterince şey yaptığım için ilginç bir şey söyleyebilmeliyim.
Lisp ile ilk deneyimim, lisede Lisp 1.5 kılavuzunu okuduğum zamandı. İşte o zaman böyle bir bilgisayar dili olabileceği fikriyle aklım başımdan gitti. Lisp ile ilk kez bir şey yapma şansım Harvard'da birinci sınıf öğrencisiyken PDP-11 için bir Lisp yorumlayıcısı yazdığım zamandı. Çok küçük bir makineydi, 8k gibi bir belleğe sahipti, ve yorumlayıcıyı bin yönerge ile yazmayı başardım. Bu bana veri için biraz yer bıraktı. Bu, gerçek yazılımın nasıl olduğunu, gerçek sistem işlerini yapanları görmemden önceydi.
MIT'de çalışmaya başladığımda JonL White ile gerçek bir Lisp uygulaması üzerinde çalışmaya başladım. Yapay Zeka Laboratuvarı'nda JonL tarafından değil, Russ Noftsker tarafından işe alındım ki bu, başına gelecekler düşünüldüğünde çok ironikti... o gün için gerçekten pişman olmuş olmalı.
1970'lerde, hayatım korkunç olaylarla politikleşmeden önce, çeşitli programlar için birbiri ardına uzantılar yapıyordum ve çoğunun Lisp ile hiçbir ilgisi yoktu. Ancak bu arada bir metin editörü yazdım, Emacs. Emacs ile ilgili ilginç fikir, bir programlama diline sahip olması ve kullanıcının düzenleme komutlarının bu yorumlanmış programlama dilinde yazabilmesiydi, böylece siz düzenleme yaparken editörünüze yeni komutlar yükleyebiliyordunuz. Kullanmakta olduğunuz programları düzenleyebilir ve sonra onlarla düzenlemeye devam edebilirdiniz. Böylece, programlama dışındaki şeyler için yararlı olan bir sistemimiz vardı ve üstelik onu kullanırken programlayabiliyordunuz. Böyle bir şeyin ilk olanı mı bilmiyorum ama bu alanda ilk editör olduğu kesindi.
Kendi düzenlemenizde kullanmak üzere devasa, karmaşık programlar oluşturma ve ardından bunları diğer insanlarla değiştirme ruhu, o zamanlar AI Lab'de sahip olduğumuz özgürlüğe dayanan işbirliği ruhunu besledi. Buradaki fikir, sahip olduğunuz herhangi bir programın bir kopyasını, onun bir kopyasını isteyen birine verebilmenizdi. Programları kullanmak isteyenlerle paylaştık, bunlar insanlığın bilgisiydi. Bu nedenle, Emacs'ın tasarımıyla yazılımı paylaşma şeklimiz arasında hiçbir örgütlü siyasi düşünce olmamasına rağmen, aralarında bir bağlantı olduğuna ikna oldum, belki de bilinçsiz bir bağlantı. Bence Emacs'a yol açan ve onu olduğu gibi yapan AI Laboratuvarında yaşama şeklimizin doğasıydı.
Özgün Emacs'ta Lisp yoktu. Aşağı düzey bir dil, yorumlanmayan bir dil olan
PDP-10 Assembler vardı. İçinde yazdığımız yorumlayıcı aslında Emacs için
yazılmamıştı, TECO için
yazılmıştı. Bu bizim metin düzenleyicimizdi ve son derece çirkin bir
programlama diliydi, olabildiğince çirkin. Nedeni ise programlama dili
olarak değil editör ve komut dili olarak tasarlanmış
olmasıydı. 5l
, yani beş satırı taşı
veya
i
gibi komutlar ve ardından bir dize ve ardından bu dizeyi
eklemek için bir ESC vardı. Komut dizisi adı verilen bir dizi komuttan
oluşan bir dize yazabiliyordunuz. ESC ESC ile sonlandırırdınız ve program
yürütülürdü.
İnsanlar bu dili programlama olanaklarıyla genişletmek istediler, bu yüzden
bazı eklemeler yaptılar. Örneğin, ilk eklenenlerden biri
< >
şeklindeki bir döngü yapısıydı. Bunları bir
şeylerin etrafına koyardın ve döngü olurdu. Döngüden koşullu olarak çıkmak
için kullanılabilecek başka örtük komutlar da vardı. Emacs'i yazabilmek
için, adları olan alt programlara sahip olmak için özellikler
ekledik. Bundan önce, bir nevi Basic gibiydi ve alt programların adları
olarak yalnızca tek tek harfler olabilirdi. Bununla büyük programları
programlamak zordu, bu yüzden daha uzun adlara sahip olabilmeleri için kod
ekledik. Aslında oldukça gelişmiş bazı araçlar vardı; Lisp'in çözme koruma
aracını TECO'dan aldığını düşünüyorum.
Hepsi de aklınıza gelebilecek en çirkin söz dizimine sahip oldukça karmaşık özellikler yerleştirmeye başladık ve işe yaradı, insanlar her durumda içinde büyük programlar yazabiliyordu. Bariz ders, TECO gibi bir programlama dili olarak tasarlanmamış bir dilin yanlış yol olduğuydu. Uzantılarınızı oluşturmak için kullandığınız dil, sonradan bir programlama dili olarak düşünülmemelidir; bir programlama dili olarak tasarlanmalıdır. Aslında, bu amaç için en iyi programlama dilinin Lisp olduğunu keşfettik.
Bunun [2] olduğunu keşfeden Bernie Greenberg'di. Emacs'ın bir sürümünü Multics MacLisp'te yazdı ve komutlarını MacLisp'te basit bir şekilde yazdı. Editörün kendisi tamamen Lisp ile yazılmıştı. Multics Emacs büyük bir başarı olduğunu kanıtladı, yeni düzenleme komutlarını programlamak o kadar kolaydı ki ofisindeki sekreterler bile onu nasıl kullanacaklarını öğrenmeye başladı. Emacs'in nasıl genişletileceğini gösteren birinin yazdığı bir kılavuzu kullandılar, ancak bunun programlama olduğunu söylemediler. Böylece programlama yapamayacaklarına inanan sekreterler korkmadılar. Kılavuzu okudular, yararlı şeyler yapabileceklerini keşfettiler ve programlamayı öğrendiler.
Böylece Bernie, içinde Lisp bulunan ve Lisp programlarını yeniden yazarak genişletebileceğiniz, sizin için yararlı bir şeyler yapan bir uygulamanın, aslında insanların programlamayı öğrenmesi için çok iyi bir yol olduğunu gördü. Onlara, çoğu alanda muhtemelen yapamayacağınız, kendileri için yararlı olan küçük programlar yazma şansı vermiş oldu. Programcı olacakları noktaya gelene kadar program yazabileceklerine inanmadıkları en zor aşamada kendi pratik kullanımları için cesaretlendirilebildiler.
Bu noktada insanlar, tam donanımlı Lisp uygulamalarının olmadığı bir platformda böyle bir şeyi nasıl elde edebileceklerini merak etmeye başladılar. Multics MacLisp'in bir yorumlayıcısının yanı sıra bir derleyicisi vardı, bu tam teşekküllü bir Lisp sistemiydi, ancak insanlar buna benzer bir şeyi daha önce bir Lisp derleyicisi yazmamış oldukları diğer sistemlerde uygulamak istediler. Eh, eğer Lisp derleyiciniz olmasaydı, tüm düzenleyiciyi Lisp'e yazamazdınız; yorumlanmış Lisp'i çalıştırması gerekseydi, özellikle yeniden görüntüleme çok yavaş olurdu. Bu yüzden melez bir teknik geliştirdik. Fikir, bir Lisp yorumlayıcı ile editörün alt düzey kısımlarını birlikte yazmaktı, böylece editörün bazı kısımları yerleşik Lisp özellikleri olacaktı. Bunlar, optimize etmemiz gerektiğini düşündüğümüz parçalar oldu. Bu, özgün Emacs'ta zaten bilinçli olarak uyguladığımız bir teknikti, çünkü makine dilinde yeniden uyguladığımız ve onları TECO ilkellerine dönüştürdüğümüz oldukça yüksek seviyeli bazı özellikler vardı. Örneğin, bir paragrafı doldurmak için bir TECO ilkeli vardı (aslında bir paragrafı doldurma işinin çoğunu yapmak için, çünkü işin daha az zaman alan bazı kısımları bir TECO programı tarafından daha yüksek düzeyde yapılacaktı). Tüm işi bir TECO programı yazarak yapabilirdiniz, ancak bu çok yavaştı, bu yüzden bir kısmını makine dilinde yaparak optimize ettik. Burada (melez teknikte) aynı fikri kullandık, editörün çoğu Lisp'te yazılacaktı, ancak özellikle hızlı çalışması gereken bazı kısımları daha düşük bir seviyede yazılacaktı.
Bu nedenle, ikinci Emacs uygulamamı yazdığımda, aynı türden bir tasarımı takip ettim. Düşük seviyeli dil artık makine dili değildi, C'ydi. C, UNIX benzeri bir işletim sisteminde çalışan taşınabilir programlar için iyi, verimli bir dildi. Bir Lisp yorumlayıcı vardı, ancak editör arabelleklerini manipüle etme, önde gelen metni ekleme, dosyaları okuma ve yazma, arabelleği ekranda yeniden görüntüleme, editör pencerelerini yönetme gibi özel amaçlı düzenleme işlerini tesis etmek için doğrudan C kullandım.
Şimdi, bu C ile yazılmış ve UNIX üzerinde çalışan ilk Emacs değildi. İlki James Gosling tarafından yazılmıştı ve GosMacs olarak anılıyordu. Onunla garip bir şey oldu. Başlangıçta, orijinal Emacs'ın aynı paylaşım ve işbirliği ruhundan etkilenmiş gibi görünüyordu. Orijinal Emacs'i ilk önce MIT'deki insanlara verdim. Birisi onu Twenex'te çalışacak şekilde taşımak istedi; başlangıçta yalnızca MIT'de kullandığımız Uyumsuz Zaman Paylaşımı Sisteminde çalışıyordu. Onu Twenex'e taşıdılar, bu da dünya çapında onu potansiyel olarak kullanabilecek birkaç yüz kurulum olduğu anlamına geliyordu. “Tüm iyileştirmelerinizi geri göndermeniz gerekir” kuralıyla onlara dağıtmaya başladık, böylece hepimiz yararlanabilecektik. Hiç kimse bunu dayatmaya çalışmadı ama bildiğim kadarıyla insanlar işbirliği yaptı.
Gosling ilk başta bu ruha katılıyor gibi göründü. Bir kılavuza, topluluktaki diğer kişilerin programı bu isme layık olana kadar geliştireceğini umarak programa Emacs adını verdiğini yazdı. Bir topluluğa yönelik, katılmalarını ve programı daha iyi hale getirmelerini istemek, doğru yaklaşımdı. Ama ondan sonra ruhunu değiştirmiş gibi göründü ve onu bir şirkete sattı.
O zamanlar GNU sistemi (birçok kişinin yanlışlıkla "Linux" dediği Özgür Yazılım UNIX benzeri bir işletim sistemi) üzerinde çalışıyordum. UNIX üzerinde çalışan özgür yazılım bir Emacs editörü yoktu. Bununla birlikte, Gosling'in Emacs'lerinin geliştirilmesine katılan bir arkadaşım vardı. Gosling ona e-posta yoluyla kendi sürümünü dağıtması için izin vermişti. Bana o sürümü kullanmamı önerdi. Sonra Gosling'in Emacs'lerinin gerçek bir Lisp'e sahip olmadığını keşfettim. "mocklisp" olarak bilinen bir programlama dili vardı; söz dizimi olarak Lisp'e benzeyen, ancak Lisp'in veri yapılarına sahip olmayan bir dildi. Yani programlar veri değildi ve Lisp'in hayati unsurları eksikti. Veri yapıları karakter dizileri, sayılar ve diğer birkaç özel şeye sahipti.
Onu kullanamayacağım sonucuna vardım ve hepsini değiştirmek zorunda kaldım, bunun ilk adımı gerçek bir Lisp yorumlayıcısı yazmaktı. Düzenleyicinin her parçasını, ad hoc veri yapıları yerine gerçek Lisp veri yapılarına dayalı olarak kademeli olarak uyarladım ve düzenleyicinin içindekilerin veri yapılarını, kullanıcının Lisp programları tarafından açıklanabilir ve manipüle edilebilir hale getirdim.
Tek istisna, yeniden görüntülemeydi. Uzun bir süre, yeniden görüntüleme bir çeşit alternatif dünyaydı. Editör yeniden görüntüleme dünyasına girecek ve çöp toplama, kesinti için güvenli olmayan çok özel veri yapılarıyla işler devam edecek ve bu sırada herhangi bir Lisp programı çalıştıramayacaktınız. Yeniden görüntüleme sırasında Lisp kodunu çalıştırmak artık mümkün olduğundan, bunu değiştirdik. Oldukça uygun bir şeydi.
Bu ikinci Emacs programı “Özgür Yazılım”dı; terimin modern anlamında. Yazılımı özgür kılmak için açık bir siyasi kampanyanın parçasıydı. Bu kampanyanın özü, herkesin eski günlerde MIT'de yaptığımız şeyleri yapmakta özgür olması, yazılım üzerinde birlikte çalışması ve bizimle çalışmak isteyenlerle birlikte çalışmasıydı. Özgür Yazılım hareketinin, MIT AI laboratuvarında yaşadığım deneyimin, insan bilgisi üzerinde çalıştığım ve kimsenin insani bilgiyi daha fazla kullanmasına ve yaymasına engel olmamasının temeli buydu.
O zamanlar, Lisp'i onlardan çok daha hızlı çalıştırması ve her işlemde tam
tip denetimi yapması dışında, Lisp için tasarlanmamış diğer bilgisayarlarla
hemen hemen aynı fiyat aralığında bir bilgisayar yapabilirdiniz. Sıradan
bilgisayarlar genellikle sizi çalışma hızı ile iyi tip denetimi arasında
seçim yapmaya zorlardı. Yani evet, bir Lisp derleyiciniz olabilir ve
programlarınızı hızlı bir şekilde çalıştırabilirdiniz, ancak bir sayıdan
car
almaya çalıştıklarında saçma sapan sonuçlar alırdı ve
sonunda bir noktada çökerdi.
Lisp makinesi, yönergeleri diğer makineler kadar hızlı yürütebiliyordu,
ancak her bir yönerge, bir car
yönergesi, veri tip kontrolü
yapardı. Bu nedenle, car
'ı almaya çalıştığınızda derlenmiş bir
programdaki bir sayı, size anında bir hata verirdi. Makineyi yaptık ve bunun
için bir Lisp işletim sistemine sahip olduk. Neredeyse tamamı Lisp'te
yazılmıştı, tek istisna mikro kodda yazılan kısımlardı. İnsanlar makineleri
üretmekle ilgilenmeye başladı, bu da bir şirket kurmaları gerektiği anlamına
geliyordu.
Bu şirketin nasıl olması gerektiğine dair iki farklı fikir vardı. Greenblatt, “üstat”[1] şirketi dediği şeyi başlatmak istedi. Bu, üstatlar tarafından yönetilen bir şirket olacağı ve üstatlara elverişli bir şekilde çalışacağı anlamına geliyordu. Diğer bir hedef ise Yapay Zeka Laboratuvarı kültürünü [3] sürdürmekti. Ne yazık ki Greenblatt'ın herhangi bir iş deneyimi yoktu, bu nedenle Lisp makine grubundaki diğer kişiler onun başarılı olup olmayacağından şüphe duyduklarını söylediler. Dış yatırımdan kaçınma planının işe yaramayacağını düşündüler.
Neden dış yatırımdan kaçınmak istedi? Çünkü bir şirketin dışarıdan yatırımcısı olunca denetimi ele alıyorlar ve size bir tereddüt yaşatmıyorlardı. Ve sonunda, herhangi bir tereddütünüz varsa, yönetici olarak da sizi değiştirirlerdi.
Greenblatt'ın aklına, parçaları satın almak için peşin ödeme yapacak bir müşteri bulacağı fikri geldi. Makineler yapıp teslim edeceklerdi; bu parçalardan elde ettikleri kârla, daha sonra birkaç makine için daha parça satın alabilecekler, bunları satabilecekler ve ardından daha fazla sayıda makine için parça satın alabilecekler ve bu böyle devam edecekti. Gruptaki diğer insanlar bunun işe yaramayacağını düşündüler.
Greenblatt daha sonra, beni işe alan, sonrasında Yapay Zeka Laboratuvarından ayrılan ve başarılı bir şirket kuran Russell Noftsker'ı işe aldı. Russell'ın iş için bir yeteneği olduğuna inanılıyordu. Gruptaki diğer insanlara “Greenblatt'ı bir kenara bırakalım, onun fikirlerini unutalım ve başka bir şirket kuralım” diyerek bu iş yeteneğini gösterdi. Arkadan hançerliyordu, belli ki gerçek bir iş adamıydı. Bu insanlar Symbolics adında bir şirket kurmaya karar verdiler. Dışarıdan yatırım alabilir, çekinmeden kazanmak için ellerinden gelen her şeyi yaparlardı.
Ancak Greenblatt pes etmedi. O ve ona sadık birkaç kişi yine de Lisp Machines Inc.'i kurmaya ve planlarını sürdürmeye karar verdiler. Ve ne dersiniz, başardılar! İlk müşteriyi aldılar ve peşin ödeme aldılar. Makineler yapıp sattılar ve daha çok makine, daha çok makine yaptılar. Gruptaki çoğu insanın yardımına sahip olmasalar da aslında başardılar. Symbolics de başarılı bir başlangıç yaptı, dolayısıyla iki rakip Lisp makinesi şirketiniz oldu. Symbolics, LMI'nin başarısız olmayacağını görünce, onu yok etmenin yollarını aramaya başladı.
Böylece laboratuvarımızın terk edilmesinin ardından “savaş” geldi. Bizim laboratuvarı terk etmemiz, Symbolics, ben ve LMI'da yarı zamanlı çalışan birkaç kişi dışındaki tüm üstatları işe aldığında gerçekleşti. Sonra bir kural koydular ve MIT'te yarı zamanlı çalışmayı ortadan kaldırdılar, bu yüzden öyle çalışan insanlar tamamen ayrılmak zorunda kaldılar ve geriye sadece ben kaldım. AI laboratuvarı artık çaresizdi. Ve MIT bu iki şirketle çok aptalca bir anlaşma yapmıştı. Her iki şirketin de Lisp makine sistem kaynaklarının kullanımına lisans verdiği üç yönlü bir sözleşmeydi. Bu şirketlerin, değişikliklerini MIT'in kullanımına izin vermesi gerekiyordu. Ancak sözleşmede, MIT'nin bunları her iki şirketin de lisansladığı MIT Lisp makine sistemlerine koymaya yetkili olduğu yazmıyordu. AI laboratuvarının üstat grubunun ortadan kaldırılacağını kimse tahmin etmemişti ama sonuç buydu.
Bunun üzerine Symbolics bir plan önerdi [4]. Laboratuvara “Sistemdeki değişikliklerimizi sizin kullanımınıza sunmaya devam edeceğiz, ancak bunu MIT Lisp makine sistemine koyamazsınız. Bunun yerine, Symbolics'in Lisp makine sistemine erişmenizi sağlayacağız ve onu çalıştırabileceksiniz, ancak yapabileceğiniz tek şey budur” dediler.
Bu, aslında, bir taraf seçmemizi ve sistemin MIT sürümünü veya Symbolics sürümünü kullanmamızı talep ettikleri anlamına geliyordu. Hangi seçimi yaparsak yapalım, iyileştirmelerimizin hangi sisteme gideceğini belirledik. Symbolics sürümü üzerinde çalışıp geliştirseydik, yalnızca Symbolics'i destekliyor olurduk. Sistemin MIT sürümünü kullanıp geliştirseydik, her iki şirket için de mevcut olan işleri yapıyor olurduk, ancak Symbolics LMI'yi destekleyeceğimizi çünkü onların varlığını sürdürmelerine yardımcı olacağımızı gördü. Bu yüzden artık tarafsız olmamıza izin verilmedi.
Topluluğumuzun ve yazılımın başına gelenleri görmek beni üzse de, o ana kadar her iki şirketin de tarafını tutmamıştım. Ama şimdi, Symbolics konuyla yüzleşmeye zorlamıştı. Bu nedenle, Lisp Machines Inc.'in devam etmesine yardımcı olma çabasıyla [5]—Symbolics'in Lisp makine sisteminde yer alan yaptığı tüm iyileştirmeleri kopyalamaya başladım. Eşdeğer geliştirmeleri yine kendim yazdım (yani kod bana aitti).
Bir süre sonra [6], kodlarına bakmasam daha iyi olacağı sonucuna vardım. Sürüm notlarını veren bir beta duyurusu yaptıklarında, özelliklerin ne olduğunu görür ve gerçekleştirirdim. Gerçek bir yayın yaptıklarında ben de yaptım.
Bu şekilde iki yıl boyunca Lisp Machines Incorporated'ı yok etmelerini engelledim ve iki şirket devam etti. Ama yıllarımı birini cezalandırmak, sadece kötü bir eylemi engellemek için harcamak istemedim. Ayrılmayan veya yok olmayacak olan bir rekabete saplanıp kaldıkları için iyice cezalandırıldıklarını düşündüm [7]. Bu arada, eylemlerinin ve diğerlerinin yok ettiği topluluğun yerini alacak yeni bir topluluk oluşturmaya başlamanın zamanı gelmişti.
70'lerdeki Lisp topluluğu, MIT Yapay Zeka Laboratuvarı ile sınırlı değildi ve üstatların tamamı MIT'de değildi. Symbolics'in başlattığı savaş, MIT'i yok eden şeydi ama o sırada başka olaylar da oluyordu. İşbirliğinden vazgeçen insanlar vardı ve bu birlikte topluluğu yok etti ve geriye pek bir şey kalmadı.
Symbolics'i cezalandırmayı bıraktığımda, bundan sonra ne yapacağımı bulmam gerekiyordu. Özgür bir işletim sistemi yazmak zorundaydım, bu açıktı; insanların birlikte çalışıp paylaşabilmelerinin tek yolu özgür bir işletim sistemiydi.
İlk başta Lisp tabanlı bir sistem yapmayı düşündüm ama bunun teknik olarak iyi bir fikir olmayacağını anladım. Lisp makine sistemi gibi bir şeye sahip olmak için özel amaçlı mikro koda ihtiyacınız vardı. Bu, programları diğer bilgisayarların kendi programlarını çalıştıracağı kadar hızlı çalıştırmayı ve yine de tip denetiminden yararlanmayı mümkün kılan şeydi. Bu olmadan, diğer makineler için Lisp derleyicileri gibi bir şeye indirgenmiş olurdunuz. Programlar daha hızlı, ancak kararsız olacaktı. Şimdi, bir zaman paylaşımlı sistemde bir program çalıştırıyorsanız, sorun değil; bir program çökerse, bu bir felaket değildi, bu programınızın ara sıra yaptığı bir şeydi. Ancak bu, işletim sistemini yazmak için iyi bir şey yapmadı, bu yüzden Lisp makinesi gibi bir sistem yapma fikrini reddettim.
Bunun yerine, kullanıcı programları olarak çalışacak Lisp uygulamalarına sahip UNIX benzeri bir işletim sistemi yazmaya karar verdim. Çekirdek Lisp'te yazılamazdı ama bizde Lisp vardı. Bu işletim sisteminin, GNU işletim sisteminin, geliştirilmesi beni GNU Emacs'i yazmaya iten şeydi. Bunu yaparken, mümkün olan en az sayıda Lisp uygulaması yapmayı amaçladım. Programların boyutu muazzam bir endişe kaynağıydı.
O günlerde, 1985'te sanal belleği olmayan bir megabaytlık makineleri olan insanlar vardı. GNU Emacs'ı kullanabilmek istediler. Bu, programı olabildiğince küçük tutmam gerektiği anlamına geliyordu.
Örneğin, o zamanlar tek döngü yapısı son derece basit olan
while
idi. while
deyiminden çıkmanın bir yolu
yoktu, tek yapmanız gereken bir yakalama ve fırlatma işlemi yapmak veya
döngüyü çalıştıran bir değişkeni test etmekti. Bu, işleri küçük tutmak için
ne kadar ileri gittiğimi gösteriyor. caar
ve cadr
vb. yoktu; başından beri Emacs Lisp'in ruhu olan “mümkün olan her şeyi
sıkıştırın” GNU Emacs'ın de ruhuydu.
Açıkçası, makineler artık daha büyük ve artık bu şekilde
yapmıyoruz. caar
ve cadr
vb. koyduk ve bu günlerde
başka bir döngü yapısı koyabiliriz. Şimdi biraz genişletmek istiyoruz, ancak
yaygın Lisp düzeyine genişletmek istemiyoruz. Common Lisp'i bir kez Lisp
makinesinde uyguladım ve bundan o kadar da memnun değildim. Çok fazla
sevmediğim bir şey de anahtar kelime bağımsız değişkenleri [8]. Bana pek Lisp gibi görünmüyorlardı; Bazen yapıyorum
ama bunu yaptığım zamanları en aza indiriyorum.
Lisp ile ilgili GNU projelerinin sonu bu değildi. Daha sonra 1995 civarında, bir grafik masaüstü projesi başlatmayı düşünüyorduk. Masaüstündeki programlar için, düzenleyici gibi kolayca genişletilebilir hale getirmek için birçoğunu yazacak bir programlama dili istediğimiz açıktı. Soru, ne olması gerektiğiydi.
O zamanlar TCL bu amaç için yoğun bir şekilde iteleniyordu. Temelde Lisp olmadığı için TCL hakkında çok az bir fikrim vardı. Biraz Lisp'e benziyor, ama anlamsal olarak öyle değildi ve o kadar temiz değildi. Sonra birisi bana, Sun'ın TCL'yi dünyanın “fiilen standart genişletme dili” yapmak için birini işe almaya çalıştığı ilanı gösterdi. Ben de “Bunun olmasını engellemeliyiz” diye düşündüm. Böylece Scheme'i GNU için standart genişletilebilirlik dili yapmaya başladık. Common Lisp değil çünkü çok büyüktü. Buradaki fikir, TCL'nin uygulamalara bağlanmasıyla aynı şekilde uygulamalara bağlanmak üzere tasarlanmış bir Scheme yorumlayıcımız olmasıydı. O zaman bunu tüm GNU programları için tercih edilen genişletilebilirlik paketi olarak öneriyor olduk.
Birincil genişletilebilirlik diliniz olarak Lisp'in bir sürümü gibi güçlü bir dili kullanmaktan elde edebileceğiniz ilginç bir yarar var. Diğer dilleri ana dilinize çevirerek uygulayabilirsiniz. Birincil diliniz TCL ise, Lisp'i TCL'ye çevirerek kolayca uygulayamazsınız. Ama ana diliniz Lisp ise diğer şeyleri çevirerek uygulamak o kadar da zor değil. Bizim fikrimiz, her genişletilebilir uygulama Scheme'i destekliyorsa, Scheme'de bu programı Scheme'e çeviren bir TCL veya Python veya Perl uygulaması yazabilmenizdi. Ardından, bunu herhangi bir uygulamaya yükleyebilir ve en sevdiğiniz dilde özelleştirebilir ve diğer özelleştirmelerle de çalışırdı.
Genişletilebilirlik dilleri zayıf olduğu sürece, kullanıcılar yalnızca sizin sağladığınız dili kullanmak zorundadır. Bu, herhangi bir dili seven insanların, “Lütfen, uygulama geliştirici, uygulamanıza benim dilimi koyun, onun dilini değil” diyerek, uygulama geliştiricilerinin seçimi için rekabet etmesi gerektiği anlamına gelir. O zaman kullanıcılara hiçbir seçenek sunulmaz; hangi uygulamayı kullanıyor olurlarsa olsunlar, tek bir dille gelirler ve [o dilde] takılıp kalırlar. Ancak diğer dilleri ona çevirerek uygulayabilen güçlü bir dile sahip olduğunuzda, kullanıcıya bir dil seçeneği sunarsınız ve artık bir dil savaşına girmek zorunda kalmayız. Scheme yorumlayıcımız olan Guile'nin bunu yapacağını umuyoruz. Geçen yaz Python'dan Scheme'e bir çevirmeni bitirmek için çalışan bir kişimiz vardı. Henüz tamamen bitti mi bilmiyorum ama bu projeyle ilgilenenler lütfen iletişime geçsin. Yani geleceğe ilişkin planımız budur.
Özgür yazılım hakkında konuşmuyorum ama ne anlama geldiğinden kısaca söz edeyim. Özgür yazılım ücret hakkında değildir; ücretsiz aldığınız anlamına gelmez. (Bir kopya için ödeme yapmış veya bedelsiz bir kopya almış olabilirsiniz.) Özgür yazılım, kullanıcı olarak özgür olduğunuz anlamına gelir. Önemli olan, programı çalıştırmakta, ne işe yaradığını incelemekte, ihtiyaçlarınıza göre değiştirmekte, başkalarının kopyalarını yeniden dağıtmakta ve geliştirilmiş, genişletilmiş sürümleri yayınlamakta özgür olmanızdır. Özgür yazılımın anlamı budur. Özgür olmayan bir program kullanıyorsanız, çok önemli olan özgürlüğünüzü kaybettiğiniz anlamına gelir, o yüzden bunu asla yapmayın.
GNU projesinin amacı, insanların, özgürlüğü ayaklar altına alan, kullanıcıya hükmeden, özgür olmayan yazılımları; onların yerini alacak Özgür Yazılımlar sağlayarak reddetmelerini kolaylaştırmaktır. Özgür olmayan yazılımı reddedecek ahlaki cesarete sahip olmayanlar için, bu bazı pratik rahatsızlıklar anlamına geldiğinde, yapmaya çalıştığımız şey özgür bir alternatif sunmaktır, böylece pratik anlamda daha az karmaşa ve daha az fedakarlık ile özgürlüğe ilerleyebilirsiniz. Ne kadar az fedakarlık o kadar iyi. Özgürce yaşamanızı, işbirliği yapmanızı kolaylaştırmak istiyoruz.
Bu, işbirliği yapma özgürlüğü meselesidir. Özgürlük ve toplumla işbirliğini sanki zıt şeylermiş gibi düşünmeye alışkınız. Ama burada aynı taraftalar. Özgür yazılımla, diğer insanlarla işbirliği yapmakta ve kendinize yardımcı olmakta özgürsünüz. Özgür olmayan yazılımla, birisi size hükmediyor ve insanları bölünmüş durumda tutuyor. Onlarla paylaşmanıza izin verilmiyor, işbirliği yapmakta veya topluma yardım etmekte özgür değilsiniz, kendinize yardımcı olmakta özgür olduğunuz kadar değil. Bölünmüşlük ve çaresizlik, özgür olmayan yazılım kullanan kullanıcıların durumudur.
Muazzam bir Özgür Yazılım yelpazesi ürettik. İnsanların asla yapamayacağımızı söylediği şeyi yaptık; iki özgür yazılım işletim sistemimiz var. Birçok uygulamamız var ve açıkçası daha gidecek çok yolumuz var. Bu yüzden yardımına ihtiyacımız var. Sizden GNU projesi için gönüllü olmanızı rica ediyorum; daha fazla iş için özgür yazılım geliştirmemize yardımcı olun. Nasıl yardım edebileceğinize ilişkin öneriler bulmak için gnu.org/help adresine bakın. Bir şeyler sipariş etmek isterseniz, ana sayfadan buna bir bağlantı var. Felsefi konular hakkında okumak istiyorsanız, /felsefe bölümüne bakın. Kullanılacak Özgür Yazılım arıyorsanız, şu anda yaklaşık 1900 paketin listelendiği /directory dizinine bakın (bu mevcut tüm Özgür Yazıılımların yalnızca bir kısmıdır). Lütfen daha fazla yazın ve bize katkıda bulunun. Deneme kitabım, “Özgür Yazılım Özgür Toplum” satıştadır ve www.gnu.org [9] adresinden satın alınabilir. Happy Hacking !
Dipnotlar
- Guy Steele orijinal simetrik Emacs komut setini tasarladı; sonra o ve ben Emacs'ı (TECO'nun üstüne) uygulamaya başladık, ancak uzun bir ortak geliştirme seansından sonra Steele uzaklaşmaya başladı, bu yüzden Emacs'ı bitirdim. Başta Eugene C. Cicciarelli ve Mike McMahon olmak üzere başkaları da daha sonra önemli ölçüde katkıda bulundular.
- Bernie Greenberg, Dan Weinreb'in Lisp Machine için Emacs uygulamasının Greenberg'in Multics uygulamasından önce geldiğini söylüyor. Hata için özür dilerim.
- Greenblatt'ın planı, anladığım kadarıyla, yapay zeka laboratuvarında çalışmaya devam edebilmeleri için laboratuvar çalışanlarını yarı zamanlı olarak işe almaktı. Bunun yerine Symbolics onları tam zamanlı olarak işe aldı, bu yüzden MIT'de çalışmayı bıraktılar.
- Konuşmada açıkça belirtmediğim bu planın geçmişi, başlangıç döneminde Symbolics veya LMI'daki eski AI-Lab üstatlarının, MIT Lisp Machine sistemindeki değişikliklere, sözleşme bunu gerektirmese bile, katkıda bulunmaya devam etmeleridir. Symbolics'in planı, bu işbirliğini tek taraflı olarak bozmaktı.
- LMI'nin kaderini özellikle umursadığımdan değil, aksine Symbolics'in AI Lab'a karşı saldırganlığından kazanç elde etmesine izin vermek istemedim.
- Bu ifade, Symbolics'in koduna asla ama asla bakmadığım şeklinde yanlış
yorumlanmıştır. Aslında ilk başta baktığımı söylüyor. Symbolics kaynak kodu,
onu okumaya yetkim olan MIT'de mevcuttu ve değişikliklerini ilk başta bu
şekilde öğrendim.
Ancak bu, Symbolics kodunu kopyalamaktan kaçınmak için her sorunu farklı şekilde çözmek için özel bir çaba göstermem gerektiği anlamına geliyordu. Bir süre sonra bakmamanın daha iyi olacağına karar verdim. Bu şekilde, Symbolics'in kodunda ne olabileceğiyle ilgilenmeden en iyi şekilde kod yazabilirdim.
- Symbolics bir noktada MIT'ye benim çalışmamın, planlarını engelleyerek Symbolics'e bir milyon dolara mal olduğunu söyleyerek itiraz etti.
- Çok karmaşık ve ağır bir işlevin anahtar kelime bağımsız değişkenleri alması umurumda değil. Beni rahatsız eden, “member” (üye) gibi basit temel işlevlerin onları kullanmasıydı.
- 2021'de bu kitap GNU Press'ten alınabilir.