GNU Derleyici Koleksiyonu

GNU Derleyici Koleksiyonu

GNU Derleyici Koleksiyonundan Logo
Temel veri

geliştirici GNU projesi
yayın yılı 23 Mayıs 1987
Mevcut  sürüm 11.1
( 27 Nisan 2021 )
işletim sistemi Linux , GNU Hurd , Microsoft Windows
Programlama dili C++
kategori Derleyici
Lisans GNU Genel Kamu Lisansı, Sürüm 3 , GNU Kısıtlı Genel Kamu Lisansı, Sürüm 2.1
Almanca konuşan Evet
gcc.gnu.org

GCC , GNU projesinin derleyici paketinin adıdır . GCC, başlangıçta GNU C Derleyicisi anlamına geliyordu . GCC artık C'nin yanı sıra diğer bazı programlama dillerini de çevirebildiğinden, GCC bu arada GNU Derleyici Koleksiyonu'nun ( GNU Derleyici Koleksiyonu için İngilizce) anlamını üstlenmiştir . gcc komutu (küçük harfle) hala C derleyicisini temsil eder.

genel bakış

Koleksiyon, C , C ++ , Objective-C , D , Fortran , Ada ve Go programlama dilleri için derleyiciler içerir . Derleyici koleksiyonu, GNU Genel Kamu Lisansı'nın koşullarına tabidir .

GCC, birçok Linux dağıtımı , BSD varyantları, NeXTStep , BeOS ve ZETA dahil olmak üzere bir dizi sistem tarafından standart derleyici olarak kullanılır . Ayrıca Cygwin çalışma zamanı ortamı ve MinGW geliştirici araçları için destek sunar . Diğer tüm derleyicilerden daha fazla sistem ve bilgisayar mimarisine taşınmıştır ve özellikle farklı donanım platformlarında çalışması gereken işletim sistemleri için uygundur . GCC ayrıca bir çapraz derleyici olarak da kurulabilir.

2014 yılında ACM SIGPLAN'dan Programlama Dilleri Yazılım Ödülü'nü aldı.

Öykü

GCC'nin ilk genel sürümü (0.9) 22 Mart 1987'de Richard Stallman tarafından GNU projesi için yayınlandı (sürüm 1.0, aynı yılın 23 Mayıs'ında yayınlandı) ve şu anda tüm dünyadaki programcılar tarafından geliştiriliyor. C derleyici paketinin derleyici koleksiyonuna genişletilmesi, bir süre GCC'ye paralel olarak var olan ve sonunda resmi GCC olan EGCS projesi çerçevesinde gerçekleşti.

EGCS

1997 yılında, Deneysel / Gelişmiş GNU Derleyici Sistemi ( EGCS , deneysel / geliştirilmiş GNU derleyici sistemi için İngilizce ) projesi GCC'den ayrıldı ve 1999'da onunla yeniden birleştirildi.

GCC 1.x 1991'de belirli bir istikrara kavuşmuştu, ancak mimariyle ilgili sınırlamalar birçok gelişmeyi engelledi, bu nedenle Özgür Yazılım Vakfı (FSF) GCC 2.x'i geliştirmeye başladı. Ancak 1990'ların ortalarında, FSF, GCC 2.x'e nelerin eklenebileceğini ve eklenemeyeceğini çok yakından takip etti, bu nedenle GCC, Eric S. Raymond'ın bulduğu “Katedral” geliştirme modelinin bir örneği olarak kullanıldı. Katedral ve Çarşı adlı kitabını anlatıyor.

GCC'nin özgür bir yazılım olması, farklı bir yönde çalışmak isteyen programcıların kendi yan ürünlerini geliştirmelerine izin verdi . Ancak, birçok bölünmenin verimsiz ve kafa karıştırıcı olduğu ortaya çıktı. Çalışmalarının genellikle resmi GCC projesi tarafından kabul edilmemesi veya yalnızca zorlukla kabul edilmesi birçok geliştiriciyi hayal kırıklığına uğrattı.

Böylece 1997'de bir grup geliştirici, birkaç deneysel yan ürünü tek bir projede birleştirmek için EGCS'yi kurdu. Bu, g77 ( Fortran ), PGCC ( Pentium için optimize edilmiş GCC), C ++ için birçok iyileştirmenin yanı sıra diğer işlemci mimarileri ve işletim sistemleri için derleyici sürümlerini içeriyordu.

EGCS'nin geliştirilmesinin GCC projesinden daha hızlı, daha canlı ve genel olarak daha iyi olduğu ortaya çıktı, böylece 1999'da FSF, GCC 2.x'in daha da geliştirilmesini resmi olarak durdurdu ve bunun yerine EGCS'yi resmi GCC versiyonu olarak kabul etti. EGCS geliştiriciler proje yöneticileri (oldu sürdürme GCC). O andan itibaren proje, artık “katedral” modeline göre değil, “çarşı” modeline göre açıkça geliştirildi. Temmuz 1999'da GCC 2.95'in yayınlanmasıyla her iki proje yeniden bir araya geldi.

Hedef sistemler

Gnome 2.20 ile Ubuntu 7.10 altında bir komut satırı penceresinde GCC 4.1.3

GCC projesi resmi olarak bazı platformları birincil, bazılarını ikincil değerlendirme platformları olarak belirler. Her yeni sürüm yayınlanmadan önce özellikle bu iki grup test edilir. GCC, aşağıdaki işlemciler için programlar oluşturabilir (birincil ve ikincil değerlendirme platformları işaretlenmiştir):

Ek olarak, gömülü sistemlerden bir dizi işlemci vardır , örneğin

Resmi GCC'nin bir parçası değil, ancak ondan türetilen ve ticari olarak satılan türevleri var.

Toplamda, GCC 60'tan fazla platformu desteklemektedir.

yapı

GCC'den Tasarım Akışı

gcc'nin harici arayüzü, standart bir Unix derleyicisinin arayüzüne karşılık gelir.

  1. Kullanıcı, adıyla bir ana programı çağırır gcc.
  2. GCC, komut satırı argümanını yorumlar.
  3. GCC, mevcut girdi dosyasının programlama dilini belirler.
  4. İlgili dil derleyicisi çağrılır.
  5. Çıktı montajcıya iletilir .
  6. Sonunda bağlayıcı çağrılır.
  7. Tam, d. H. çalıştırılabilir program oluşturuldu.

Her dil derleyicisi, kaynak kodunu alan ve derleme dili üreten ayrı bir programdır. Sağdaki diyagram, her ikisinin de ön işleme tabi tutulması gereken , derleyici makrolarının , entegre başlık dosyalarının ve benzerlerinin saf C kodu veya assembler elde etmek için dönüştürüldüğü C ve assembler için örnekler verir . Bu dile bağlı ön uç , karşılık gelen dili ayrıştırır ve ağacı GCC'nin Kayıt Aktarım Dili'ne (RTL) (şemada gösterilmemiştir ) aktaran, arka uca aktarılan soyut bir sözdizimi ağacı oluşturur , çeşitli kod optimizasyonları gerçekleştirir ve son olarak Assembly dili oluşturur.

Başlangıçta, GCC'nin bölümlerinin çoğu C ile yazılmıştır. “GCC in Cxx” projesi kapsamında 2010 yılında gcc kaynaklarının C++'a dönüştürülmesi planlanmış ve başlamıştır. Bu değişikliğin amacı, GCC'yi anlaşılır ve sürdürülebilir kılmaktır. Takip eden projede, GCC oluşturma sürecinin hala eksik olan 1. aşaması C++ koduna dönüştürüldü. İstisnalar, büyük ölçüde RTL'de formüle edilen arka uçlar ve çoğunlukla Ada'da yazılan Ada ön ucudur.

Ön uçlar

Ön uçlar, arka uç tarafından işlenebilecek ağaçlar üretmelidir. Bunu nasıl başaracakları onlara kalmış. Bazı ayrıştırıcıları kullanmak Yacc- diğerleri el yazısı, özyinelemeli ayrıştırıcıları, grammars gibi.

Yakın zamana kadar, programın ağaç gösterimi, hedef işlemciden tamamen bağımsız değildi. Bir ağacın anlamı farklı dil ön uçları için farklı olabilir ve ön uçlar kendi ağaç kodlarını sağlayabilir.

GCC 4.0 sürümüne entegre edilen Tree SSA projesi ile dilden bağımsız iki yeni ağaç formu tanıtıldı. Bu yeni ağaç biçimleri GENERIC ve GIMPLE olarak adlandırıldı . Ayrıştırma artık dile bağlı geçici bir ağaç GENERIC'e dönüştürülerek gerçekleştirilir. "Gimplifier" adı verilen bu karmaşık formu, bir dizi yeni dil ve mimariden bağımsız optimizasyonun gerçekleştirilebildiği SSA tabanlı GIMPLE formuna aktarır.

orta uç

Ağaçlarda optimizasyon, aslında "ön uç" ve "arka uç" şemasına uymaz çünkü bunlar dile bağımlı değildir ve ayrıştırma içermez. GCC geliştiricileri bu nedenle derleyicinin bu bölümüne "Orta Uç" adını verdiler. Şu anda SSA ağacında yürütülmekte olan optimizasyonlar arasında ölü kod eliminasyonu , kısmi fazlalık eliminasyonu , global değer numaralandırma , seyrek koşullu sabit yayılım , toplamların skaler değişimi ve otomatik vektörleştirme gibi dizi tabanlı optimizasyonlar bulunmaktadır .

arka uç

GCC arka ucunun davranışı kısmen önişlemci makroları ve mimariye özgü işlevler tarafından belirlenir; bunlarla örneğin endianness , kelime boyutu ve çağrı kuralları tanımlanır ve hedef makinenin kayıt yapısı tanımlanır. GCC, Lisp benzeri bir tanımlama dili olan makine açıklamasını kullanarak, dahili ağaç yapısını RTL temsiline dönüştürür. Bu ismen işlemciden bağımsız olmasına rağmen, soyut talimatların sırası bu nedenle zaten hedefe uyarlanmıştır.

GCC tarafından RTL üzerinde gerçekleştirilen optimizasyonların türü ve sayısı, her derleyici sürümü ile daha da geliştirilir. Onlara (genel) ortak alt ifade ortadan kaldırılması , çeşitli döngü ve atlama optimizasyonu ( İngilizce if-dönüşüm, dal olasılık tahmini, kardeş çağrıları, sabit yayılım , ... ) ve birkaç talimatın tek bir komutta birleştirildiği birleştirme eşleştirmesi hakkında. olabilir.

GIMPLE ağaçlarında küresel SSA tabanlı optimizasyonların sunulmasından bu yana, programın RTL gösterimi birçok optimizasyon için önemli olan yüksek seviyeli bilgilerin çok daha azını içerdiğinden, RTL optimizasyonları önemini biraz yitirmiştir. Bununla birlikte, makineye bağlı optimizasyonlar da çok önemlidir, çünkü birçok optimizasyon için makineyle ilgili bilgilerin mevcut olması gerekir, örneğin bir makinenin hangi talimatları bildiği, bunların ne kadar pahalı olduğu ve hedef mimarinin boru hattının nasıl olduğu gibi.

"Yeniden Yükle" aşamasında, temelde sınırsız sayıdaki soyut sözde kayıtlar, sınırlı sayıda gerçek makine kaydı ile değiştirilir; bu sayede, örneğin işlevin yığınına sözde kayıtlar koymak için koda yeni talimatların eklenmesi gerekebilir. geçici olarak saklamak için. İlgili hedef mimarinin çeşitli özelliklerinin özellikle dikkate alınması gerektiğinden, bu kayıt tahsisi oldukça karmaşıktır.

Son aşamada, gözetleme deliği optimizasyonu ve gecikme yuvası zamanlaması gibi optimizasyonlar , RTL'nin çok makine yönelimli versiyonu, yazmaçların ve adreslerin adlarını talimatları belirten karakter dizilerine dönüştürülerek montajcı koduna eşlenmeden önce gerçekleştirilir.

Ayrıca bakınız

Edebiyat

Bireysel kanıt

  1. www.gnu.org .
  2. GCC 11.1 Yayınlandı .
  3. a b c GCC - GNU Projesi - Özgür Yazılım Vakfı'nın (FSF) Kurulumu . (11 Aralık 2018'de erişildi).
  4. Jens Ihlenfeld: Derleyici GCC 4.5.1 yayınlandı. golem.de, 2 Ağustos 2010, erişim tarihi 27 Nisan 2015 .
  5. Nikolaus Schüler: Gcc Derleyicisi - Genel Bakış ve Çalıştırma. 1. baskı. bhv, Kaarst 1997, sayfa 28. ISBN 3-89360-873-7
  6. GNU C derleyici beta testi sürümü - Google Gruplarından gelen mesaj , 22 Mart 1987, 1 Mart 2017'de erişildi.
  7. Alexander Neumann: GCC 4.7 ve GNU Derleyici Koleksiyonunun 25 yılı. heise.de, 22 Mart 2012, erişim tarihi 24 Mart 2012 .
  8. GCC için ana bilgisayar/hedefe özel kurulum notları . İçinde: gnu.org , 23 Şubat 2006 (İngilizce).
  9. https://gcc.gnu.org/wiki/gcc-in-cxx
  10. Cxx dönüştürme
  11. Thorsten Leemhuis: GCC, dahili olarak C++'a giderek daha fazla güveniyor. heise.de, 16 Ağustos 2012, erişildi 26 Nisan 2015 .
  12. GCC'de otomatik vektörleştirme . gcc.gnu.org, 25 Temmuz 2021'de erişildi.

İnternet linkleri

Commons : GNU Derleyici Koleksiyonu  - resimler, videolar ve ses dosyaları içeren albüm