Lisp Programlama Dilini Diğerlerinden Farklı Kılan Unsurlar (What Made Lisp Different)
Manage episode 383412286 series 3528279
"Paul Graham'ın 2001'de yazıp 2002'de revize ettiği bu makale, Lisp programlama dilinin diğer dillerden farklılaşan dokuz özgün özelliğini anlatıyor. Bu özellikler; koşullu ifadeler, fonksiyon tipi, özyineleme, yeni bir değişken kavramı, çöp toplama, ifadelerden oluşan programlar, sembol tipi, kod için bir gösterim ve dilin tamamen kullanılabilir olması. Bu özelliklerin çoğu bugün yaygın olarak kullanılan dillerde de bulunuyor. Graham, Lisp'in 1950'lerin sonunda tasarlandığında, bu özelliklerin çoğunun olağan programlama uygulamalarından çok uzak olduğunu belirtiyor.
---
# Lisp Programlama Dilini Diğerlerinden Farklı Kılan Unsurlar (What Made Lisp Different)
Aralık 2001 (Gözden geçirme: Mayıs 2002)
_(Bu yazıyı, LL1 e-posta listesinden gelen birkaç soruyu yanıtlamak için kaleme aldım. Şimdi ise ""Zeki Çocukların İntikamı"" başlıklı yazımda yer alıyor.)_
1950'lerin sonunda McCarthy, Lisp'i icat ettiğinde, bu dil, o dönemin önemli dillerinden Fortran gibi mevcut dillerden çok daha farklı ve yenilikçi bir yaklaşımdı.
Lisp, tamı tamına dokuz yeni fikri bünyesinde barındırıyordu:
***
**1. Koşullu İfadeler.** Koşullu ifade, bir ""eğer-öyleyse-aksi takdirde"" mantığına dayanır. Şimdi bunu hepimiz gayet iyi biliyoruz ve standart bir özellik olarak görüyoruz. Ancak aslında McCarthy'nin Lisp'i geliştirirken icat ettiği bir şey. (O dönemde Fortran'da sadece donanımdaki dal komutuna dayanan bir koşullu atlama işlemi vardı.) McCarthy, Algol komitesinde yer aldı ve bu koşullu ifadeleri Algol diline ekledi. Bu sayede bu kavram diğer birçok dile de yayıldı.
**2. Fonksiyon Türü.** Lisp'te, fonksiyonlar birinci sınıf vatandaştır - onlar da tam sayılar, metinler vb. gibi birer veri türüdür. Bunlar somut bir biçimde ifade edilebilir, değişkenlerde saklanabilir, argüman olarak geçebilir ve daha pek çok şey.
**3. Özyineleme (Recursion).** Özyineleme, Lisp'ten önce de matematiksel bir kavramdı elbette, ancak onu destekleyen ilk programlama dili Lisp oldu. (Bunun, fonksiyonları birinci sınıf nesneler olarak kabul etmekle zaten var olduğunu da söyleyebiliriz.)
**4. Değişkenlerin Yeni Bir Konsepti.** Lisp dilinde, tüm değişkenler efektif olarak işaretçi görevi görür. Değerler tipleri belirler, değişkenler değil. Bir değişkeni atamak ya da bağlamak, onun işaret ettiği değeri değil, işaretçiyi kopyalamak demektir.
**5. Çöp Toplama.**
**6. İfadelerden Oluşan Programlar.** Lisp programları, her biri bir değer döndüren ifadelerin ağaçlarıdır. (Bazı Lisp çeşitlerinde, ifadeler birden çok değer verebilir.) Bu, Fortran ve çoğu sonraki dil ile karşılaştırıldığında farklılık gösterir çünkü bu diller ifadeler ve ifadeleri birbirinden ayırır.
Fortran dilinde bu ayrımın olması doğaldı çünkü (giriş formatının delikli kartlar olduğu bir dilde şaşırtıcı olmayan bir şekilde) dil, satır bazlıydı. İfadeleri iç içe geçiremezsiniz. Dolayısıyla, matematik işlemlerinin çalışabilmesi için ifadelere ihtiyacınız varken, başka hiçbir şeyin bir değer döndürmesi gereksizdi çünkü onu bekleyen bir şey olamazdı.
Bu kısıtlama, blok yapılandırılmış dillerin gelmesiyle ortadan kalktı, ancak o zaman çok geçti. İfadeler ve cümleler arasındaki farklılık çoktan yerleşmişti. Bu ayrım, Fortran'dan Algol'e ve sonrasında da onların tüm alt dillerine yayıldı.
Bir dil tamamen ifadelerden oluşuyorsa, bu ifadeleri istediğiniz gibi bir araya getirebilirsiniz. İşte bir örnek (Arc dilinin sözdizimi kullanılarak):
(foo durumu için x'i 1 yap, değilse x'i 2 yap)
veya
(= x (if foo 1 2))
**7. Sembol Türü.** Semboller, bir işaretçiyi karşılaştırarak eşitliği kontrol edebilme özelliğiyle, karakter dizilerinden ayrılır.
**8. Sembol Ağaçları Kullanılarak Kodlama** için bir notasyon.
**9. Dil Her Zaman Elinizin Altında.** Okuma, derleme ve çalışma zamanı arasında gerçek bir fark yoktur. Okurken kodu derleyebilir veya çalıştırabilirsiniz, kodu derlemeye devam ederken okuyabilir veya çalıştırabilirsiniz ve aynı şekilde, kod çalışırken de okuyabilir veya derleyebilirsiniz.
Okuma zamanında kod çalıştırmak, kullanıcıların Lisp'in dili üzerinde değişiklik yapabilmelerini sağlar; derleme zamanında kod çalıştırmak, makroların temelini oluşturur; çalışma zamanında derleme, Lisp'in Emacs gibi programlarda genişletme dili olarak kullanılmasını mümkün kılar; ve çalışma zamanında okuma, programların s-ifadeleri (semboller) kullanarak iletişim kurabilmelerini sağlar - bu fikir son zamanlarda XML olarak yeniden popüler oldu.
***
Lisp ilk kez ortaya çıktığında, bu tür düşünceler, 1950'lerin sonlarında mevcut olan donanıma dayanan o zamanki programlama alışkanlıklarından oldukça uzaktaydı.
Zamanla, popüler diller arasında bir evrim gözlenmiştir ve bu evrimin sonucunda varsayılan dil, Lisp'e dönüşmüştür. 1'den 5'e kadar olan özellikler artık yaygın hale gelmiştir. 6 numaralı özellik ana akımda belirmeye başlamıştır. Python, 7'ye benzer bir özelliğe sahip, ancak bunun için belirli bir dil bilgisi yok gibi görünüyor. 8 numaralı özellik, Lisp makrolarının oluşturulmasını sağlayan (9 ile birlikte) özellik, şimdilik yalnızca Lisp'e özgüdür. Bunun nedeni belki de (a) bu özelliğin parantez ya da benzer bir şey gerektirmesi ve (b) bu son güç artışını eklediğinizde, artık yeni bir dil icat ettiğinizi iddia edemezsiniz, sadece yeni bir Lisp lehçesi tasarladığınızı söyleyebilirsiniz. ;-)
Lisp, bugünkü programcılar için yararlı olabilir, ancak onu diğer dillerin kabul ettiği rastgele çözümlerden farklılaştığı şekilde tanımlamak garip. Büyük olasılıkla McCarthy'nin de Lisp'i bu şekilde düşünmediğini sanıyorum. Lisp, Fortran'daki hataları gidermek için tasarlanmamıştı; daha çok bir hesaplama aksiyomu oluşturma girişiminin yan ürünü olarak ortaya çıkmıştı.""
---
İlişkili Konseptler: Lisp programlama dili, Lisp'in tarihi, Lisp'in özellikleri, Lisp vs Fortran, Lisp ve özyineleme, Lisp fonksiyon tipi, Lisp ve çöp toplama, Lisp ifadeleri, Lisp sembol tipi, Lisp kod notasyonu, Lisp dilinin kullanılabilirliği, programlama dillerinin evrimi, Lisp makroları, Lisp ve Python, Lisp ve XML, John McCarthy ve Lisp, hesaplamayı aksiyomatize etme."
216 эпизодов