C # derleyicisi hangi dilde yazılmıştır?


148

Ben de kaynak kodu baktı http://referencesource.microsoft.com/ ve tüm kaynak kodu C # olduğu görülmektedir.

Ayrıca yeni C # derleyici platformunun ( Roslyn ) kaynak koduna da baktım ve o da C # içinde. Bu nasıl mümkün olabilir? C # dil derleyicisi C # ile mi yazılmış? Yoksa bariz bir şeyi mi kaçırıyorum? C # derleyicisi C # ile yazılırsa nasıl çalışır?


12
Pek çok derleyici derledikleri dilde yazılır - daha fazla bilgi için Google önyükleme .
Paul Roub

19
Orijinal derleyicinin C ++ ile yazıldığını düşünüyorum .
PoweredByOrange

44
Peki, başka bir çekiç kullanılarak bir çekiç dövülebilir. Önceki versiyonu ...
Eugene Sh.

10
Gönderdiğiniz bağlantı, derleyicinin değil, Framework kitaplığının kaynak kodunun bağlantısıdır.
Steve

Yanıtlar:


230

Orijinal C # derleyicisi C # ile yazılmamış, C ve C ++ dilindeydi. Yeni Roslyn derleyicisi C # ile yazılmıştır, ancak başlangıçta eski derleyici ile derlenmiştir. Yeni derleyici tamamlandığında, kendi kaynak kodunu derleyebildi: buna önyükleme denir .


2
Öyleyse, "orijinal derleyicide" bir değişiklik yapılması gerektiğinde, bunun eski derleyiciyle (C, C ++ ile yazılmış) derlenmesi gerekir mi?
CriketerOnSO

10
"Orijinal derleyiciyi" değiştirmeye gerek kalmayacak, yeni sürümler değiştirilecek
Pseudonym

1
@CriketerOnSO, yeni derleyici eskisinin yerini alacak, böylece eskisini değiştirmeye gerek kalmayacak. Ancak MS bunu yapmak isterse, eski derleyiciyi daha önce yaptıkları gibi bir C ++ derleyicisiyle yeniden derlerlerdi.
Thomas Levesque

3
@ThomasLevesque Kendi kendine barındırma, önyüklemenin nihai sonucudur.
Arx

2
@SriramSakthivel, derleyicinin kodu yeni anahtar kelimeleri kullanamaz, en azından onları anlayan bir derleyici olana kadar. Yenisini oluşturmak için her zaman derleyicinin eski bir sürümünü kullanırsınız.
Thomas Levesque

32

Derleyiciler yardımcı programlardır - programlama dili metnini makine koduna dönüştürürler. Programlama dili sadece bir derleyici olan yazılımı tanımlıyorsa .....

Derleyiciler ayrıca diğer mimariler için makine kodu üretebilir. Örneğin, Apple, Intel tabanlı sunucu raflarını kullanarak iOS'u derler. Derleyicinin ürettiği ARM kodunu çalıştırması gerekmez, sadece diske yazın.

Derleyici 2.0, derleyici 1.0'ın işleyebileceği bir dilde yazılmalıdır, ancak kesinlikle optimizasyon gibi daha yeni özelliklerle derleyici 2.0 oluşturabilir. Daha sonra derleyici 2.0'ı kullanarak kaynak kodunu yeniden derleyebilir ve kendisinin daha iyi bir sürümünü oluşturabilirsiniz. Yine, derleyici kendisinin başka bir versiyonunu yaptığını bilmiyor.

Zamanın sislerine yeterince geri gidersek, derleyicimizin olmadığı bir noktaya ulaşırız - yüksek seviyeli bir dilin ilk yinelemesi. O zaman kalemleri ve opcode kitapları çıkarıp ilkini assembly içine yazmalıyız. İlk birleştiriciyi nasıl yazdık? Doğrudan makine kodu girişi, muhtemelen delikli kağıt bant üzerinde veya ön paneldeki anahtarları çevirerek.


9
Ve kağıt bant, kağıttaki deliklerden anahtarları çeviriyor. :-)
Zan Lynx

2
Depolama teknolojisi olarak kağıt bant asla çıkmayacaktır . Çok karmaşık ve hataya açık, ayrıca okuyucuda kısa devre varsa ve bu programınızı tamamen yok edecekse kolayca yanar.
kullanıcı

17

Derleyici, diğer herhangi bir program gibi sadece bir programdır. Büyülü ya da özel bir yanı yok. Biraz girdi alır ve bir miktar çıktı üretir. Bu özel durumda, girdi sadece C # olur ve çıktı sadece CIL olur, ancak bu girdinin bir dizi vergi iadesi ve çıktının bir rapor olmasından farklı değildir.


10
Farklı - çok daha kolay, -).
Peter - Monica'yı yeniden

4
@PeterSchneider: İnsanlar derleyicileri efsanevi büyülü yaratıklar olarak atmayı severler, ancak sonuçta, girdiyi çıktıya dönüştüren programlardır. Gezegendeki hemen hemen her program bazı girdileri ayrıştırır, onu anlamaya çalışır ve onu bir çıktıya dönüştürür. Bir anlamda, her girdi bir dilde yazılmış bir programdır, her program bir derleyicidir.
Jörg W Mittag

3
Daha fazla katılamadım. Tek söylemek istediğim, vergi yasalarının korkunç bir karmaşa olduğu. Buna karşılık, biçimsel diller genellikle otomatikleştirme için uygun bir şekilde iyi tanımlanır. Bu da basit bir derleyiciyi yazmayı vergilerle uğraşan bir programdan tartışmasız daha kolay hale getirir. Eric Lippert, C # derleyicilerine katılmamak için yalvarabilirse de, cf. blogs.msdn.com/b/ericlippert/archive/2010/02/04/… . Tek geçişli C derleyicilerinden çok uzaklaştı.
Peter - Monica'yı yeniden

1
@PeterSchneider: Ah, pardon, yorumunuzu 180 ° yanlış yorumladım: -D
Jörg W Mittag

Bu yanıtı en çok OP'nin düşüncesine doğrudan hitap ettiği için seviyorum. "Tüm güçlü" derleyiciyi çevreleyen sisi temizler.
Assaf Levy
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.