Gcc C derleyicisi C'nin kendisinde mi yazılıyor?


87

Gcc C derleyicisi C'nin kendisinde mi yazılıyor? Yoksa Assembly'de mi yazılmış? Derleyici C'de yazılırsa, derleyici kodunu derlemek için kullanılan derleyici nedir?


12
Evet öyle (çoğunlukla). Elbette, C'yi derlemek için bir C derleyicisine ihtiyaç vardır, bu nedenle çoğu derleyicide olduğu gibi, bir dizi "önyükleme kayışı" aşaması vardır. Genel fikir, GCC'nin Kurulması: GCC - LFS'nin Oluşturulması ve Kurulması bölümünde ele alınmıştır .

2
1980'lerde ve 90'ların başında farklı marka iş istasyonları, hepsi birbirinden biraz farklı olan c derleyicisi, araçları vb. İle kendi unix benzeri ortamlara sahipti. GCC kaynağı ile, bu platformlardan birinde gcc'nin ilk derlemesini yapabilir ve ardından sabit bir noktayı aşağı yukarı kontrol etmek için gcc'yi birkaç kez kendi başına derleyebilirsiniz.
Paul

Yanıtlar:


100

Gcc'nin özel geçmişi, GCC Wiki'de verilmiştir . Daha genel olan nokta, derleyicilerin genellikle kendilerini derleyebilecek kadar güçlü olana kadar başka bir derleyici ile orijinal olarak derlenmeleridir. Alternatif olarak, assembler'daki özelliklerinizin bir alt kümesini işleyebilecek ve oradan oluşturabilecek temel bir derleyici yazmak mümkündür. Ama yine, buna artık neredeyse hiç ihtiyaç duyulmuyor. Çeşitli dillerde pek çok derleyici mevcuttur. Stephen Johnson pcc (ilk C derleyicilerinden biri) yazarken bile, diğer birçok dilin yanı sıra B için de derleyiciler mevcuttu. gcc'nin bunu orijinal olarak oluşturmak için seçebileceği birkaç derleyicisi vardı ve RMS, Pastel derleyicisini en azından ilk geliştirme sırasında kullandığını söylüyor.

Unutmayın, C'de bir C derleyicisinin yazılmasına gerek yoktur. İsterseniz Perl ile de yazabilirsiniz. Belirli bir platform için bir derleyicinin orijinal olarak o platformda yazılmasına gerek yoktur (gömülü sistemler hemen hemen her zaman başka bir sistemde derlenir). Öyleyse kendinizi önyüklemenin birçok yolu var.

Bu soru, derleyicinin ilk önyükleme örneğiyle ilgili bazı ilginç inceliklere sahiptir. Çok zeki olsaydınız, inanılmaz, parlak ve ürkütücü bir şey yapmak için o önyükleme kayışını kullanabilirdiniz .


Woah, bağlantı verdiğin o ikinci makale delice zekice.
Ponkadoodle

1
Harika önyükleme bağlantısı için teşekkürler. Ben derleyiciler hep daha basit dilde makine koduna tüm yol sırtını yazıldığı kabul vardı tür Bu sebeple. (Örneğin, derleyiciniz için ikili dosyanın bir hata içerdiğini fark ederseniz ne olur? Bu tabii ki çok daha güçlü bir örnek sağlar.) Öyleyse derleyiciyi kendi dilinde yazmanın avantajları nelerdir? Aşırı derecede paranoyak insanlar bunun için endişeleniyor ve "kendi kendine" önyükleme yapmadan derleyicilerini oluşturuyor mu?
RoG

4
Bazı dil grupları, kendilerini derleyebilmenin bir onur işareti olduğunu düşünüyor. Go, son zamanlarda bu yönde büyük bir hamle yaptı. Öte yandan Swift, derleyicisini Swift'de yeniden yazmak için mevcut bir plan yapmıyor. Bununla birlikte, GCC'nin her zaman C'de yazıldığına dikkat edin. Yalnızca diğer derleyicilerle derlendi. Ancak tüm C derleyicileri BCPL'de yazılsaydı, bu paranoyayla ilgili hiçbir şeyi düzeltmezdi. Sadece sorunu bir adım geriye götürüyor. (Sadece GCC w / clang'ı derleyerek aynı paranoya faydalarını elde edersiniz.)
Rob Napier

Gcc'nin, gcc ana sürüm X'in her zaman gcc ana sürüm X-1 ile derlenebileceğine dair bir politikası vardır, bu nedenle derleyiciye X'te eklenen tüm yeni özellikler yalnızca X + 1'deki gcc kaynağında kullanılabilir. örneğin, küçük sürüm numarası ne olursa olsun, herhangi bir gcc sürüm 9'u yine küçük sürüm ne olursa olsun herhangi bir gcc 8 ile derleyebilmelisiniz.
Baruch

51

Başlangıçta bir montaj dilinde yazılmıştı, sonra köpek mamasının kendisini oluşturmaya başladı.


2
Orijinal önyükleme için assembler kullanan RMS'ye herhangi bir referans görmedim. Bunun için kaynağınız nedir? Önyüklemesi için birkaç başka derleyicisi vardı, bu yüzden çok iş var gibi görünüyor.
Rob Napier

19
Terimin bootstrap olduğunu sanıyordum.
Martin York

7
hahaha Bunu birkaç hafta önce okudum ve bu ifadeyle aklını kaçırdığını düşündüm, bunun standart olduğunu anlamadım. İyi Gösteri efendim! en.wikipedia.org/wiki/Eating_your_own_dog_food

3

Bu tabii ki sadece çok kaba bir gösterge olsa da, ben bu hızlı buldum listeleme üzerine gcc-5.1.0-src/gcc/dizin ilginç. Bu dizin GCC'nin ana kaynaklarını içerir (çalışma zamanı kitaplıkları hariç).

C ve C ++ dosyalarının hakim olduğu uzantıya göre gruplandırılmış en iyi dosya sayıları (100'den fazla) .

Lütfen günümüzde GCCsadece GNU C Derleyicisini değil, GNU Derleyici Koleksiyonunu ifade ettiğini unutmayın .

6.3 gcc Alt Dizini

Gcc dizini, GCC'nin C kaynaklarının parçası olan birçok dosyayı, yapılandırma ve oluşturma sürecinin bir parçası olarak kullanılan diğer dosyaları ve dokümantasyon ve bir test takımı dahil olmak üzere alt dizinler içerir.

Referans: https://gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

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.