Lisp'te lisp tercümanı çalışmak neden bu kadar önemli?


30

Özellikle lisp dilinde yazılmış bir lisp tercümanı incelemek isteyen yeni programcılar için birçok CS müfredatı ve öğrenme önerileri gördüm. Bütün bu siteler “entelektüel bir vahiy”, “her ciddi programcının sahip olması gereken bir aydınlanma deneyimidir” veya “size donanım / yazılım ilişkilerini gösterir” ve diğer belirsiz ifadelere, özellikle de bu makaleden alınan Bu saygın nasıl yapılır .

Sorumun genel düşüncesi, lisp yukarıdaki hedeflere nasıl ulaşıyor ve neden lisp? Neden başka bir dil değil?

Bunu soruyorum, çünkü şemaya bir şema tercümanı yazmayı bitirdim (SICP http://mitpress.mit.edu/sicp/ ) Bunun özellikle eskisinden gelmesi gerekiyordu. Programların nasıl çalıştığını anlamak için program tercümanlarında yararlanabileceğim iki dil arasında özel teknik ayrıntılar arıyorum.

Daha spesifik olarak:

Neden yorumlandığı dilde yazılmış bir tercümanın çalışması vurgulanıyor - orijinal dili ve yapılı dili düz tutmak sadece harika bir zihinsel alıştırma mı, yoksa yalnızca özünde doğada bulunabilecek belirli sorunlar var mı? orijinal dil

Lisp tercümanları birinin gelecekteki yazılım tasarımı için iyi mimari konseptlerini nasıl gösterir?

Bu alıştırmayı C ++ veya Java gibi farklı bir dilde yapsaydım ne kaçırırdım?

Nedir en kullanılan bu egzersizden paket ya da "zihinsel aracı"? **

** Ben çünkü benim yaptığım cevabı seçilen gelmiş başka tek araç daha kafamda ayrıştırma araçları tasarımında bu egzersizin daha beceri elde fark ettim ve ben düzeni için daha iyi çalışabilir ayrıştırma farklı yöntemler bulmak istiyoruz piton tercümanından daha tercüman.



4
@gnat Tam olarak kariyer tavsiyesi değil, "Lisp'in nesi harika?" sorusundan daha fazlası.
Robert Harvey,

1
@RobertHarvey bu bağlantı sadece kariyer için değil, aynı zamanda eğitim danışmanlığı için de demek istedi . Ama, peki, Lisp-çok-harika , muhtemelen çok da uygun
gnat

1
Belirli bir alıştırmadan ne öğreneceğinizi soruyor gibisiniz. Yaptığınız suskunluk tembellik işaretidir, iyi bir programcının anahtarıdır, ancak bir alıştırmadan ne öğreneceğinizi öğrenmenin tek yolu ne olursa olsun bunu yapmak ve görmektir. Kimse size bunu yaparak ne öğreneceğinizi söyleyemez, sadece yapmanız gerekir.
Jimmy Hoffa,

2
Bu soru bir bütün olarak eğitim ile ilgili olsa da, “Hangi dili öğrenmeliyim?” Şeklinde bir soruyu “eğitim tavsiyesi” olarak sınıflandırmazdım. olduğunu. Yani, belirli bir kursa veya işe özgü değildir. Aslında, eğitim buzzwords'lerinden bazılarını keserseniz, bu, cevapları dil özelliklerini tartışan bir bütün olarak dilleri programlama ile ilgili bir sorudur. Bu gerçekten de Lisp'a özgü değil, ancak xslt gibi diğer homoikon dillere de uygulanabilir. Bu yüzden bunun mükemmel bir soru olduğunu söylemeyeceğim, sadece basit bir "kariyer tavsiyesi" değil.
TheRubberDuck

Yanıtlar:


17

"Ben de" cevabı verme riski altında, eğer denerseniz görürsünüz ...

Bilgisayar dillerini inceliyorsanız, ayrıştırma işleminin en az yarısı olduğu izlenimini edinebilirsiniz. Lisp'i öğrenirseniz, yüzeysel sözdizimini ayrıştırmanın Lots of Irritating Single Parentheses'ten hoşlanmayan insanlar için (çoğumuz gibi) kolaylıktan başka bir şey olmadığını anlayacaksınız.

O zaman bu kolaylık için büyük bir bedel ödendiğini fark edebilirsiniz. Lisp'te bir programın başka bir program yapması ve yürütmesi çok önemlidir. Diğer dillerde, roman rakamlarında çarpım yapmak gibi ileri bir tekniktir.

Tabii ki hemen hemen herkes "bunu kimin yapması gerekiyor?" Diye sorar. Daha önce yapamayacağınız hiç bir şeyin tam anlamıyla açıldığını çok iyi görebiliyordunuz. Bunu diğer dillerde yapabilirsiniz, ancak neredeyse hiç bu kadar kolay değil.

Izkata yorumuna cevap vermek için INSERTED:

  • SHRDLU doğal dil anlama programı, İngilizce bir deyimi veya soruyu MICRO-PLANNER adlı bir Lisp lehçesinde bir programa çevirerek ve uygulayarak çalıştı.
  • Örneğin programları basitleştirmek veya doğrulamak için programları yönlendiren programlar doğal olarak Lisp dilinde yazılmıştır.
  • Bir programda, program oluşturma, kodları çarpmadan 3 boyutlu nesnelerde yetenekli tüm simetrilerle uğraşması gereken görsel sahneleri kavramak için kullandım.
  • Mantık ve teorem kanıtlama ile ilgisi olan herhangi bir şey, bir program şekli olan mantıksal ifadeleri manipüle etmeye yöneliktir.
  • Sembolik integral veya diferansiyel matematik gibi sembolik matematik, minyatür programlara benzeyen matematiksel ifadelerin değiştirilmesini içerir.
  • Kod oluşturma veya daha fazla sıkıntı çeken "kısmi değerlendirme" terimini içeren herhangi bir sorun Lisp'te doğaldır. Bunu uzun zaman önce bir veritabanı köprüsü programı için yaptım. Lisp kadar kolay olmayan C ile yaptım, ama Lisp'ten bir fikir aldım. Bu, neredeyse hiç kimsenin o zaman yapamayacağı bir teknik olarak kabul edildi (özellikle COBOL başkanları). Belki şimdi daha fazla, umarım.

... bu sadece birkaçı ...

O zaman, bugün “modern” kabul edilen bazı şeyleri fark edersiniz ki, 40 yıldan beri Lisp'te eski hat vardır. Fonksiyonel programlama gibi. Çöp toplama gibi. Kapaklar gibi.

Bu, modern dillerin OOP vb. Gibi yeni iyi fikirleri olmadığını söylemek değildir. Ancak Lisp'i öğrenirseniz, bakış açınızı genişletir.


You can do it in other languages, but not nearly so easily.- Sevmek? (Bana göre soru, bunun gibi ifadelerin sıklıkla yapıldığı, ancak neredeyse hiçbir zaman daha belirgin olamayacağı gibi görünüyor)
Izkata

Javascript'in kendi kaynak kodunu yazdırabildiğini fark ettiğimde dünyanın devrim yarattığını ve nesnenin değişmezine kayan bir değişmez elde etmek için nesnelerin değiştirilebileceğini düşündüm. Sonra Perl’de her şeyin $ Data :: Dumper :: Deparse ile birlikte olduğunu farkettim ve sonra lisp’in sonsuza dek sürdüğünü anladım. Tercümanları anlamak, yaşam modülleri inşa etmek için her zaman orada olan bu gücün kilidini açar ve Lisp'te bu, diğer dillerden daha erişilebilirdir.
Dmitry

komik olan, Lisps içindekilerin farkında olan bir Lisp programcısıdır. lisp mevcut ortamdan güzel bootstraps.
Dmitry

19

Sorunuza verilen basit cevap Lisp'i, tercihen SICP ile birlikte denemek . O zaman aydınlanacaksın.

Bahsedilen...

Kod Veridir
Çoğu dil kod ve veri arasında keskin bir ayrım yapar; Lisp yapmaz. Bu, örneğin, Lisp'teki bir Lisp ayrıştırıcısını, Lisp içindeki Lisp kodunu değiştirmeyi mümkün kılar. Bulduğum bu aydınlanmanın en iyi tanımı Lisp'in Doğası .

Bu kısmen doğrudur çünkü dilin sözdizimi çok basittir. Lisp'te (metaprogramlama gibi) diğer dillerde pratik olmayan şeyleri mümkün kılar, çünkü sözdizimi buna yol açar.

Ortalamaları Atan Okuma


3
2. paragraf mantıklı değil: homoiconicity! = Basit sözdizimi; Basit sözdizimi kolay bir Lisp ayrıştırıcı yazmak için yapar herhangi bir dilde (bkz bu ). 3. paragraf belirsiz, örnek (ler) gerekiyor.

@ MattFenwick Homoikonikliğin karmaşık sözdizimi ile yapılabileceği doğrudur, ancak bu son derece zor olacaktır. Homoikonik bir sözdizimi ile uğraşıyorsanız, basitçe, bunun talep edilen tutarlılıktan başka bir nedenden ötürü, homoikonik olmayan bir sözdiziminden daha kolay bir şekilde takip edilmesini kolaylaştıracağını varsayalım. İkinci noktanız iyi bir nokta olsa da, LISP'nin ayrıştırılması kolaydır çünkü basit sözdizimidir (homoikonluktan dolayı değil (homoikoniklik bu basitliğin nedeni olsa bile)
Jimmy Hoffa,

1
Her durumda, bir veri değeri almaya ve bunu bir program olarak yorumlamaya çok az yük var. Bu güzel bir şey. Konfigürasyonla programlama, yapmanız gereken tek şey konfigürasyon verileri için bir tercüman yazmaktır. Gelişmiş matematiksel dönüşümler (durumsal dillerinde uygulanması zor olan) genellikle Lisp'in saf fragmanının sözdizimsel dönüşümlerine "indirgenir".
nomen

1
@ MattFenwick: "Homoiconicity" kelimesini cevabımdan kaldırdım.
Robert Harvey,

1
Lisp'in Doğası için bir + 1'den fazlasını verebilirim; Hiç bu kadar güzel bir açıklama görmedim.
Doval

9

Neden yorumladığı dilde yazılmış bir tercümanın çalışması bu kadar vurgulanıyor?

Genel olarak, bir tercüman çalışmak, dili ve özellikleri hakkında size fikir verir. Genel olarak, bir programlama dilinde kod okumak, dinleyerek ve okuyarak konuşulan bir dili pratik etmek gibidir: bu dilin neler yapabileceğini, nasıl kullanıldığını ve ortak "deyimler" hakkında bilgi verir. Daha spesifik olarak, Lisp homoikonik bir dildir, yani ifadeler için sözdizimi veri için sözdizimi ile aynıdır. Lisp'te kod yazmak, bir liste yazıyormuş gibi görünüyorsun, ya da tam tersi. Bu nedenle, Lisp kodunu Lisp kodu ile yorumlamak, carve listeleriyle çalışmak kadar basittir cdr.

Kavramsal olarak faydalanabilmek için bu alıştırmayı nasıl kullanmalıyım?

Tercümanın kendisini nasıl yorumlayacağını düşünün - çoğu meta-dairesel tercüman uygulamasında (bir homoikonik dilin kendisini yorumladığı) işlevden sadece "geçer". Örneğin, uygulamak için car, cartartışmayı basitçe ele alın . Bu vurgu veri depolama mekanizmalarından uzaklaşır ve işlevselliğe odaklanır.

Lisp tercümanları birinin gelecekteki yazılım tasarımı için iyi mimari konseptlerini nasıl gösterir?

Tercümanlar çok karmaşık olabilir ve bu da onları tasarlamada iyi mimariyi teşvik eder. Bunu akılda tutarak, bu bireysel tercümana daha bağımlıdır.

Bu alıştırmayı C ++ veya Java gibi farklı bir dilde yapsaydım ne kaçırırdım?

Bu diller homoikon değildir, bu yüzden meta-dairesel bir Lisp yorumlayıcısının lütfu ve sadeliğinden faydalanamazlar. Bu, egzersizi zorlaştırır ve belki daha az yaygın hale getirir, ancak bunun gerçekten daha az faydalı olduğunu söyleyemem.

Bu alıştırmada en çok kullanılan paket servisi ya da "zihinsel araç" nedir?

Bunun için iyi bir cevabım olduğundan emin değilim; basitçe tercümanın nasıl çalıştığını görmeye yardımcı olur ve belki de daha önemlisi, dilin ne kadar küçük değişikliklerin kolayca uygulanabileceğini görmek için etrafı dolaştırın.


5

LISP, ayrıştırmayı son derece kolaylaştıracak şekilde yapılandırılmıştır. Bir derleyici yazmaya çalışırsanız, dilinizdeki her şey bir ifade ise ve belirsizlik düzeyi düşükse, bunun çok daha kolay olduğunu fark edeceksiniz. LISP, belirsizliği ortadan kaldırmak için her yerde parantez içine zorlar ve ifadeleri yoktur, sadece ifadeleri vardır.

LISP'nin ayrıştırması çok kolay olduğu gerçeği, kullanıcıları kendi kaynak kodlarını ayrıştırmaya ve bununla ilgili sihirli hileler yapmaya teşvik eder. Veri ve kod arasındaki çizgi bulanıklaşır ve yansıma, dinamik kod yeniden yazma, eklentiler ve serileştirme gibi normalde oldukça fazla çaba gerektiren şeyleri kolayca yapabilirsiniz.

Bu onun özü. Alıştırma muhtemelen, kodun kendisinden kolayca ayrıştırılabildiği durumlarda size nelerin mümkün olduğu hakkında bir fikir vermeyi amaçlar.


Ayrıştırılması kolay olan Lisp değil. S-İfadelerin ayrıştırılması kolaydır. Üstelik SİZİN Lisp'i ayrıştırmanız gerekiyor.
Rainer Joswig,

@Rainer: Bu sadece nitpicking değil mi? Benim dünyamda ayrıştırma, metinden AST'ye geçmek anlamına gelir, bu da komutları yorumlamak hakkında hiçbir şey söylemez.
Alexander Torstling

C ++ 'da çözümleyici, sözdizimsel olarak yanlış bir işlev bildirimi algılar. Lisp'te değil. Okuyucu programlama dili Lisp hakkında hiçbir şey bilmiyor. C ++ ayrıştırıcısı, tam C ++ sözdizimini bilir. Lisp okuyucu sadece s ifadelerini biliyor.
Rainer Joswig

Ah, o zaman ne demek istediğini anlıyorum. Doğru, hala basit bir lisp değerlendiricisinin basit bir c ++ 'dan daha basit olacağını düşünüyorum. SICP’de yaptıkları bu, değil mi (okuduğumdan beri)?
Alexander Torstling,

SICP'de kullanılan dil çok basit, hatta tam Şema değil. C benzeri bir dilin tercümanı da basit olmalıdır. C ++ büyük. Zorluğunun bir kısmı göreceli olarak yüksek sayıda yerleşik sözdiziminden kaynaklanıyor. Tipik bir Lisp sisteminde, söz diziminin çoğu, tercüman dışında makrolarla yapılır. Makrolar, sözdizimi ve kaynak dönüştürmeleri için bir uzatma mekanizması kullanır. Bu çekirdeği daha küçük tutar. Ancak makrolar çok büyük olabilir. Örneğin, LOOP yapısının uygulaması 2000'den fazla karmaşık makro kodu satırına sahiptir.
Rainer Joswig

4

Bunun herkes için gerçekten önemli olduğundan emin değilim. Lisp tercümanlarının nasıl çalıştığını bilmeden başarılı bir geliştirici olabilirsiniz. Bilgisayar Bilimi okurken Lisp'in temel fikirleri de öğrenilmelidir.

Lisp tercümanları Lisp programcıları için önemlidir. Dilin nasıl kullanıldığını tam olarak anlamak için bir tercümanın ([ve derleyici] 1 ) nasıl çalıştığını anlamaları gerekir.

Lisp yorumlayıcısı genellikle öğrencilere birkaç şey öğretmek için bilgisayar bilimlerinde bir araç olarak kullanılır:

Bir öğretim aracı olarak, bir Lisp tercümanı yardımcı olur, çünkü kısa sürede öğrenilebilir ve anlaşılabilir. Birkaç öğrenci Lisp hakkında zaten bilgi sahibi olduğu için, yukarıdaki kavramların öğrenilmesi söz konusu olduğunda öğrenciler düz bir alandadır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.