Neden kendini barındıran derleyiciler yeni diller için geçit töreni sayılıyor?


30

İnsanların saygı duymak için dil kullanmasını ya da en azından kendi kendini barındıran bir derleyiciyi kullanmalarını beklediklerini birkaç yerde duydum.

Bunun neden olduğunu merak ediyorum. Bir derleyici yazmak için çok önemli bir yazılım parçası gibi görünüyor ve tüm dillerin onları oluşturmak için uygun olmadığını düşünüyorum. Daha fazla sonuç verecek bir şeyde çalışarak çaba harcamak daha mantıklı olmaz mıydı?


17
"Bir derleyici yazmak için çok önemli bir yazılım parçası gibi görünüyor ve tüm dillerin onları oluşturmak için uygun olmadığını düşünüyorum.": Bunu derleyiciyi yeni bir dilde yazmaya çalışmak için çok iyi bir neden olarak düşünürdüm. dilin göreve bağlı olduğunu kanıtlamak için.
Giorgio

13
Özel bir amaç dili olmadığı sürece, derleyici yazmak için uygun olmayan bir dil de yapmak istediğim şey için uygun değil.
KodlarInChaos

3
AFAIK, bu her zaman Fortran için doğru değildir. Çeşitli Fortran derleyicileri (örneğin gfortrandan GCC ...) vardır değil Fortranda kodlanmış.
Basile Starynkevitch

Yanıtlar:


29

Daha fazla sonuç verecek bir şeyde çalışarak çaba harcamak daha mantıklı olmaz mıydı?

Ne gibi?

Derleyicilerle ilgili güzel olan şey, çok fazla bağımlılığa sahip olmadıklarıdır. Bu, henüz çok büyük veya farklı bir standart kütüphaneye sahip olmayan yeni bir dil için iyi adaylar olmalarını sağlar.

Daha da iyisi, iyi çalışılmış olsalar da, çeşitli şeylere ihtiyaçları var. Çeşitlilik, örneğinizin dilin çeşitli bölümlerini test etmesini sağlamaya yardımcı olur. İyi çalışılmış olmak, karşılaştırılacak başka derleyicileriniz olduğu ve ne yaptığınızı bildiğiniz akademik türlere daha fazla önem verdiğiniz anlamına gelir.

Ve derleyiciler bir ton iş gibi görünmekle birlikte, işlerin görkemli düzeninde oldukça küçükler. Dil uygulayıcıları yeni dilde daha önce yaptıklarını bile yapamıyorlarsa, yeni şeyler nasıl yapacaklar? Standart kütüphaneler veya bir IDE gibi gerçekten büyük şeyleri nasıl ele alacaklar?


Tıpkı bir not olarak, güzel olmasına rağmen, derleyicinin başka bir dilde yazılmasının çeşitli nedenleri olduğunu belirtmek isterim. Örneğin, çoğu javascript motoru javascript'te yazılmaz. Bunun birçok nedeni var: diğer yazılımlarla entegrasyon, mevcut kitaplıklara / bağımlılıklara bağlanma, üstün araçlar, performans, eski kodlar ... Bazen, kendi kendine derleme dili güzeldir, ancak yine de ana derleyiciyi korumak mantıklıdır. bir diğeri. Ancak, dil kendi başına anlamlıdır. Sadece bütün bir ekosistemi yeniden geliştirmek için göze alamazsınız.
dagnelies

2
@arnaud Ve JavaScript bir JavaScript ortamı gerektirdiğinden bir JavaScript derleyicisi, Javascript ile yazılmış edilemeyecek bir JavaScript ortamı, gerektirecektir gerçeği <paradoksal tekrarını> , bir JavaScript ortamı (işletim sistemi tarafından sağlanan nedeniyle ve eğer (Javascript ile yazılmış olamazdı).
Qix

3
@Qix en.wikipedia.org/wiki/Bootstrapping_%28compilers%29 Ancak, bunu kullanmak için hiçbir sebep yok. Yaygın olarak kötü bir dil olarak bilinir, tarayıcılar derleme için kullanmamaktan kaçınırlar çünkü durumun kontrolünü elinde tutarlar :), geri kalanımızın internette başka seçeneği yoktur.
Den

3
“Çok fazla bağımlılık yok” iddiası hakkında pek emin değilim. Derleyici ön ucu için bu doğru olabilir . Ancak bir AST'niz olur olmaz, kendi optimizerinizi ve kod oluşturucunuzu çalıştırmak umut verici bir rota gibi görünmüyor. Modern optimizasyon tekniklerinin, üçüncü parti bir kütüphane kullanmak isteyebileceği sofistike örgün mantık motorları gerektirmesi dışında, GCC gibi bir endüstri gücü temeli oluşturmak yerine her yeni dil için tekerleği yeniden icat etmek için hiçbir neden yoktur. veya LLVM.
5gon12eder

30

Bir derleyicinin derlenmekte olan dilde olması genellikle “ kendi köpek yemeğinizi yeme ” uygulamasının bir parçasıdır . Dünyaya destek modüllerinin ve araçlarının dilini, derleyicisini ve ekosistemini "ciddi işler için yeterince iyi" veya "üretime hazır" olarak gördüğünüzü gösteriyor.

Aynı zamanda, dil, derleyici ve çalışma zamanı tasarımına en yakın olanları, aldıkları tüm kararların ve seçtikleri geliştirme öncelikleri - siğiller ve tümüyle doğrudan yüzleşmeye zorlama erdemli bir etkiye sahiptir. Bu genellikle dil teorisindeki dil ortamını anlamakla kalmayıp, aynı zamanda zor, gerçek kelime koşullarının potaındaki dili / araçlarını kullanarak geniş pratik deneyime sahip çekirdek bir gruba da yol açar.


1
bütünlüğü için: kendi köpek yemeğini yemek ; bkz köpek beslenen (. adj) ya da test sürümünü (fiil)
qix

17

İnsanlar bir ana sebepten dolayı yeni genel amaçlı diller yaratıyorlar: dışarıdaki diğer dillerle ilgili en az bir şeyden nefret ediyorlar. Bu yüzden pek çok dil yerden çıkmıyor. Programlama hayatınızı iyileştirecek bir dil için harika bir fikriniz var, ancak ilk uygulamayı sizi en az bir şekilde sinirlendiren bir dilde yapmanız gerekiyor. Kendini barındırma, artık eski sinir bozucu dilde çalışmak zorunda kalmayacağınız anlamına gelir. Bu yüzden bir dilin yaratıcısı bu adıma doğru çalışır ve onu önemli bir dönüm noktası olarak görür.

Pek çok dil özelliği kağıt üzerinde iyi görünüyor, ancak bunları gerçek bir projede kullanmaya başladığınızda sınırlarını görmeye başlıyorsunuz. Örneğin, birçok dilde ilk başta iyi bir unicode desteği yoktur. Büyük bir projeyi tamamlamak, bu tür durumların birçoğunun karşılanıp ele alınmasını sağlamaya yardımcı olur ve kendi kendini barındıran bir derleyici herhangi bir proje kadar iyidir. Bu yüzden dilin yaratıcıları dışındaki insanlar onu önemli bir dönüm noktası olarak görüyorlar.

Bu, dikkat çekmeye değer tek kilometre taşı olduğu anlamına gelmez . Veri tabanı entegrasyonu, grafik arayüzler, ağ iletişimi, vb. Gibi bir derleyici tarafından kullanılmayan işlevsellik vardır.


(Yerel) bir dilin kendisini derleyebildiği ve bir linux çekirdeğinin kendisine aktarılabildiği bir dil gibi hissediyorum ( çoğu günümüz işletim sisteminin çalışması için gereken görevlerin çoğunu / tümünü kapsadığı için).
Qix

Yine de derleyici yazmak için iyi bir Unicode desteğine gerek yok.
Paŭlo Ebermann,

11

Steve Yegge , dolaylı olarak buna hitap eden harika bir blog yazısı yazdı .

Büyük nokta # 1: derleyiciler bilgisayar biliminin hemen hemen her yönünü kapsar. Bunlar üst düzey bir ders çünkü bilgisayar bilimi öğretim programında öğrendiğiniz diğer her şeyi sadece başlamak için bilmeniz gerekiyor. Veri yapıları, arama ve sıralama, asimptotik performans, grafik boyama? Hepsi orada.

Knuth'un anıtsal (ve hiç bitmeyen) "Bilgisayar Programcılığı Sanatı" üzerinde bir derleyici ders kitabı olarak başlamış olmasına rağmen, on yıllardır çalışmasının bir nedeni var. Carl Sagan'ın dediği gibi "Sıfırdan bir elmalı turta yapmak istiyorsanız, önce evreni icat etmelisiniz", derleyici yazmak istiyorsanız, önce bilgisayar biliminin hemen her yönüyle ilgilenmelisiniz.

Eğer derleyici kendi kendine barındırılıyorsa, ne yaparsam yapayım, ihtiyacım olanı yapabileceğimden eminim. Tersine, eğer kendi dilinizde bir derleyici yazmadıysanız, birileri için gerçekten önemli olan bir şeyi kaçırması iyi bir ihtimaldir, çünkü dil uygulayıcıları bu konular hakkında düşünmelerini gerektirecek bir program yazmak zorunda kalmamışlardır .

Büyük nokta # 2: 30.000 feet'ten itibaren şaşırtıcı sayıda sorun sadece derleyicilere benziyor.

Derleyiciler bir sembol akışı alır, yapılarını alana özgü önceden tanımlanmış kurallara göre belirler ve bunları başka bir sembol akışına dönüştürür. Kulağa oldukça genel geliyor, değil mi? İyi evet.

Visual C ++ ekibinde olsanız da olmasanız da, genellikle derleyicinin bir parçası gibi görünen bir şey yapmanıza ihtiyaç duyacağınızı göreceksiniz. Her gün tam anlamıyla yaparım.

Diğer mesleklerin aksine, programcılar sadece araçları kullanmakla kalmaz, kendi araçlarını da oluştururlar. Başka bir araç üretmeyen araçlarla (yetenek eksikliği veya başka araçların yapımında kullanılabilecek araçların bulunmaması nedeniyle) yazamayan bir programcı sonsuza dek özürlü olacak.

Eğer bir dil bir sembol akışına, programlara kurallara uymaya ve onu sembollerin başka bir sembol akışına dönüştürmeye yarayan, oldukça kısıtlı bir dil gibi görünen ve faydalı olabilecek bir dil programına dönüştürmeyen programlar oluşturmaya uygun değilse bana göre.

(Neyse ki, sembollerin dönüştürülmesi için uygun olmayan pek çok programlama dili olduğunu sanmıyorum. C muhtemelen bugün kullanılan en kötü dillerden biri, ancak C derleyicileri genellikle kendileri tarafından barındırılıyor, böylece hiç kimseyi durdurmadı.)

Yegge'den bahsetmediğim kişisel deneyimlerden son vereceğim üçüncü bir neden (çünkü "neden ev sahibi" hakkında yazmıyordu): hataları giderir. Eğer araç her zaman bir derleyici, yazarken inşa onu (henüz sadece her zaman çalıştırmak , sen iyi ölçekli bir kod tabanı (derleyici kendisi) karşı doğru ve işe, işe üzerine onu) bağlıdır.

Bu ay nispeten yeni ve meşhur, kendi kendine barındırılmayan bir derleyici kullanıyorum (hangisini tahmin edeceğinizi muhtemelen tahmin edebilirsiniz) ve 2 gün boyunca hiçbir şeyi bölmeden geçemem. Tasarımcıların gerçekte ne kadar kullanmaları gerektiğini merak ediyorum.


8

X dili için bir derleyicinin kendi kendini barındırmasını istiyorsanız, önce bunu başka bir dilde uygulamak zorundasınız, Y'nin, X dili için girdi alan ve montaj kodunu ya da bazı ara kodları ya da Derleyicinin çalıştığı makine için nesne kodu. Y dilini mümkün olduğunca X diline benzer olacak şekilde seçmek istersiniz, çünkü bir noktada Y ile X arasındaki kodları çevirirsiniz.

Ancak, derleyiciden daha fazla Y dilinde gereğinden fazla yazmak istemezsiniz, bu nedenle başlangıçta, fazladan yapıları ortadan kaldırarak yalnızca bir dilin alt kümesini uygularsınız. Bir 'C' tipi dili durumunda, süre ama hiçbir için ya da yapmak . eğer ancak hiçbir durumda veya üçüncül değil Yapı, sendika veya numaralandırma yok. Vb Kalan, sadece X dili için bir ayrıştırıcı ve ilkel kod üreticisi yazmak için dil yeterlidir. O zaman çıktıyı kontrol edin. Tekrar.

Bu çalışmaya başladıktan sonra, Y dilinde yazılmış derleyici kaynağını X diline yeniden yazabilir ve Y dilinde yazılmış derleyiciyi kullanarak X dilini derleyebilirsiniz. Çıktı, X dilinde yazılmış yeni bir derleyici olacaktır. X dilini derler, yani şimdi kendini barındırır. Ancak, Y dilinde yalnızca bir dilin alt kümesini uyguladığınız için tamamlanmadı.

Şimdi, eksik özellikleri de ekleyerek doğru kodu oluşturduklarını test edin. yani özellik derleyicide uygulandıktan sonra, yeni özellikleri kullanarak test programları yazabilir, derleyebilir ve test edebilirsiniz, ancak bunları derleyici kaynağında kullanmamalısınız. Yeni özellikler doğrulandıktan sonra, derleyici kaynağında bu yeni özellikleri kullanabilirsiniz - belki de dil altkümesinde yazılmış orijinal kodun bir kısmını değiştirerek - sürümü yeni özelliklerle kullanarak derleyici kaynağını yeniden derleyin.

Artık dile yeni özellikler eklemek için bir mekanizmaya sahipsiniz - ve özellikler için kod oluşturma doğrulandıktan sonra derleyicinin bir sonraki neslinde kullanılabilir.

Bilgisayarlar sahneye ilk geldiğinde (ve daha sonra tekrar mikroişlemciler ilk geldiğinde) 60 yıl öncesine kadar, ilk derleyiciyi uygulamak için uygun başka Y dili yoktu. Bu nedenle, ilk derleyicilerin derleme kodunda yazılması gerekiyordu ve ardından derleyicinin yeteri kadar çalıştığında derleme kodunun yerine yeni bir dilde yazılmış sürüm geliyordu. Montajcı yok mu? Bütün işlemci başka bir seviyeye düştü, montajcı başlangıçta makine koduna yazıldı .


2

Derleyici yazmak için iyi tasarlanmamış fakat başka bir amaç için iyi tasarlanmış bir programlama dili üretmek mümkün müdür?

SQL gibi bir dile bakarak cevabın evet olduğunu varsayalım. Ancak bu nitelikteki diller genel amaç değildir.


1
Kabul edildi: SQL'de bir C derleyicisi yazın.
Qix

2

Bunu kim söyledi? ... neyse, bu sadece bir fikir. Bazıları hemfikir olabilir, bazıları olmayabilir, burada hak veya yanlış yoktur. Bazı dillerin içinde derleyiciler bulunur, bazıları yazmaz. Her neyse.

Yine de, bir dilin "kendini derleyebilmesi" mümkün olup olmadığını anlamak güzel bir kavram / kavram kanıtıdır ... bu sadece ... güzel ... ve dilin bazı karmaşık şeyler yapmak için uygun olduğunu kanıtlar.

Ayrıca, güzel olmasına rağmen, derleyicinin başka bir dilde yazılmasının çeşitli nedenleri olduğunu da belirtmek isterim. Örneğin, çoğu javascript motoru javascript'te yazılmaz. Bunun birçok nedeni var: diğer yazılımlarla entegrasyon, mevcut kitaplıklara / bağımlılıklara bağlanma, üstün araçlar, performans, eski kodlar ... Bazen, kendi kendine derleme dili güzeldir, ancak yine de ana derleyiciyi korumak mantıklıdır. bir diğeri. Ancak, dil kendi başına anlamlıdır. Sadece bütün bir ekosistemi yeniden geliştirmek için göze alamazsınız.


2

Clang, C ++ dilinde yazılmıştır. Objective-C'deki Clang Objective-C derleyicisini yeniden yazmak çok zor olmazdı, ama sonra oldukça işe yaramazdı. C ++ derleyicisindeki herhangi bir değişiklik, Objective-C'de yeniden yapılmalıdır ve bunun tersi de geçerlidir. Peki neden?

Şimdi bir Clang Swift derleyicisi var. Elbette bu derleyici Swift dilinde yeniden yazılabilir. Ama ne amacı olurdu? Dilin içinde bir derleyici yazabilecek kadar güçlü olduğunu göstermek için mi? Swift'de derleyiciler yazıp yazamayacağınız hiç kimse umursamıyor. İnsanlar do Eğer Swift kullanıcı arayüzleri yazabilirsiniz eğer bakım ve bariz bir can.

Farklı dilleri derlemek için kolayca uyarlanabilecek iyi bir test edilmiş derleyiciniz varsa, farklı bir dilde yeniden yazma derleyiciyle çalışmayı kolaylaştıramazsa, onu farklı dillere yeniden yazmak oldukça anlamsızdır. O anlamda örneğin, Swift içinde çınlama yazmayı kılacak olursa, o zaman Clang C, C ++ ve Objective-C derleyicileri ediyorum tüm Swift yazılacaktır.

Bazı programlama dilinde bir derleyici yazabileceğinizi kanıtlamaktan daha önemli şeyler var.


1

Dilin karmaşık dize işlemesini işleme koyabildiğini ve başka bir dile çevirebildiğini / kendisini yorumlayabildiğini gösterir.

Bir derleyici oluşturma sürecinde (ilk büyük proje) öne çıkan bir sorun var.

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.