GCC ve g ++ önyüklemesi nasıl yapılır?


186

Bu bir süredir beni rahatsız ediyor. GCC ve g ++ kendilerini nasıl derler?

Her revizyonun daha önce yapılmış bir revizyonla derlendiğini tahmin ediyorum. Bu doğru mu? Ve eğer öyleyse, en eski g ++ ve GCC sürümlerinin montajda yazıldığı anlamına mı geliyor?


13
Her revizyon sonunda kendi kendine derlenebilir. :)
Martin Hennings

4
Bu ilk derleyiciler nasıl ortaya çıktığını görmek istiyorsanız okumaya ilginçtir.
parkovski

1
@parkovski Bağlantı koptu mu?
Nubcake

Bağlantı en son 04 Haz 2016 tarihinde görüldü: web.archive.org/web/20160604035203/homepage.ntlworld.com/…
akraf

Yanıtlar:


175

GCC'nin en eski sürümü başka bir C derleyicisi kullanılarak derlendi, çünkü yazıldığı zaman diğerleri vardı. Şimdiye kadar ilk C derleyicisi (yaklaşık 1973, IIRC) ya PDP-11 derlemesinde ya da ondan önce gelen B programlama dilinde uygulandı, ancak her durumda B derleyicisi derlemede yazıldı.Benzer şekilde, ilk C ++ derleyicisi (CPre / Cfront , 1979-1983) muhtemelen ilk olarak C'de uygulanmış, daha sonra C ++ ile yeniden yazılmıştır.

GCC'yi veya başka bir kendi kendini barındıran derleyiciyi derlediğinizde, binanın tam sırası:

  1. Mevcut C derleyicisiyle GCC'nin yeni sürümünü oluşturun
  2. yeni oluşturduğunuz sürümle GCC'nin yeni sürümünü yeniden oluşturun
  3. (isteğe bağlı) doğrulama amacıyla 2. adımı tekrarlayın.

Bu işleme önyükleme adı verilir . Derleyicinin kendini derleme yeteneğini test eder ve elde edilen derleyicinin kendisi tarafından uygulanan tüm optimizasyonlarla oluşturulduğundan emin olur.

EDIT : Drew Dormann, yorumlarda, Bjarne Stroustrup'un en eski C ++ uygulamasını açıklamasına işaret ediyor . C ++ ile uygulandı ancak Stroustrup'un C ++ 'dan C'ye "önişlemci" dediği şeyle çevrildi; tanımına göre tam bir derleyici değil, ama yine de C ++ C'de önyüklendi.


19
Bootstrap oluşturma işleminin 3 adımlı sürümü gerçekten doğrulama içindir: derleyicinin kendisi kendi test durumu olarak kullanılır. GCC derlenmiş [diğer] aynı sonuçları (gibi makro iskonto aynı ikili, gerektiği __DATE__ve __TIME__bu da halinin çağrıları arasında değişmektedir , aynı derleyici) derlenmiş GCC olarak [derlenmiş GCC [] Diğer] - değilse, bir hata olduğunu ve 3 aşamalı bootstrap yapısı bunu yakalamak için tasarlanmıştır.
pmdj

19
@pmjordan: "eğer değilse, bu bir hata" veya daha az muhtemel olarak, tanıtılma sürecindeki dolambaçlı bir arka kapı ("Güvene Güvenmeye Yansımalar").
Steve Jessop

12
@sleske: bu doğru değil. Adım 2'nin ikili çıktısı, adım 3'ün ikili çıktısı ile aynı olmalıdır, aksi takdirde bir yerde bir hata vardır. Bunun nedeni pmjordan'ın dediği gibi: NewCompiler1 ve NewCompiler2 aynı kaynağa (NewCompiler ile) sahip programlardır. Aynı giriş verilir (NewCompiler için kaynak). Bu nedenle, kendileri hangi derleyiciyle derlendiklerine bakılmaksızın aynı çıktıyı üreteceklerdir (bu durumda, NewCompiler1, OldCompiler ile derlenmiştir ve NewCompiler2, NewCompiler1 ile derlenmiştir). Yani, NewCompiler2 ve NewCompiler3 ikili olarak aynıdır.
Steve Jessop

12
Merak ettim: Ya tüm C derleyici ikili dosyalarını kaybedersek? Ve sıfırdan önyükleme yapmak zorunda mıydı? İşte böyle giderdim: Tiny C Derleyicisi var (aslında Linux çekirdeğini derleyebiliyor, bu yüzden tam özellikli). Tüm C kaynak dosyaları, yorumlar da dahil olmak üzere yalnızca 30 bin satırlık kod oluşturur. Oldukça biraz çaba olsa da, C'yi anlayan biri kaynaklardan, ikili çıktı üretmeyi ve TCC kaynaklarını elden "derlemeyi" öğrenebilir (aslında burada delikli kartlar düşünüyorum). Daha sonra TCC'yi bununla yeniden derleyin ve GCC veya benzerlerini önyüklemek için kullanın.
datenwolf

11
@datenwolf: böyle bir şey, evet. Tüm C derleyici ikili dosyalarını kaybettiğimizi varsayabilirsek, ancak yine de bir derleyicimiz var, o zaman bir derleyici programı TinyTinyC yazabiliriz. TinyC'den daha az özellikli bir C derleyicisi olurdu: GCC'yi veya linux çekirdeğini derlemek için buna ihtiyacımız yok, sadece TinyC'yi derleyebilmemiz için ihtiyacımız var. Daha sonra bunu Linux (ve umarım glibc ve GCC) derleyebilen bir C derleyicisi veren TinyC kaynağında çalıştırın ve işteyiz. Eğer bir montajcımız bile yoksa, o zaman önce bunlardan birini önyüklerdik, C derleyicisinden daha kolaydır.
Steve Jessop
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.