Ben web üzerinde CoffeeScript araştırıyorum http://coffeescript.org/ ve metne sahip
CoffeeScript derleyicisinin kendisi CoffeeScript'te yazılmıştır
Derleyici kendini nasıl derleyebilir veya bu ifade ne anlama gelir?
Ben web üzerinde CoffeeScript araştırıyorum http://coffeescript.org/ ve metne sahip
CoffeeScript derleyicisinin kendisi CoffeeScript'te yazılmıştır
Derleyici kendini nasıl derleyebilir veya bu ifade ne anlama gelir?
Yanıtlar:
Bir derleyicinin ilk sürümü, kendisine özgü bir programlama dilinden makine ile oluşturulamaz; karışıklığınız anlaşılabilir. Daha fazla dil özelliğine sahip derleyicinin daha sonraki bir sürümü (yeni dilin ilk sürümünde yeniden yazılmış kaynak) ilk derleyici tarafından oluşturulabilir. Bu sürüm bir sonraki derleyiciyi derleyebilir ve bu böyle devam eder. İşte bir örnek:
Not: CoffeeScript sürümlerinin tam olarak nasıl numaralandığından emin değilim, bu sadece bir örnektir.
Bu işleme genellikle önyükleme adı verilir . Önyükleme derleyicisinin başka bir örneği Rust dilininrustc
derleyicisidir .
Güvene Güvenin Üzerine Düşünceler makalesinde , Unix'in yaratıcılarından Ken Thompson, C derleyicisinin kendisini nasıl derlediğine dair büyüleyici (ve kolayca okunabilir) bir genel bakış yazar. Benzer kavramlar CoffeeScript veya başka bir dile uygulanabilir.
Kendi kodunu derleyen bir derleyici fikri, bir quine : kaynak koduna benzer şekilde benzer : yürütüldüğünde orijinal kaynak kodunu çıktı olarak üretir. İşte bir CoffeeScript sorgusu örneği . Thompson bu C cine örneğini verdi:
char s[] = {
'\t',
'0',
'\n',
'}',
';',
'\n',
'\n',
'/',
'*',
'\n',
… 213 lines omitted …
0
};
/*
* The string s is a representation of the body
* of this program from '0'
* to the end.
*/
main()
{
int i;
printf("char\ts[] = {\n");
for(i = 0; s[i]; i++)
printf("\t%d,\n", s[i]);
printf("%s", s);
}
Daha sonra, derleyiciye '\n'
ASCII kodu 10 gibi bir kaçış dizisinin nasıl öğretildiğini merak edebilirsiniz . Cevap, C derleyicisinin bir yerinde, ters eğik çizgi dizilerini tanımak için bunun gibi bazı koşulları içeren karakter değişmezlerini yorumlayan bir rutin olmasıdır:
…
c = next();
if (c != '\\') return c; /* A normal character */
c = next();
if (c == '\\') return '\\'; /* Two backslashes in the code means one backslash */
if (c == 'r') return '\r'; /* '\r' is a carriage return */
…
Yani, yukarıdaki koda bir koşul ekleyebiliriz…
if (c == 'n') return 10; /* '\n' is a newline */
… '\n'
ASCII 10'u temsil eden bir derleyici üretmek için . İlginçtir ki, bu derleyici ve onun tarafından derlenen tüm derleyiciler bu eşlemeyi "bilir", böylece kaynak kodun gelecek neslinde, bu son satırı
if (c == 'n') return '\n';
… Ve doğru olanı yapacak! 10
Derleyici gelir ve artık açıkça derleyici'nın kaynak kodunda tanımlanması gerekir. 1
Bu, C kodunda uygulanan C dili özelliğinin bir örneğidir. Şimdi, bu işlemi her dil özelliği için tekrarlayın ve bir "kendi kendini barındıran" derleyiciniz var: C ile yazılmış bir C derleyicisi.
1 Makalede açıklanan arsa bükümü, derleyiciye bunun gibi gerçekleri "öğretebileceği" için, tespit edilmesi zor bir şekilde truva atı yürütülebilir dosyaları üretmenin yanlış öğretilebileceği ve böyle bir sabotaj eyleminin devam edebileceği renkli derleyici tarafından üretilen tüm derleyicilerde.
Zaten çok iyi bir cevap aldınız, ancak size farklı bir bakış açısı sunmak istiyorum, umarım size aydınlatıcı olacaktır. Önce ikimiz üzerinde hemfikir olabileceğimiz iki gerçek belirleyelim:
Eminim ki hem # 1 hem de # 2'nin doğru olduğunu kabul edebilirsiniz. Şimdi, iki ifadeye bakın. Artık CoffeeScript derleyicisinin CoffeeScript derleyicisini derlemesinin tamamen normal olduğunu görüyor musunuz?
Derleyici ne derlediğini umursamıyor . CoffeeScript'te yazılmış bir program olduğu sürece derleyebilir. CoffeeScript derleyicisinin kendisi de böyle bir program olur. CoffeeScript derleyicisi, derlediği CoffeeScript derleyicisinin kendisinin umurunda değildir. Tek gördüğü bazı CoffeeScript kodu. Dönemi.
Derleyici kendini nasıl derleyebilir veya bu ifade ne anlama gelir?
Evet, tam olarak bu ifadenin anlamı budur ve umarım şimdi bu ifadenin nasıl doğru olduğunu görebilirsiniz.
Derleyici kendini nasıl derleyebilir veya bu ifade ne anlama gelir?
Tam olarak bu demektir. Her şeyden önce, dikkate alınması gereken bazı şeyler. Bakmamız gereken dört nesne var:
Şimdi, herhangi bir isteğe bağlı CoffeScript programını derlemek ve bu program için montaj oluşturmak için CoffeScript derleyicisinin oluşturulan derlemesini - çalıştırılabilirini - kullanabileceğiniz açıktır.
Şimdi, CoffeScript derleyicisinin kendisi sadece keyfi bir CoffeScript programıdır ve bu nedenle CoffeScript derleyicisi tarafından derlenebilir.
Sizin karışıklık Kendi yeni bir dil oluşturduğunuzda, yok olmasından kaynaklanıyor gibi görünüyor sahip bir derleyici henüz size derleyici derlemek için kullanabilirsiniz. Bu kesinlikle bir tavuk yumurtası sorununa benziyor , değil mi?
Önyükleme adı verilen işlemi tanıtın .
Şimdi yeni özellikler eklemeniz gerekiyor. Diyelim ki - while
döngüler uyguladınız, ama aynı zamanda- for
döngüler de istiyorsunuz . Bu herhangi bir problem değildir, çünkü herhangi bir- for
loop'u -op olacak şekilde yeniden yazabilirsiniz while
. Bu while
, derleyicinizin kaynak kodunda yalnızca- döngülerini kullanabileceğiniz anlamına gelir , çünkü elinizdeki montaj yalnızca bunları derleyebilir. Ancak derleyicinizin içinde, for
onunla-döngülere pase ve derleme yapabilen işlevler oluşturabilirsiniz . Sonra zaten sahip olduğunuz montajı kullanın ve yeni derleyici sürümünü derleyin. Ve şimdi- for
döngüleri ayrıştırabilen ve derleyebilen bir derleyicinin bir montajına sahipsiniz! Şimdi derleyicinizin kaynak dosyasına dönebilir ve while
istemediğiniz-döngülerini-döngülere yeniden yazabilirsiniz for
.
Durulayın ve istenen tüm dil özellikleri derleyici ile derleninceye kadar tekrarlayın.
while
ve for
tabii ki sadece örneklerdi, ama bu istediğiniz yeni dil özellikleri için de geçerli. Ve sonra siz de CoffeScript'in şu an bulunduğunuz durumda: Derleyici kendini derliyor.
Orada çok fazla literatür var. Güven Üzerine Düşünceler Güven , bu konuyla ilgilenen herkesin en az bir kez okuması gereken bir klasiktir.
Burada derleyici terimi , ilgili iki dosya olduğu gerçeğini gözler önüne seriyor . Biri, CoffeScript'te yazılmış girdi dosyaları olarak alınan ve çıktı dosyası olarak başka bir yürütülebilir dosya, bağlanabilir bir nesne dosyası veya paylaşılan bir kütüphane üreten bir yürütülebilir dosyadır. Diğeri, CoffeeScript derleme prosedürünü açıklayan bir CoffeeScript kaynak dosyasıdır.
İlk dosyayı ikinciye uygularsınız, birinciyle aynı derleme işlemini gerçekleştirebilen bir üçüncü (daha fazla, ikinci dosya ilk tarafından uygulanmayan özellikleri tanımlarsa daha fazla) gerçekleştirebilir ve bu nedenle böylece arzu.
CoffeeScript derleyicisinin Ruby sürümü zaten mevcut olduğundan, CoffeeScript derleyicisinin CoffeeScript sürümünü oluşturmak için kullanıldı.
Bu, kendi kendini barındıran bir derleyici olarak bilinir .
Son derece yaygındır ve genellikle bir yazarın o dilin büyümesini sürdürmek için kendi dillerini kullanma arzusundan kaynaklanır.
Bu derleyici değil, dilin ifade edilebilirliği meselesidir, çünkü derleyici sadece bazı dillerde yazılmış bir programdır.
"Bir dil yazılır / uygulanır" dediğimizde, aslında bu dil için bir derleyici veya yorumlayıcının uygulandığını kastediyoruz. Dili uygulayan programlar yazabileceğiniz programlama dilleri vardır (aynı dil için derleyiciler / tercümanlardır). Bu diller evrensel diller olarak adlandırılır .
Bunu anlayabilmek için metal bir torna tezgahı düşünün. Metali şekillendirmek için kullanılan bir araçtır. Sadece bu aracı kullanarak, parçalarını oluşturarak başka, özdeş bir araç oluşturmak mümkündür. Böylece, bu alet evrensel bir makinedir. Tabii ki, birincisi diğer araçlar (diğer araçlar) kullanılarak oluşturuldu ve muhtemelen daha düşük kalitedeydi. Ancak birincisi, daha yüksek hassasiyetle yenilerini oluşturmak için kullanıldı.
3D yazıcı neredeyse evrensel bir makinedir. Tüm 3D yazıcıyı bir 3D yazıcı kullanarak yazdırabilirsiniz (plastiği eriten ucu inşa edemezsiniz).
Derleyicinin n + 1 sürümü X ile yazılmıştır.
Böylece derleyicinin n'inci versiyonu (X ile yazılmıştır) ile derlenebilir.
Ancak X'de yazılmış derleyicinin ilk sürümü X için bir dilde yazılmış bir derleyici tarafından derlenmelidir. Bu adıma derleyicinin önyüklenmesi denir.
Derleyiciler, üst düzey bir özellik alır ve bunu donanımda yürütülebilir gibi düşük düzeyli bir uygulamaya dönüştürür. Bu nedenle, spesifikasyonun formatı ile gerçek yürütme arasında, hedeflenen dilin anlambilimi dışında bir ilişki yoktur.
Çapraz derleyiciler bir sistemden başka bir sisteme geçer, çapraz dil derleyicileri bir dil belirtimini başka bir dil belirtimine derler.
Temel olarak derleme sadece bir çeviri ve seviye genellikle dilin alt seviyesinden daha düşük dil seviyesine, ancak birçok varyant var.
Bootstrapping derleyicileri elbette en kafa karıştırıcıdır, çünkü yazıldıkları dili derlerler. Bootstrapping'de yürütülebilir en az mevcut bir sürümü gerektiren ilk adımı unutmayın. Birçok önyüklemeli derleyici önce bir programlama dilinin asgari özellikleri üzerinde çalışır ve yeni özellik önceki özellikler kullanılarak ifade edilebildiği sürece ileriye dönük ek karmaşık dil özellikleri ekler. Eğer durum böyle değilse, "derleyicinin" bir kısmının önceden başka bir dilde geliştirilmesini gerektirecektir.
self-hosting
derleyicidir. Bkz. Programmers.stackexchange.com/q/263651/6221