Lisp

Lisp
Logo.
İlk versiyonun tarihi 1958
Paradigmalar işlevsel , zorunlu
Yazar John McCarthy
Yazıyor dinamik
Lehçeler Ortak Lisp , Emacs Lisp , Şema , Clojure
Tarafından etkilenmiş Bilgi İşleme Dili
İşletim sistemi Çapraz platform

Lisp en eski aile hem zorunlu ve fonksiyonel programlama dilleri . Başlangıçta programları temsil etmek için pratik bir model olarak geliştirilen (Turing'in makinesinin teorik kavramının aksine ), 1970'lerde ve 80'lerde yapay zeka araştırmaları için tercih edilen dil haline geldi . Lisp diller kadar birçok alanda bugün kullanılmakta ve web programlama için finans ve bazı bilgisayar eğitim kurslarına.

Lisp terimi , İngilizce " liste işleme  " den  türetilmiştir . Lisp'in tüm lehçeleri aynı basit bağlantılı liste işleme operatörlerini paylaşır. Lisp ayrıca, ön ekli gösterimde basit bir sözdizimi , dinamik veri tiplemesi , işlevsel programlama desteği , otomatik bellek yönetimi ve bir veri yapısı olarak kaynak kodunu işleme yeteneği ile ayırt edilir .

Lisp dilleri görünümleriyle hemen tanınır. Kaynak parantez sözdizimi - Program listeleri gibi aynı sözdizimi kullanılarak yazılır S-ifadeleri . Bir programın (veya veri yapısının) her alt ifadesi parantezlerle sınırlandırılmıştır. Bu , Lisp programlarının ayrıştırılmasını büyük ölçüde basitleştirir ve meta programlamayı basitleştirir - başka programlar oluşturan veya mevcut programı değiştiren programların oluşturulması.

Makine dilini ve montaj dilini (veya daha yaygın olarak " assembly  ") hariç  tutarsak, Lisp yaygın olarak kullanılan diller arasında en eski ikinci dildir ( Fortran'dan hemen sonra ). Lisp, 1960'ların başından beri çok gelişti ve birçok lehçeyi doğurdu.

Tarih

Lisp dili tarafından icat edilmiştir John McCarthy içinde 1958 o iken Massachusetts Teknoloji Enstitüsü (MIT). 1960 yılında CACM dergisinde "Sembolik İfadelerin Özyinelemeli İşlevleri ve Makineye Göre Hesaplamaları, Bölüm I" başlıklı bir makale yayınladı  ; Bölüm II asla yayınlanmadı.

İlk yorumlayıcı bir IBM 704 bilgisayarında çalışıyordu ve bu makineden alınan iki talimat Lisp'in listeleri ayırmak için kullandığı iki ilkel işlem haline geldi:

Bir birinci elemandan ve bir listeden bir liste yapma işlemi not edilir cons.

John McCarthy makalesinde iki sözdizimi sunar: S-ifadeleri (bazen " sexp " olarak adlandırılan sembolik ifadeler  ) ve M-ifadeleri ( homoisitenin S-ifadelerini işleyen fonksiyonları ifade etmesine izin veren meta -ifadeler, başka bir deyişle yansımayı vurgulamak için ). M-ifadeleri hiç bu kadar popüler olmamıştı ve bugünlerde Lisps'in çoğu hem programlar hem de veriler için S-ifadelerini kullanıyor. Lisp'in parantez bolluğunu eleştirmesine neden olan, S-ifadelerinin sözdizimidir, ancak aynı zamanda dilin gücü ve esnekliğinin nedenlerinden biridir.

Etkileyiciliği ve esnekliği nedeniyle Lisp, yapay zeka topluluğunda çok başarılıydı (bkz. Katkılar).

Gelen 1970'lerin , Lisp programlarının yürütülmesi konusunda uzmanlaşmış bilgisayarlar yaratıldı: Lisp makineleri .

Sırasında 1980 ve 1990'larda , büyük çabalar ortaya çıkmıştı Lisp birçok lehçeleri birleştirmeye yapılmıştır. Sonuç, ANSI standardı “ANSI X3.226-1994 Bilgi Teknolojisi Programlama Dili Common Lisp  ” referansı altında 1994 yılında yayınlanan Common Lisp'in standardizasyonu oldu . ISO 1997'de kendi tarafında yayınlanan standart ISLISP (in) ISO / IEC 13816: 1997 (E) , standart tarafından 2007 yılında revize ISO / IEC 13816: 2007 (E) . O zamanlar Lisp, altın çağındakinden çok daha az gelişiyordu.  

Makineye yakın diller (C, C ++) veya daha yapılandırılmış ve yazılmış diller ( Haskell ) tarafından gölgelenmesine rağmen , Lisp nispeten kullanılan bir dil olmaya devam ediyor, özellikle de uygulamalara gömülü bir dil olarak dil uzantısı . Lisp'in en tanınmış gömülü kullanım durumları metin editörü olan Emacs ve dil AutoLISP  (in) arasında AutoCAD . Ayrıca, Lisp'in Debian işletim sisteminde yayınlanan 8.600 kaynak paketini uygulamak için kullanılan kod satırları açısından dördüncü sırada yer aldığını da belirtmek gerekir .Haziran 2005. İlk sekiz dil şu şekilde dağıtılır: C (% 57), C ++ (% 16,8), Shell (% 9), Lisp (% 3), Perl (% 2,8), Python (% 1,8), Java (% 1.6), Fortran (% 1.2). İçindeTemmuz 2013Lisp 15 yerleştirilir inci pozisyonuna TIOBE indeksi . Temmuz 2020 yılında 34 sırada th .

Sözdizimi

Listeler parantezlerle sınırlandırılır ve öğeleri boşluklarla ayrılır: (1 2 " foo ") . Bir Lisp programı, listelerden oluşan bir sözdizimi ağacıdır . Parantezlerin bu şekilde kullanılması, LISP kısaltmasının kullanılmasıyla alay konusu olmaya yol açar: "  Lots of Irritating and Aptal Parantez  " veya "  Lots of Insipid and Aptal Parantez  " tatsız ve aptal ") veya" Aptalca Parantezli Bilgisayar Dili "veya" Tatsız Dil Doymuş Parantezli ".

Lisp ifade odaklı bir dildir: "ifadeler" ve "talimatlar" arasında birçok dilde olduğu gibi (örneğin Pascal ) ayrım yapmaz ; her şey ifadedir ve bir değer veya bir dizi değer döndürür.

Lisp ifadelerinin çoğu işlev uygulamalarıdır. Başka hangi diller yazıyor

f(a,b,c)

Lisp yazıyor

(f a b c)

Yani bir miktar yazılmaz

1+2+3+4

veya

somme(1,2,3,4)

Fakat

(+ 1 2 3 4)

Aynı önekli gösterim ( Lehçe gösterimi olarak bilinir ) "özel şekiller" ve "makrolar" için kullanılır: listedeki ilk öğe, bu durumlarda, sonraki öğelerin nasıl işleneceğini belirler. Bir ifade, birinci öğenin doğasına bağlı olarak bir işlev uygulaması, özel bir form veya bir makro uygulaması olabilir.

EBNF gösteriminde sözdizimi

Lisp dili, minimum kavram kullanan çok basit ve zarif bir sözdizimine sahiptir. Bu kavram ekonomisi, Gregory Chaitin'i bu sözdizimini "matematiksel ihtişamın mücevheri ve katı entelektüel güzelliğin bir mücevheri" olarak nitelendirmesine yol açar .

Tersine, hata tespitine izin vermez.

Lisp dilinin çoğu yalnızca üç EBNF kuralıyla tanımlanır  :

list -> '(' expression* ')' expression -> atom | list atom -> number | name | string | operator

Bu kurallar aşağıdaki şekilde Fransızca olarak tercüme edilebilir:

  • bir Lisp programı bir ifade listesidir:
  • bir ifade bir atom veya bir liste ( özyineleme ) olabilir;
  • bir atom şunlardan biridir: bir sayı, bir isim, bir karakter dizesi, bir operatör.

Örnekler

Aşağıdaki programlar gerçek Lisp programlarına özgü değildir. Lisp'e bilgisayar derslerinde yaptığımız tipik sunumlardır. Örnekler, Common Lisp sözdiziminde verilmiştir .

Faktöriyel harika bir klasik:

(defun factorial (n) "Calcule la factorielle de l'entier n." (if (<= n 1) 1 (* n (factorial (- n 1)))))

Ayrıca daha verimli yazabiliriz (bkz. Terminal özyinelemesi ):

(defun factorial (n &optional (acc 1)) "Calcule la factorielle de l'entier n." (if (<= n 1) acc (factorial (- n 1) (* acc n))))

Bir başka tipik örnek, bir listeyi ters çeviren bu işlevdir (Lisp, bu amaç için yerleşik bir ters işlevi vardır ):

(defun reverse (l &optional (acc '())) "Renverse la liste l." (if (null l) acc (reverse (cdr l) (cons (car l) acc))))

Katkılar

Şimdiye kadar geliştirilen dijital programlamanın aksine sayılar yerine sembollerle çalışan Lisp, yapay zekayı mümkün kılan farklı bir programlama stili yarattı .

Bu nedenle, örneğin, sözde doğal diyaloglar (cf Eliza , Turing testi ).

Dahası, işlevleri ve programları verileriyle aynı biçime sahiptir ( homoconicity özelliği ).

Bu nedenle Lisp'te aynadan geçebiliriz . Yani,

  • bir görevin (belirli bir özgürlükle yürütülecek komutların listesi) alınması üzerine, önce bu listeyi ve çevresini düşünerek, bu komutları emreden, sonra bunları benimsediği sırayla yürüten bir robotu simüle edebiliriz; aslında, ( eval komutu) , şimdiye kadar statik veriler olan komutun başlığını değerlendirilecek bir ifade olarak ele alır;
  • içinde ters mühendislik , biz bu fonksiyonu bulmaya bilinmeyen fonksiyonun iz başlayabilirsiniz; çeşitli teknikleri (ilk farklar, saniyeler ... ve benzer bölümler) birleştirerek
    • özdeşlikler önermek ve bunların akla yatkınlığını karakterize etmek;
    • bir işlev adını ve bir tanımı birbirine bağlayan ( tanımla ) işlevini kullanan bir üreteç işlevini kullanarak, daha ince bir şekilde test edebilmek için her bir tanımlamayı somutlaştıran Lisp kodunu üretir;
  • Lisp'te bir Lisp tercümanı prensibini bile verebiliriz.

Uzun bir süre yalnızca yorumlanmış bir dil olarak kalan Lisp dilinin bir özelliği , 1960'ların ve 1970'lerin diğer yorumlanmış dillerinden farklı olarak, yürütülmesinin derlenmiş diller kadar - veya bazen daha hızlı - olmasıdır . Bu özellik, her nesne türünün (işlev, operatör, veri) yerinin öngörülebilir olmasını sağlayan ve yürütme kod dizisini oluşturmadan önce bir kaynak kod dizisinin ön analizini gerektirmeyen sözdiziminden gelir.

Uzantı: Lisp ve nesneler

Simula'nın etkisi altında, Lisp'ten aşağıdakiler dahil çeşitli nesne sistemleri oluşturuldu:

  • Tatlar uygun tasarımıyla MIT
  • Common Lisp Object Sistemi ( CLOS ), soyundan Tatlandırıcılar

CLOS, çoklu miras, çoklu seçim ve güçlü bir yöntem kombinasyon sistemi sunar. Common Lisp (CLOS'un da bir parçası olduğu) ilk standartlaştırılmış nesne yönelimli dildir.

Alıntılar

“LISP az sayıda güçlü temel kavramlara sahiptir ve diğer her şey bunun üzerine inşa edilmiştir, matematikçilerin çalışma şekli budur; matematiksel teoriler böyle görünür. Bu teoriler, iyi teoriler, bazı yeni anahtar kavramların tanımlanmasından ibarettir ve oradan havai fişekler başlar: yeni yollar ortaya çıkarırlar, radikal bir şekilde yeni dünyalara kapı açarlar. LISP de böyledir; matematiğe çoğu programlama dilinden daha yakındır. En azından eklenen yararlı kısımları ortadan kaldırırsanız, LISP'i kullanışlı bir araç yapan eklemeler . Bunu yaparsanız geriye kalan, LISP'in kavramsal kalbi olan orijinal LISP, matematiksel güzelliğin mücevheri ve sade entelektüel güzelliğin bir mücevheri olan bir kalptir. "

Gregory Chaitin , Meta Maths: The Quest of Omega , 2006, Atlantic, s. 46

Bugün bazı söyleyebilirim Şema Lisp tarafından açıklanan güzelliği ulaşma türevidir Chaitin  ; ve LISP'nin (Maclisp, Interlisp, Zetalisp) geçmiş lehçelerinin büyük küvelerinin doğrudan soyundan gelen Common Lisp'in kavramsal kalbini sağlam tutmasına rağmen dev alet çantasına daha çok eğildiği kesindir .

G. Chaitin bu idealize Lisp'i araştırması için kullandı: Zarif LISP Programları .

En güçlü programlama dili Lisp'dir. Lisp'i (veya onun varyantını, Scheme'yi) bilmiyorsanız, bir programlama dilinin güçlü ve zarif olmasının ne anlama geldiğini bilemezsiniz. Lisp'i öğrendikten sonra, diğer birçok dilde neyin eksik olduğunu göreceksiniz.
Günümüzde özel veri türlerini tanımlamaya odaklanan çoğu dilin aksine, Lisp genel olan birkaç veri türü sağlar. Belirli türleri tanımlamak yerine, bu türlerden yapılar oluşturursunuz. Bu nedenle, bu türden bir listeyi ve bu türden bir listeyi tanımlamak için bir yol sunmak yerine, Lisp her türden veriyi tutabilen bir tür listeye sahiptir.

Richard Stallman , Bilgisayarımı nasıl yaparım

"En güçlü programlama dili Lisp'dir. Lisp'i (veya onun varyantını, Scheme'yi) bilmiyorsanız, güçlü ve zarif bir programlama dilinin ne olduğunu bilemezsiniz. Lisp'i öğrendikten sonra, diğer dillerin çoğunda neyin eksik olduğunu göreceksiniz.
Günümüzde özel veri türlerini tanımlamaya odaklanan çoğu dilden farklı olarak, Lisp birkaç veri türü sunar, ancak bunlar geneldir. Belirli türleri tanımlamak yerine, onlardan yapılar inşa edersiniz. Bu nedenle, bu türden bir listeyi veya bu türden bir listeyi tanımlamak için bir yöntem sunmak yerine, Lisp her tür veriyi tutabilen bir liste türüne sahiptir. "

- Bilgisayarımı  nasıl yaparım

Şecere ve çeşitleri

  • Lisp (orijinal versiyonu John McCarthy o idi MIT )
  • MacLisp ( MIT'deki MACSYMA projesiyle ilgili - ve Apple Macintosh ile ilgisi yok ), Lisp'in doğrudan nesli
  • ZetaLisp , Lisp makinelerinde çalışan MACLisp'in halefi
  • InterLisp  (en) , ilk grafik kullanıcı arayüzlerini geliştirmek için kullanılan BBN Lisp doğumlu
  • VLISP , Paris VIII Üniversitesi'nde geliştirildi - Vincennes
  • Lisp  (tr) , geliştirilen INRIA ve sonra Eligis tarafından pazarlanan Ilog
  • EuLisp  (en) , bir "Avrupa Lisp"
  • Emacs Lisp , Emacs metin düzenleyicisini programlamak için kullanılan basitleştirilmiş sürüm
  • En ünlü Lisp'in soyundan gelen Common Lisp
  • ISLISP  (en) , Common Lisp'in bir alt kümesi olarak kabul edilebilecek ISLISP dilinin ISO standardı , standart 13816: 1997 (E), 2007'de ISO / IEC 13816: 2007 (E) tarafından revize edilmiştir.
  • AutoLISP, AutoCAD'de programlama için kullanılan bir Lisp
  • Şema , temiz bir Lisp
  • Nyquist, bir Lisp eskiden seslerle çalışırdı
  • xLispStat , verilerin istatistiksel analizi için kullanılan bir Lisp
  • XLisp , David Michael Betz tarafından geliştirilen Lisp dilinin bir alt kümesi
  • QLisp , Xlisp4.3'ün yüzlerce görüntü analizi rutini içeren bir uzantısıdır
  • Ark , çok rafine bir türev, Paul Graham tarafından yaratılmıştır.
  • Clojure , bir Java sanal makinesinde çalışıyor ve Yi farklı dillere çeviriyor .
  • OpenLisp  (in) , birçok Uyumlu Uzantı Common Lisp ile standart ISLISP  (in) tam uygulaması .

Notlar ve referanslar

  1. (inç) DA Kent (12). “  Fonksiyonel Programlama Dilleri bazıları Tarih  içinde (pdf)” TFP12 . 
  2. [1] .
  3. elbette Açıklama "  Bilgisayar Programlarının Yapısı ve Yorumlanması  " , MİT
  4. John McCarthy, Sembolik İfadelerin Özyinelemeli İşlevleri ve Makineye Göre Hesaplamaları, Bölüm I , Communications of the ACM, Cilt. 3 Sayı 4, Nisan 1960 DOI : 10.1145 / 367177.367199
  5. UPGRADE (European Journal for the Informatics Professional), Haziran 2005, s. 14
  6. Resmi olarak, bu ön ekli gösterimdir, ancak Lisp dilinde parantezlerin özel olarak kullanılması, bunun gerçekten Lehçe notasyonu olduğunu ima eder; yorumlayıcının rolü, parantezli ifadeleri önce operatörler olmak üzere soldan sağa yorumlanabilir doğrusal ifadelere indirgemektir.
  7. Gregory Chaitin Şans ve matematikte karmaşıklık Flammarion 2009.
  8. Zarif LISP Programları
  9. (in) "  nasıl işlem yapmak  " (erişilen 2017 Şubat 5 )
  10. Eligis
  11. ISO / IEC 13816: 1997 (E)
  12. ISO / IEC 13816: 2007 (E)

Ayrıca görün

İlgili Makaleler

  • Lambda hesabı  : Diğer işlevsel bilgisayar dilleri gibi Lisp'in de ilham aldığı matematik dili.
  • Common Lisp  : McCarthy'nin Lisp'inin doğrudan nesli; Lisp terimi, bugün hem orijinal Lisp'e hem de Common Lisp'e atıfta bulunmak için kullanılmaktadır.
  • Şema  : Lisp'in bir başka nesli, makro programlamadan çok fonksiyonel programlamaya odaklanmıştır .
  • S-ifadesi

Dış bağlantılar