Bugün, bir olmak için gerçek bir C derleyicisi ihtiyaç optimizasyon derleyicisi , özellikle C donanıma yakın bir dil, artık çünkü akım nedeniyle işlemciler (inanılmaz derecede karmaşık dışı sipariş , ardışık , superscalar , kompleks ile önbelleklerini & TLB , bu nedenle , komut çizelgeleme , vb.) gerekir. Bugünün x86 işlemcileri, her ikisi de aynı makine kodunu çalıştırsa bile, önceki yüzyılın i386 işlemcilerine benzemiyor. C'nin düşük seviyeli bir dil olmadığını görün ( David, PC'niz hızlı bir PDP-11 değildir) .
Çok az insan tinycc veya nwcc gibi saf olmayan optimizasyonlu C derleyicileri kullanıyor , çünkü derleyicilerin optimize edebileceğinden birkaç kat daha yavaş kod üretiyorlar.
Bir optimizasyon derleyicisini kodlamak zordur. Hem GCC hem de Clang'ın bazı "kaynak dil-nötr" kod gösterimlerini optimize ettiğini unutmayın (GCC için Gimple, Clang için LLVM). İyi bir C derleyicisinin karmaşıklığı ayrıştırma aşamasında değil!
Özellikle, bir C ++ derleyicisi yapmak bir C derleyicisi yapmaktan çok daha zor değildir: C ++ 'ı ayrıştırmak ve bazı iç kod gösterimlerine dönüştürmek karmaşıktır (çünkü C ++ özelliği karmaşıktır), ancak iyi anlaşılmıştır, ancak optimizasyon parçaları daha da fazladır karmaşık (GCC içinde: orta uç optimizasyonlar, kaynak dil ve hedef işlemci nötr), derleyicinin çoğunluğunu oluşturur, geri kalan kısım birkaç dil için ön uçlar ve birkaç işlemci için arka uçlar arasında dengelenir ). Bu nedenle en iyileştirici C derleyicileri, C ++, Fortran, D, ... gibi diğer bazı dilleri de derleyebilir. GCC'nin C ++ 'a özgü bölümleri, derleyicinin yaklaşık% 20 ...
Ayrıca, C (veya C ++) o kadar yaygın bir şekilde kullanılır ki, insanlar, kendi dillerinin anlamlarını tam olarak yeterince tanımlamamış olan resmi standartlara tam olarak uymasalar bile, kodlarının uyuşmasını beklerler (böylece her derleyicinin kendi yorumu olabilir. onun). Ayrıca CompCert'in kanıtlanmış C derleyicisine ve C'nin daha resmi anlamsallığına önem veren Frama-C statik analizörüne bakın .
Ve optimizasyonlar uzun kuyruklu bir fenomendir: birkaç basit optimizasyon uygulamak kolaydır, ancak bir derleyiciyi rekabetçi hale getirmezler! Çok farklı optimizasyonlar uygulamanız ve rekabetçi bir gerçek dünya derleyicisini elde etmek için bunları akıllıca organize etmeniz ve birleştirmeniz gerekir. Başka bir deyişle, gerçek dünyayı optimize eden bir derleyici, karmaşık bir yazılım parçası olmalıdır. BTW, hem GCC hem de Clang / LLVM, birkaç dahili uzman C / C ++ kod üretecine sahiptir. Ve her ikisi de büyük bir geliştirici topluluğuna (çoğunlukla tam zamanlı veya en az yarı zamanlı çalışan birkaç yüz kişi), büyük canavarlardır (her yıl yüzde birkaç büyüme oranına sahip birkaç milyon kaynak kod satırı).
Orada olduğuna dikkat edin hiçbir bile, çok kanallı C derleyicisi (benim en iyi bildiğim için) bazı (..., talimat zamanlama tahsisi kayıt, örneğin içi prosedürel optimizasyonu) bir derleyici parçaları paralel olarak çalıştırılabilir. Ve paralel inşa etmek make -j
her zaman yeterli değildir (özellikle LTO ile ).
Ayrıca, bir C derleyicisini sıfırdan kodlamak için fon almak zordur ve bu tür bir çabanın birkaç yıl sürmesi gerekir. Son olarak, çoğu C veya C ++ derleyicisi bugün ücretsiz bir yazılımdır (yeni başlayanlar tarafından satılan yeni özel derleyiciler için artık bir pazar yoktur) veya en azından tekelci ürünler ( Microsoft Visual C ++ gibi) vardır ve en az bir zamanlar derleyiciler için ücretsiz bir yazılım olması gerekir ( çünkü birçok farklı kuruluşun katkılarına ihtiyaç duyuyorlar).
C derleyicisinde çalışmak için ücretsiz yazılım olarak sıfırdan bir finansman sağlamaktan memnuniyet duyarım, ancak bugün mümkün olduğuna inanacak kadar saf değilim!