İlk C ++ derleyicisi C ++ dilinde nasıl yazılabilir?


48

Stroustrup, ilk C ++ derleyicisi olan Cfront'un C ++ dilinde yazıldığını iddia ediyor ( Stroustrup SSS ).

Ancak, ilk C ++ derleyicisinin C ++ ile yazılmış olması nasıl mümkün olabilir?

Derleyiciyi oluşturan kodun da derlenmesi gerekiyor ve bu nedenle ilk C ++ derleyicisi C ++ ile yazılmış olamaz, değil mi?


6
en.wikipedia.org/wiki/Cfront bu konuyu biraz ele alıyor.
christofr

Yanıtlar:


57

Anahtar tam burada:

İlk C ++ derleyicisi (Cfront), C ++ dilinde yazılmıştır. Bunu yapmak için önce C'yi "C Sınıfları olan bir C" ile -C işlemcisini yazmak için kullandım. "Sınıflı C", C ++ 'a anında ata olan bir C lehçesiydi. Önişlemci "Sınıflı C" yapılarını (sınıflar ve yapıcılar gibi) C'ye çevirdi. Bu, tüm dilleri anlamayan, çoğu C derleyicisinin yapması gereken denetleme türünü bırakan ve bireyi çeviren geleneksel bir önişlemciydi. tam bilgi olmadan inşa eder. Daha sonra "C with Classes" Cfront'un ilk versiyonunu yazdım.

Bu yüzden Cfront'un ilk versiyonu C ++ dilinde değil, orta dilde yazıldı. Doğrudan C'de C derleyicileri ve önişlemcileri oluşturma yeteneği, C'deki birçok yeniliğe (ve büyük güvenlik açıklarına ) neden oldu. Böylece, "C Sınıfları" kodunuzu doğrudan C'ye çeviren yeni önişlemcinizi yazıyorsunuz (çünkü doğrudan C yapabilir bir şey) ve sonra bir C ++ derleyicisi yazmak için "C with Classes" kullanın (C de yapamazsınız, sadece bir süre sürer) ve sonra daha verimli / tam bir derleyici yazmak için bu C ++ derleyicisini kullanırsınız. C ++. Anladım?


5
Yapılabilecek şeylerin en sevdiğim masallarından birine bağlantı eklemek için +1.
jwernerny

3
Derleyici geçerli C ++ koduyla yazılmıştır, ancak "C with Classes" önişlemcisi tarafından desteklenen tam C ++ özelliklerinden yalnızca birkaçı kullanılmıştır. Tam dilin bir alt kümesini kullandığı için, sonuçta derlendi (Cfront'un ilk çalışan sürümü). Bu "önyükleme" adımını uyguladıktan sonra, muhtemelen ön işlemciyi bir daha kullanmak zorunda kalmadı.
joeytwiddle

2
@jwernerny - Ben her zaman bu makaleyi tatmin edici buldum. En zor ve önemsiz kısımdan bahseder: "Hata, UNIX 'login' komutundaki kodla eşleşir. Değiştirme kodu, giriş komutunu yanlış bir şekilde derler, böylece amaçlanan şifreli şifreyi veya belirli bir bilinen şifreyi kabul eder. " Fakat bu nasıl yapılır? Daha önce hiç gösterildi mi?
detly

3
"C'deki birçok yeniliğe (ve büyük güvenlik açıklarına) yol açtı": Bildiğim kadarıyla bu hileler sadece C'de değil, herhangi bir dilde de kullanılabiliyor.
Giorgio

2
@detly: Şimdi önemsiz gibi gözüküyor, ancak 1983'te bu uygulama çeşitliliği eksikliği nedeniyle yaşanabilecek yeni bir saldırıydı. O zamandan beri ikili dosyalara daha çok güveniyorduk, çünkü kısmen her şeyi kaynaktan derlemek şimdi olduğundan çok daha büyük bir sıkıntıydı.
Blrfl

17

Önyüklendi. Bir c ++ özelliği cfront'a eklendiğinde, cfront bu özelliği o noktadan itibaren kullanabilir (ancak o özelliği kullanmamak için). Bu çalıştı çünkü cfront C ++ kodunu C koduna dönüştürebiliyordu. Böylece, eğer yeni bir platform ortaya çıkarsa, cfront'u C ++ 'dan C' ye dönüştürmek için başka bir platformda cfront 'ı kullanabilir ve daha sonra derlemeyi C' den nesne koduna tamamlamak için yeni platformun C derleyicisini kullanabilirsiniz.


9

Bence BS bu soruyu cevaplıyor:

İlk C ++ derleyicisi (Cfront), C ++ dilinde yazılmıştır. Bunu yapmak için önce C'yi "C Sınıfları olan bir C" ile -C işlemcisini yazmak için kullandım. "Sınıflı C", C ++ 'a anında ata olan bir C lehçesiydi. Önişlemci "Sınıflı C" yapılarını (sınıflar ve yapıcılar gibi) C'ye çevirdi. Bu, tüm dilleri anlamayan, çoğu C derleyicisinin yapması gereken denetleme türünü bırakan ve bireyi çeviren geleneksel bir önişlemciydi. tam bilgi olmadan inşa eder.

Daha sonra "C with Classes" Cfront'un ilk versiyonunu yazdım. Cfront, C ++ kaynağının sözdizimini ve anlamsal denetimini yapan geleneksel bir derleyiciydi. Bunun için, tam bir ayrıştırıcıya, sembol tablolarına ve her sınıfın, fonksiyonun, vb. Tümünün bir iç ağaç temsilini inşa etti. oluşturulan C, herhangi bir tip kontrol için C'ye güvenmedi. Basitçe C'yi bir montajcı olarak kullandı. Sonuçta ortaya çıkan kod uzlaşmaz şekilde hızlıydı.

İlk önce basit bir önişlemci tarafından C'ye uygulanan "Sınıflı C" diye bir şey yarattı. Temel olarak C ++ idi, ancak önişlemci çok az denetledi ya da hiç kontrol etmedi. Daha sonra, C ++ 'ın C ++' a çevirmenin daha güçlü versiyonu olan Cfront’a yazması, tip kontrolü, sembol tabloları vb. İle yazılması için kullandı.


1
temelde bir C ++ programını derlediğimizde, C'ye dönüştürülür, sonra C'ye dönüştürüldükten sonra tekrar makine koduna derlenir?
Pacerier

@Pacerier: Başlangıçta, evet, ama şimdi sanmıyorum.
Mike Dunlavey

Yorumunu pek anlamadım. Şimdi ikinci adımı atlayıp basitçe C ++ kaynağını alıp makine kodunu derleyen derleyiciler var mı demek istiyorsun?
Pacerier

7
@Pacerier: Doğrudan derleme diline veya makine koduna gitmiyorlar. Genellikle, önce makineden bağımsız bir ara gösterime (üçlü veya dörtlü) giderler ve optimizasyon için bunu analiz ederler. Bundan montaj veya makine kodu oluştururlar. Derleyici tasarımı (Aho & Ullman) üzerine bir kitap alırsanız, ilginç bulacağınızdan eminim.
Mike Dunlavey

1
İnşa ettiği C ++ 'nın şu anda var olan dilin bir bölümü olduğunu not etmek önemlidir. Şablonları yoktu, yeni kütüphaneleri yoktu, sadece C dökümünü kullandılar ve doğru hatırlıyorsam istisnaları yoktu.
Robotu

2

Bu cevabı ekleyeceğim, çünkü cevabı bu yönüyle ele almadım.

Teknik olarak kodu derlemek için yazılıma ihtiyacınız yoktur. Gerekli derleyici özelliklerine sahip olduğunuz sürece, gerçek derlemeyi manuel olarak yapabilirsiniz. İlk C ++ derleyicisi bu şekilde derlenmedi. Sadece bunun mümkün olduğunu söylüyorum.

Assembly dili ile karşılaştırın. İlk günlerde kullanıldığında, montaj kodunu makine koduna dönüştürecek hiçbir montajcı yazılımı yoktu. Elle yapıldı, ancak assembly dili programcılara daha iyi bir genel bakış sağladı.

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.