Neden bu kadar az C derleyicisi var?


72

C, dünyada en çok kullanılan dillerden biridir. Mevcut kodun büyük bir bölümünü oluşturuyor ve çok sayıda yeni kod için kullanılmaya devam ediyor. Kullanıcıları tarafından sevilir, o kadar yaygındır ki, C'yi çalıştırabilmek bir platformun gayrı resmi bir tanımıdır ve hayranları tarafından nispeten temiz özelliklere sahip "küçük" bir dil olduğu için övgüyle söz edilir.

Peki tüm derleyiciler nerede?

Masaüstünde, (gerçekçi) iki var : GCC ve Clang. Birkaç saniye düşünürseniz, muhtemelen Intel’in de var olduğunu hatırlayacaksınız. Ortalama bir insanın ismini veremeyecek kadar karanlık olan ve yeni bir dil versiyonunu (ya da çoğu zaman iyi tanımlanmış bir dil altkümesini, sadece “bir altkümeyi”) desteklemek için neredeyse hiç rahatsız edici olmayan bir avuç dolusu insan vardır. Bu listedeki üyelerin yarısı tarihsel dipnotlardır; geri kalanların çoğu çok uzmanlaşmıştır ve hala tüm dili tam anlamıyla kullanmıyorlar. Çok azı aslında açık kaynak gibi görünüyor.

Şema ve İleri - hayranları tarafından sevilen diğer küçük diller - muhtemelen gerçek kullanıcılardan daha fazla derleyiciye sahiptir. SML gibi bir şey bile , C arasında seçim yapabilecek daha "ciddi" uygulamalara sahip olsa da , doğrulamayı hedefleyen yeni (bitmemiş) bir C derleyicisinin açıklanması aslında bazı oldukça olumsuz tepkiler görmekte ve deneyimli uygulamalar bile yeteri kadar katkıda bulunanları yakalamak için çaba sarf etmektedir. C99.

Neden? C uygulaması bu kadar zor mu? C ++ değil. Kullanıcılar, hangi karmaşıklık grubuna girdikleri hakkında çok eğri bir fikre sahipler mi?


61
MSVC hala en azından bir C89 derleyicisi olarak sayılıyor. Muhtemelen Intel'den bile daha popüler.
Rufflewind

22
Vikipedi epeyce C derleyicisini listeler. Onlar olsun çok gömülü alanda kendini bulunca ortak.

113
C kodunuzu derlemek için kaç tane derleyiciye ihtiyacınız var?
Bryan Chen

76
Soru sahte bir öncül dayanmaktadır. Analog Cihazlar, armcc, Bruce C Derleyicisi, Bare-C Cross Derleyicisi, Borland Derleyicisi, Clang Derleyicisi, Cosmic C Derleyicisi, CodeWarrior Derleyicisi, Dokto Derleyicisi, Ericsson Derleyicisi ve alfabenin ilk beş harfi henüz. Bir yoktur delicesine büyük C derleyicileri sayısı. "Bu kadar düzineyi gerçek C derleyicisi olarak saymazsak neden bu kadar az C derleyicisi var?" C derleyicilerinin büyük çoğunluğunu ilginç değil olarak tanımladınız, bu yüzden çok fazla olmadıklarını.
Eric Lippert

19
"Neden" soruları, bu site için en iyi şekilde kötü sorulardır ve "neden olmasın?" sorular daha kötü. Seninle bir partide buluşacak ve "öyleyse neden yelkenlilerle yarışmıyorsun?" Diye sorsam. Bence garip bir soru olarak haklısın. Teknik olarak zor, fiziksel olarak riskli ve çok pahalı bir hobi ile ilgilenmemek için bir gerekçe sunmanıza gerek yok. Önemsiz olmayan herhangi bir yazılımın yazılması pahalı, zor ve risklidir ve bu nedenle çok büyük bir motivasyon gerektirir . Daha iyi bir soru "neden bu kadar çok C derleyicisi var?" Birden fazla olması şaşırtıcıdır.
Eric Lippert

Yanıtlar:


153

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 -jher 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!


14
(there is no more a market for proprietary compilersBunu Visual Studio ekibine söyle ...
Mason Wheeler

18
Microsoft'un tekeli vardır. Yeni C derleyicileri geliştiren küçük şirketlerin çoğunu satmayacaklarını kastettim. MSVC'ye yeni tescilli bir rakibi adlandırabilir misiniz?
Basile Starynkevitch

12
HPC dünyasında birçok tescilli derleyici var. PGCC, NAG ve ICC en yaygın kullanılanlardır.
Davidmh

37
@MasonWheeler: VS bugünlerde ücretsiz olarak verilmektedir (biradaki gibi). Ücretsiz olmayan sürümler takım ekler, ancak VS2013'teki C derleyicisi tüm sürümlerde aynıdır. Sadece bir pazar yok, onlar için bile.
MSalters

3
Ancak her iki GCC ve LLVM çok daha düşük gösterimler üzerinde çalışıyor ve aynı şekilde C ++ & C (ve GCC için Ada & Fortran) kodunu da optimize ediyorlar. Aksine, C ++ 'ın (özellikle STL'sini kullanarak kod derlerken) C'den daha fazla optimizasyon gerektirdiğini söyleyebilirim!
Basile Starynkevitch

70

Sadece az sayıda C uygulamasının olduğu varsayımına itiraz etmek isterim.

C'yi tanımıyorum bile, C'yi kullanmıyorum, C topluluğunun bir üyesi değilim ve henüz bahsettiğim birkaç derleyiciden bile daha fazlasını biliyorum.

Birincisi ve en önemlisi, masaüstünde hem GCC hem de Clang'ı tamamen cüceleyen bir derleyici var: Microsoft Visual C Hem OSX hem de Linux'un masaüstünde yaptıkları yollara rağmen, iOS ve Android'in "çalındığı" pazar payına rağmen uzaklıkta eski geleneksel masaüstü kullanıcılarından Windows hala baskın masaüstü işletim sistemi ve Windows masaüstü C programlarının çoğunluğu muhtemelen Microsoft araçlarını kullanarak derlenmektedir.

Geleneksel olarak, her işletim sistemi satıcısı ve her bir yonga satıcısının kendi derleyicileri vardı. Bir işletim sistemi satıcısı olarak Microsoft, bir işletim sistemi satıcısı ve bir yonga satıcısı olarak Microsoft Visual C'ye sahiptir. IBM, XLC'ye sahiptir (AIX için varsayılan sistem derleyicisi ve hem AIX hem de i / OS'nin derlendiği derleyici) . Intel kendi derleyicisine sahip. Sun / Oracle, Sun Studio'da kendi derleyicisine sahiptir.

Daha sonra, derleyicileri (ve OpenMP kütüphaneleri) numaralandırma için kullanılan PathScale ve The Portland Group gibi yüksek performanslı derleyici satıcıları vardır.

Digital Mars da hala iş başında. Walter Bright'ın (çoğunlukla) üretim kalitesinde bir C ++ derleyicisi oluşturmayı başaran tek kişi olma özelliğine sahip olduğuna inanıyorum.

Son fakat en az değil gömülü mikrodenetleyiciler için tüm özel derleyiciler var. IIRC, her yıl satılan masaüstü, mobil, sunucu, iş istasyonu ve anabilgisayar işlemcilerinden daha fazla mikrodenetleyici var. Yani, bunlar kesinlikle niş ürünler değil .

Onursal bir açıklama, Truva AST'ye gider, JVM'de (!) Çalışan Truffle AST tercüman çerçevesi kullanılarak yazılan JVM (!) Üzerinde çalışan bir C tercümanı (!); Bilgisayar Dilleri Benchmark Oyunu ve mikrobenchmarklarda her ikisinden de daha hızlı. TruffleC kullanarak, Truffle ekibi, Ruby C eklentilerini asıl C Ruby uygulamasından daha hızlı yürütmek için JRuby + Truffle sürümlerini alabildi!

Yani bunlar, C hakkında hiçbir şey bilmeden, kafamın üst kısmından adlandırabileceğim, listelediklerinize ek olarak 6 uygulama.


1
Microsoft Visual C'nin dışında, bahsettiğiniz C derleyicilerinin çoğu nadiren kullanılıyor.
Basile Starynkevitch,

6
MSVC, büyük C ++ derleyicisidir, ancak C için kullanımı zor ve kalıcı olarak C89'da sıkışmış; mikrodenetleyici derleyiciler genellikle hedefe özgü, C89'da sıkışmış ve ilginç; TruffleC henüz mevcut görünmüyor (ancak ilginç, teşekkürler). Pathscale ve Digital Mars daha çok aradığım karşı örneklere benziyor.
Leushenko

8
@Mario benim anlamım C89’un kırılması değil, C89’un dilin güncel hali değil; ve bu, güncel olan daha az derleyicinin var olduğu anlamına gelir .
Leushenko

6
@Leushenko MSVC, C89'da kalıcı olarak sıkışmış değil . Bazı tartışmalar yapıldı ve daha fazla C99 özelliği eklenmeli. Yeni başlayanlar için, C99 kütüphanesinin çoğu MSVC 2015'ten itibaren destekleniyor ve birkaç dil özelliği de var (çoğunlukla C ++ 11 için gerekenler).
Morwenn

5
@Morwenn: Microsoft’un politikası, C99’un C ++ 'ın çözemediği hiçbir sorunu çözmediği ve sistem programlaması yapıyorsanız, C ++ C + alt kümesini kullanmanız gerektiği (çalışma zamanı gerektirmeyen herhangi bir şey veya Derleyicinin bir şeyleri nereye koyacağını kontrol edemediğiniz yerlerde - bu kodun veya verilerin sayfalamanın devre dışı bırakıldığı durumlardan saklanmadığından emin olmanız gerekiyorsa). C99'un tek özellikleri daha sonraki C ++ teknik özelliklerinde ve uygulaması beyinde bulunmayan özelliklerde gerekli olacaktır.
Mike Dimmick

8

Kaç tane derleyiciye ihtiyacınız var?

Farklı özellik kümeleri varsa, taşınabilirlik sorunu yaratırsınız. Eğer metalaştırılmışlarsa "varsayılan" ı (GCC, Clang veya VS) seçin. Son% 5 performansa önem veriyorsanız bir kıyaslama yaptınız.

Programlama dili yapıyorsanız eğlence amaçlı veya araştırma amaçlı çalışırsanız, daha modern bir dilde olabilir. Bu nedenle Scheme ve ML için oyuncak derleyicilerin çoğalması. Her ne kadar OCaml oyuncak olmayan akademik olmayan kullanımlar için biraz çekişiyor gibi görünmektedir.

Bunun dile göre çok değiştiğine dikkat edin. Java aslında Sun / Oracle araç zincirine ve GNU'ya sahiptir. Python'un standart yorumlayıcıya kıyasla hiçbirine gerçekten saygı duyulmayan çeşitli derleyicileri vardır. Rust ve Go'nun her biri tam olarak bir uygulamaya sahiptir. C #, Microsoft ve Mono'ya sahiptir.


1
Bir ML derleyicisi geliştirmek için daha ilginç nedenlerin olduğu açıktır ... C topluluğunun muhtemelen üç büyüklük sırası daha büyük olabileceğini düşünmüştüm. Ama haklı olabilirsin 1000 * 0, hala 0.
Leushenko

Yeni bir derleyici oluşturmak genellikle topluluğun parçalanmasıyla (neden ya da sebep olma) bağlantılıdır. Örneğin, egcs vs gcc kaleci bölünmüş. Ayrıca, C kaynağı uyumluluğu% 100'ün altında olma eğilimindedir.
pjc50

@ pjc50: Standardın etkili bir şekilde yazılması, C'yi temel tür gibi şeylere dayanarak bir dizi ayrık lehçeye böler intve aynı kaynak kodunu çok farklı şekillerde yorumlamaları için farklı derleyiciler gerektirir.
supercat

5
Go’nun iki uygulaması olduğuna inanıyorum ( 6g/ 8g/… toolchain ve gccgo). Aynı zamanda, erGo adında çok ilginç bir tescilli ticari uygulama vardı, ki bu, a) ne gccgo ne de orijinal Go derleyicisinin Windows üzerinde çok iyi çalıştığı bir zamanda Go'nun yerel bir Windows uygulaması değildi, b) Go'ya uzun süredir bahis yapan bir şirket. daha 1.0 olmadan önce ve c) Go'da yazılı ilk Go uygulaması (gccgo ve 6g / 8g, her ikisi de C ile yazılmıştır). Ancak hem proje hem de şirket kapanmış beta sistemlerinden çıkmadan önce ortadan kayboldu.
Jörg W Mittag

6

C / C ++, ortak bir belirtimin 3 ana uygulamasına sahip olması nedeniyle derlenmiş diller arasında benzersizdir.

Çok fazla kullanılmayan herhangi bir şeyi reddetme kuralına göre, derlenmiş her dilin 0'dan 1'e olması gerekir.

Bence javascript 'derlenmiş' olarak belirtmeniz gereken tek neden.


2
"C" etiketi birkaç farklı dile uygulanır; bazıları kodu 8192 değerine uint16_t a=48000u; unsigned uint32_t b=(a*a)/2;atama olarak tanımlar. bBazıları 1152000000 değerini atama olarak tanımlar. Günümüzde çoğu, Tanımsız Davranış olarak kabul edilir ve büyük olasılıkla 3299483648'i saklar, ancak bu konuda hiçbir söz vermez.
supercat

1
@supercat: Ah, taşmaları ve tamsayı promosyon kuralları ile iyi bir garip biri. Kullanmaya 2ya da 2ugörünüşe göre dayanır.
Zan Lynx

1
@ZanLynx: 2'ye karşı 2u'nun yasal olarak önemli olduğu durumlar olduğunu sanmıyorum ; Nerede önemli olduğunu bildiğim tek vaka, hem 2 hem de 2u'daki Tanımsız Davranış.
supercat

3
@supercat: tanımsız davranış nasıl aldın /2u? İmzasız taşma tanımlanmış (uygulama tanımlı N için modulo 2 ^ N olarak) ancak bölme taşma bile yapamaz.
MSalters

2
Tanımsız Davranış, imzalıya terfi ettirilecek int, ancak ürünü o türe sığmayacak olan değerlerin çoğalmasından gelirdi . Bu sonucun imzasız int'ye zorlanması, sonuçta ortaya çıkan değerin yorumlanmasını değiştirir, ancak Tanımlanmamış Davranışı önceki hesaplamadan çıkarmaz.
Supercat

5

Peki hedef diliniz nedir?

SML derleyicileri genellikle C veya LLVM gibi bir şeyi hedeflemektedir (veya bağlantınızda, JVM veya JavaScript’te görüldüğü gibi).

C'yi derliyorsanız, JVM'ye gideceğiniz için değil. C'den daha kötü bir şeye gideceksin . Ve sonra bu küçük cehennemi, tüm hedef platformlarınız için bir kaç kez çoğaltırsınız.

Ve elbette, C C ++ değil, ama C ++ 'a Scheme'den daha yakın olduğunu söyleyebilirim. Kendi tanımsız davranış kötülük alt kümesi var (Size yerleşik türlerin boyutuna bakıyorum). Ve eğer o minutiyi mahvedersen (ya da "doğru" ama beklenmedik şekilde yaparsan), o zaman onlar için ne kadar korkunç olduğunu söyleyen hayati sistemler üzerinde onlarca yıl var olan kodun vardır. Bir SML derleyici kadar vida varsa, sadece işe yaramaz - ve birisi olabilir dikkat edin. Bir gün.


SML / NJ ve PolyML hem makine kodunu derliyorlar ...
Basile Starynkevitch

2
İnt boyutu "Tanımsız Davranış" nasıl? Ve neden UB yine de derleyici satıcılarına yük olsun ki? Derleyici yazarlar için tek gerçek yük, int genişliklerinin tanımlanmamış, uygulama tarafından tanımlanmış olmasıdır, bu nedenle ne yaptığınızı belgelemeniz gerekir.
MSalters

@ MSalters Gerçekte, kurulu bir platform için derleyici yazarları, onlardan öncekilerle eşleştirme yükünü taşıyor. Bazen bu belgelenir ve standardize edilir, bazen değil. Bir int'nin hangi boyutta olduğunu bulmak kolaydır, ancak bir fonksiyon çağrılırken (fonksiyon argüman tiplerine ve fonksiyonun dönüş tipine bağlı olarak değişebilir), fonksiyon kayıt fonksiyonuyla ne yapıldığını bulmak zordur. vs
Random832

@ MSalters Çoğu insan int32 veya 64 bit olmayı bekler , ancak 16 bit kadar küçük olabilir. Aralığın dışında bir sayı üretmek hiç zor değil [−32767, +32767]ve inttaşma UB. De var char/ shortterfi etmeden int veya unsigned int olmamasına bağlı olarak intdaha da bir dönüşüm tetikleyebilir orijinal modeli her değerini temsil edebilir intiçin unsigned intişlenenler farklı türde vardı ve farklı dönüştürülür var, artı potansiyel başka bir dönüşüm eğer sonucu bir değişkene atamak zaman .
Doval

@ MSalters Standart tiplerin boyutunda yeterince boş yer var ve önemsiz olmayan herhangi bir C programı için, yanlış bir şey yapmasına veya tanımlanmamasına neden olacak yasal tamsayı boyutları seçeneğine sahip olduğuna dair iddiaya girdiğim kadar açık dönüşümler var. davranışı.
Doval
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.