close

Derleyici

Navigasyona git Aramaya git
Image
Tipik bir çok dilli derleyicinin çalışmasının blok şeması.

Bilgisayar biliminde derleyici , bir programlama dilinde ( kaynak olarak adlandırılır) yazılmış kodu başka bir dile ( nesne olarak bilinir) çeviren bir programdır . [ 1 ] Bu tür çevirmenlerde kaynak dil genellikle yüksek seviyeli bir dildir ve nesne , montaj veya makine kodu gibi düşük seviyeli bir dildir . [ 2 ] Bu çeviri işlemi derleme olarak bilinir . [ 3 ]

Bir derleyici oluşturmak, süreci karmaşıklıklarına göre değişen bir dizi aşamaya bölmeyi içerir. Genel olarak, bu aşamalar iki görevde gruplandırılır: kaynak programın analizi ve nesne programının sentezi. [ 4 ] ​: 3 

Alternatif olarak, analiz ve sentez görevleri için açıklanan aşamalar şu şekilde gruplandırılabilir:

Bu bölüm, aynı oluşturucunun birkaç farklı programlama dili için makine kodu oluşturmak için kullanılmasına ve aynı ayrıştırıcının , birden fazla platformda makine kodu üretmek için kullanılacak belirli bir programlama dilinin kaynak kodunu incelemek için kullanılmasına izin verir.

Tarih

1938'de Konrad Zuse , Almanya'da Z1 adı verilen ilk elektromekanik dijital bilgisayarı geliştirdi ve daha sonra 1946'da, ilk elektronik dijital bilgisayar olan EDVAC (1951) tarafından başarılan ilk tam elektronik ENIAC bilgisayarı geliştirildi. Başlangıçta, bu makineler, makine dili olarak adlandırılan, her bir işleme karşılık gelen durumları makinenin devrelerine bildiren sayısal kodlardan oluşan talimatları yürütür .

Kısa süre sonra bu bilgisayarların ilk kullanıcıları, programlarını bu kodlardan daha kolay hatırlanan anahtarları kullanarak yazmanın avantajını keşfettiler; sonunda, tüm bu anahtarlar birlikte manuel olarak makine diline çevrildi. Bu anahtarlar, sözde derleme dillerini oluşturur.

Her şeye rağmen, montaj dili hala bir makinenin diliydi, ancak kullanımı daha kolaydı (makine talimatlarının yerini anımsatıcılar aldı ) bir kişi için mümkün olduğunca basit İlk derleyici 1952'de Grace Hopper tarafından A-0 için yazılmıştır. programlama dili 1950'de John Backus , IBM'de cebirsel bir dil üzerine araştırmalara öncülük etti 1954'te cebirsel bir dilin geliştirilmesi, matematiksel formüllerin bir bilgisayar tarafından çevrilebilecek şekilde yazılmasına izin veren bir dille başladı ve buna FORTRAN (FORmulae TRANslator) adını verdiler. ilk yüksek seviyeli dil ve 1957'de IBM model 704 bilgisayarın kullanımı için tanıtıldı.

Böylece çevirmen kavramı ilk kez bir dili başka bir dile çeviren bir program olarak ortaya çıkmıştır. Çevrilecek dilin yüksek seviyeli bir dil ve çevrilen dilin düşük seviyeli bir dil olduğu özel durumda, derleyici terimi kullanılır.

Derleyici yapma işi karmaşıktı. İlk FORTRAN derleyicisini yapmak 18 kişi-yılını aldı ve çok basitti. FORTRAN'ın bu gelişimi, üzerinde uygulanacağı hedef makineden büyük ölçüde etkilenmiştir. Buna bir örnek olarak, program girişi olarak kullanılan çevre birimi (bir delikli kart okuyucu) beyaz boşlukları doğru saymadığı için beyaz boşlukların yok sayıldığı gerçeğine sahibiz.

İlk bağımsız derleyici, yani kendi kaynak kodunu derleyebilen, 1962'de MIT'de Hart ve Levin tarafından Lisp için oluşturulan derleyiciydi. Derleyiciyi kullandığı dilde yazmak 1970'den beri yaygın bir uygulama haline geldi. PASCAL ve C yaygın olarak kullanılan alternatifler olmasına rağmen derlemeler.

Bağımsız bir derleyici oluşturmak, önyükleme adı verilen bir sorun yaratır, yani bir dil için oluşturulan ilk derleyicinin ya başka bir dilde yazılmış bir derleyici tarafından derlenmesi ya da derleyiciyi bir yorumlayıcıda çalıştırarak derlenmesi gerekir .

Derleyici türleri

Derleyici türlerinin bu sınıflandırması özel değildir, bu nedenle birkaç kategoriye giren derleyiciler olabilir:

  • Çapraz Derleyiciler - Üzerinde çalıştıklarından farklı bir platform için kod oluştururlar. [ 6 ]
  • Derleyicileri optimize etme : Orijinal programın işlevselliğini korurken verimliliğini artırmak için kodda değişiklikler yapın.
  • Tek geçişli derleyiciler: kaynak kodun tek bir okumasından makine kodu oluşturun.
  • Çok geçişli derleyiciler: Makine kodunu üretebilmeleri için kaynak kodunu birkaç kez okumaları gerekir.
  • JIT ( tam zamanında ) derleyicileri: bir yorumlayıcının parçasıdırlar ve gerektiğinde kodun bölümlerini derlerler.

Bilgisayarın ilk günlerinde derleyiciler, var olan en karmaşık yazılımlardan bazıları olarak kabul edildi . [ alıntı gerekli ]

İlk derleyiciler, onları doğrudan makine dilinde veya derlemede programlayarak yapılmıştır . Bir derleyici kullanılabilir olduğunda, derleyicinin (veya farklı derleyicilerin) yeni sürümleri, derleyicinin derlediği dilde yazılabilir.

Derleyiciler veya yorumlayıcılar yazmayı kolaylaştıran araçlar vardır . Bu araçlar, ayrıştırıcının iskeletinin , kaynak dilin resmi bir tanımından üretilmesine izin verir , normalde resmi ve ucuz bir dilbilgisi tarafından belirtilir ve yalnızca derleyici programcının ilişkili anlamsal eylemleri programlamasını sağlar.

Derleme işlemi

Belirli bir programlama dilinde yazılan talimatların makine diline çevrilmesi işlemidir. Yürütülebilir bir nesne programı oluşturmak için bir çevirmene ek olarak başka programlara da ihtiyaç duyulabilir. Bir kaynak program, ayrı dosyalarda saklanan modüllere bölünebilir. Kaynak programı bir araya getirme görevi genellikle önişlemci adı verilen ayrı bir programa emanet edilir . Önişlemci ayrıca kısaltmaları, makro çağrılarını kaynak dil ifadelerine genişletebilir.

Yürütülebilir bir program (tipik bir Windows veya DOS .exe dosyası ) oluşturmak genellikle iki adımı içerir. İlk adıma derleme denir (doğru şekilde söylemek gerekirse) ve bir dosyada saklanan bir programlama dilinde yazılmış kaynak kodunu düşük seviyeli koda (genellikle nesne kodu, doğrudan makine diline değil) çevirir. İkinci adım, derlemeye gönderilen tüm dosya ve alt programlardan oluşturulan düşük seviyeli kodun bağlandığı ve derleyici kitaplıklarındaki işlevlerin kodunun eklendiği ve yürütülebilir dosyanın doğrudan iletişim kurabilmesi için bağlantı oluşturma olarak adlandırılır . işletim sistemi, böylece son olarak nesne kodunu makine koduna çevirir ve yürütülebilir bir modül oluşturur.

Bu iki adım, derleme aşamasının sonucunu nesne dosyalarında (Microsoft Windows, DOS veya Unix için tipik bir .obj ) depolayarak ayrı ayrı yapılabilir; onları sonraki aşamalarda bağlamak veya doğrudan yürütülebilir dosyayı oluşturmak; bu nedenle derleme aşaması yalnızca geçici olarak saklanır. Bir program, bağımsız olarak derlenebilen ve daha sonra tek bir yürütülebilir modül oluşturmak için birbirine bağlanabilen birkaç dilde yazılmış parçalara (örneğin C , C++ ve Asm ) sahip olabilir .

İşlem aşamaları

Çeviri süreci, dahili olarak farklı mantıksal işlemler gerçekleştiren birkaç aşamadan veya aşamadan oluşur. Bu aşamaları tercüman içinde ayrı parçalar olarak düşünmek faydalıdır ve pratikte genellikle birbirine entegre olmalarına rağmen aslında ayrı kodlanmış işlemler olarak yazılabilir.

Analiz aşaması

Sözlüksel analiz

Sözcük analizi ilk aşamayı oluşturur, burada kaynak program soldan sağa okunur ve bir anlamı olan karakter dizileri olan belirteçler halinde gruplandırılır. Ayrıca, tüm boşluklar, boş satırlar, yorumlar ve diğer gereksiz bilgiler kaynak programdan kaldırılır. Ayrıca dilin sembollerinin ( anahtar kelimeler , operatörler , vb.) doğru yazıldığını kontrol eder.

Sözlüksel çözümleyici tarafından gerçekleştirilen görev, örüntü eşleştirmenin özel bir durumu olduğundan, örüntü belirleme ve örüntü tanıma yöntemlerine ihtiyaç duyulur, esas olarak düzenli ifadeleri kabul eden sonlu otomatlar kullanılır . Bununla birlikte, sözcük çözümleyici aynı zamanda çevirmenin kaynak kodu girişini yöneten kısmıdır ve bu girdi genellikle önemli miktarda zaman içerdiğinden sözcük çözümleyicisinin mümkün olduğunca verimli çalışması gerekir.

Ayrıştırma

Bu aşamada, karakterler veya belirteçler, derleyicinin çıktıyı sentezlemek için kullandığı gramer ifadeleri halinde hiyerarşik olarak gruplandırılır. Bir önceki aşamadan elde edilenlerin sözdizimsel olarak doğru olup olmadığı kontrol edilir (dilin gramerine uyar). Genel olarak, kaynak programın dilbilgisi cümleleri bir ayrıştırma ağacı ile temsil edilir.

Bir programın hiyerarşik yapısı normal olarak özyinelemeli kurallar kullanılarak ifade edilir . Örneğin, ifadelerin tanımının bir parçası olarak aşağıdaki kurallar verilebilir:

  1. Bir tanımlayıcı bir ifade olabilir.
  2. Bir sayı bir ifade olabilir.
  3. İfade 1 ve ifade 2 ifadelerse, o zaman şöyledir:
    • ifade 1 + ifade 2
    • ifade 1 * ifade 2
    • ( ifade 1 )

Kural 1 ve 2 temel (yinelemeli olmayan) kurallardır, kural 3 ise ifadeleri diğer ifadelere uygulanan operatörler açısından tanımlar.

Sözcüksel analiz ve sözdizimsel analiz arasındaki ayrım biraz keyfidir. Bölmeyi belirlemede bir faktör, bir kaynak dil yapısının doğası gereği özyinelemeli olup olmadığıdır. Sözcüksel yapılar özyineleme gerektirmezken, sözdizimsel yapılar genellikle gerektirir. Genellikle bir harfle başlayan harf ve rakamlardan oluşan tanımlayıcıları tanımak için özyineleme gerekli değildir. Normalde, tanımlayıcılar yalnızca giriş akışını inceleyerek, ne harf ne de rakam olan bir karakter bulunana kadar bekleyerek ve ardından o noktaya kadar bulunan tüm harfleri ve rakamları tanımlayıcı adı verilen bir belirteçte gruplayarak tanınır . Öte yandan, bu tür bir ayrıştırma, ifadeleri veya önermeleri ayrıştırmak için yeterince güçlü değildir. Örneğin, girdiye bir tür yuvalama veya hiyerarşik yapı dayatmadan ifadelerdeki parantezleri veya ifadelerde başlayan ve biten sözcükleri uygun şekilde eşleştiremeyiz.

Semantik analiz

Semantik analiz aşaması, kaynak programı anlamsal hatalar için inceler ve sonraki kod oluşturma aşaması için türler hakkında bilgi toplar. İfadelerin ve önermelerin operatörlerini ve işlenenlerini tanımlamak için ayrıştırma aşaması tarafından belirlenen hiyerarşik yapıyı kullanır.

Semantik analizin önemli bir bileşeni tip kontrolüdür. Burada derleyici, her operatörün kaynak dil belirtimi tarafından izin verilen işlenenlere sahip olup olmadığını kontrol eder. Örneğin, birçok programlama dilinin tanımları, bir dizinin indeksi olarak gerçek bir sayı kullanıldığında derleyicinin bir hata bildirmesini gerektirir . Bununla birlikte, dil belirtimi, örneğin, bir tam sayıya ve bir gerçek sayıya bir ikili aritmetik işleç uygulandığında, işlenenler üzerinde kısıtlamalar getirebilir. [ 7 ]​ Dizilerin tanımlanmış doğru boyuta sahip olduğunu kontrol edin.

Sentez aşaması

Kaynak programa eşdeğer nesne kodunun üretilmesinden oluşur . Nesne kodu, yalnızca kaynak program ayrıştırma hatası içermediğinde oluşturulur.

Sonuç, makine dili veya derleme kodu olabilir. [ 8 ]​ Program tarafından kullanılan değişkenlerin her biri için bellek konumları seçilir. Daha sonra ara talimatların her biri, aynı görevi gerçekleştiren bir dizi makine talimatına çevrilir. Belirleyici bir yön, değişkenlerin kayıtlara atanmasıdır .

Ara kod üretimi

Ayrıştırma ve anlambilimden sonra, bazı derleyiciler kaynak programın açık bir ara temsilini oluşturur. Bu ara gösterimin iki önemli özelliği olmalıdır: Üretilmesi kolay olmalı ve nesne programına çevrilmesi kolay olmalıdır. [ 9 ]

Ara temsil çeşitli biçimler alabilir. Her komutun tek bir işlem gerçekleştirdiği, Assembly diline benzer " üç adresli kod " adı verilen bir ara form vardır . Üç adresli kod, her biri en fazla üç işlenene sahip bir dizi talimattan oluşur. Bu ara gösterimin birkaç özelliği vardır:

  • Birincisi: her üç adresli talimatın atamaya ek olarak en fazla bir operatörü vardır.
  • İkincisi: çevirmen, her talimat tarafından hesaplanan değerleri saklamak için geçici bir ad oluşturmalıdır.
  • Üçüncüsü: Bazı "üç adresli" komutlar üçten az işlenene sahiptir.

Kod optimizasyonu

Kod optimizasyonu aşaması, ara kodun geliştirilmesinden oluşur, böylece daha hızlı yürütülecek makine kodu elde edilir. Sentez aşamasının bu aşaması, özellikle çevirmen bir derleyici ise mümkündür (bir yorumlayıcı , nesne kodunu zorlukla optimize edebilir). Farklı derleyicilerin gerçekleştirdiği kod optimizasyonunun miktarında çok fazla varyasyon vardır. "Derleyicileri optimize etme" olarak adlandırılan çok fazla optimizasyon yapanlarda, derleyicinin zamanının önemli bir kısmı bu aşamada harcanır. Ancak, derlemeyi çok fazla yavaşlatmadan nesne programının yürütme süresini önemli ölçüde artıran basit optimizasyonlar vardır. [ 7 ]

Ana veri yapısı

Derleyici aşamalarının kullandığı algoritmalar ile bu aşamaları destekleyen veri yapıları arasındaki etkileşim doğal olarak çok güçlüdür. Derleyici yazarı, çok fazla karmaşıklık eklemeden bu algoritmaları olabildiğince verimli bir şekilde uygulamaya çalışır. İdeal olarak, bir derleyici, programın boyutuyla orantılı bir sürede bir programı derleyebilmelidir.

Sözcüksel bileşenler veya belirteçler

Sözcüksel çözümleyici karakterleri bir belirteç içinde topladığı zaman , genellikle belirteci sembolik olarak, yani kaynak dilin belirteç kümesini temsil eden numaralandırılmış bir veri türünün değeri olarak temsil eder. Bazen, karakter dizisinin kendisini veya bir tanımlayıcı belirteci ile ilişkili ad veya bir sayı belirtecinin değeri gibi ondan türetilen diğer bilgileri korumak da gereklidir .

Çoğu dilde, sözcük çözümleyicisinin bir seferde yalnızca bir belirteç oluşturması gerekir. Bu durumda, belirteç bilgisini tutmak için basit bir global değişken kullanılabilir. Diğer durumlarda (en önemlisi FORTRAN ), bir dizi (veya vektör) belirteç gerekli olabilir.

Sözdizimi ağacı

Ayrıştırıcı bir sözdizimi ağacı oluşturursa, genellikle ayrıştırma gerçekleştirilirken dinamik olarak tahsis edilen standart işaretçi tabanlı bir yapı olarak oluşturulur. Tüm ağaç daha sonra kök düğüme işaret eden tek bir değişken olarak tutulabilir . Yapıdaki her düğüm, alanları hem ayrıştırıcı hem de daha sonra anlamsal çözümleyici tarafından toplanan bilgileri temsil eden bir kayıttır. Örneğin, bir ifadenin veri türü, ifade için sözdizimi ağacı düğümünde bir alan olarak tutulabilir.

Bazen, yerden tasarruf etmek için bu alanlar dinamik olarak atanır veya sembol tablosu gibi seçici atama ve ayırmaya izin veren diğer veri yapılarında depolanır. Aslında, sözdizimi ağacının her bir düğümü, temsil ettiği dil yapısının türüne göre farklı niteliklerin saklanmasını gerektirebilir. Bu durumda, sözdizimi ağacındaki her düğüm, her düğüm sınıfı yalnızca o durum için gerekli bilgileri içeren bir değişken kaydı ile temsil edilebilir.

Sembol tablosu

Bu veri yapısı, tanımlayıcılarla ilişkili bilgileri tutar: işlevler , değişkenler , sabitler ve veri türleri . Sembol tablosu, derleyicinin hemen hemen her aşamasıyla etkileşime girer: sözlüksel çözümleyici, ayrıştırıcı veya anlamsal çözümleyici, tanımlayıcıları tabloya sokabilir; anlamsal çözümleyici veri türleri ve diğer bilgileri ekleyecektir; ve kod oluşturma ve optimizasyon aşamaları, uygun nesne kodu seçimlerini yapmak için sembol tablosu tarafından sağlanan bilgileri kullanacaktır.

Sembol tablosu çok sık erişim isteklerine sahip olacağından, ekleme, silme ve erişim işlemlerinin verimli olması, tercihen sabit zamanlı işlemler olması gerekir. Bu amaç için standart bir veri yapısı, çeşitli ağaç yapıları da kullanılabilmesine rağmen, karma veya adres hesaplama tablosudur. Bazen birden çok tablo kullanılır ve bir liste veya yığında tutulur .

Değişmez değerler tablosu

Programda kullanılan sabitleri ve dizeleri saklayan değişmez tablo için hızlı arama ve ekleme de gereklidir. Ancak, verileri programa genel olarak uygulandığından ve bir sabit veya dize bu tabloda yalnızca bir kez görüneceğinden, bir hazır bilgi tablosunun silinmeleri önlemesi gerekir. Değişmez tablo, sabitlerin ve dizelerin yeniden kullanılmasına izin vererek bir programın bellekteki boyutunu küçültmede önemlidir. Ayrıca kod oluşturucunun değişmez değerler için sembolik adresler oluşturması ve nesne kodu dosyasına veri tanımları eklemesi gerekir.

Ara kod

Ara kodun türüne (örneğin, üç adresli kod veya P kodu) ve gerçekleştirilen optimizasyon türlerine bağlı olarak, bu kod bir dizi metin dizisi, geçici bir metin dosyası veya bağlantılı yapıların bir listesi olarak tutulabilir. . Karmaşık optimizasyonlar gerçekleştiren derleyicilerde, kolay yeniden düzenlemeye izin veren temsillerin seçilmesine özellikle dikkat edilmelidir.

Kod optimizasyonu

Kod optimizasyonu aşaması, ara kodu iyileştirmeye çalışır, böylece daha hızlı yürütülecek makine koduyla sonuçlanır. Bazı optimizasyonlar önemsizdir. Örneğin, doğal bir algoritma, iki ifadeyi kullanarak aynı hesaplamaları gerçekleştirmenin daha iyi bir yolu olmasına rağmen, anlamsal analizden sonra ağaç temsilinin her operatörü için bir ifade kullanarak ara kodu (2) üretir.

temp1 := id3 * 60.0 ===> (3)
id1 := id2 + temp1

Bu basit algoritmada yanlış bir şey yoktur, çünkü problem kod optimizasyonu aşamasında çözülebilir. Yani derleyici, 60'ın tamsayıdan gerçeğe dönüştürülmesinin derleme zamanında bir kez ve herkes için yapılabileceği sonucunu çıkarabilir, böylece "entreal()" işlemi ortadan kaldırılabilir. Ayrıca, temp3 değerini id1'e geçirmek için yalnızca bir kez kullanılır. O zaman id1'i temp3 ile değiştirmek güvenlidir, ki buradan (2)'nin son deyimine gerek yoktur ve (3)'ün kodu elde edilir.

Farklı derleyicilerin gerçekleştirdiği kod optimizasyonunun miktarında birçok varyasyon vardır. "Derleyicileri optimize etme" adı verilen bir çok optimizasyon yaptıklarında, derleyicinin zamanının önemli bir kısmı bu aşamada harcanır. Ancak, derlemeyi çok fazla yavaşlatmadan nesne programının yürütme süresini önemli ölçüde artıran basit optimizasyonlar vardır.

Geçici dosyalar

İlk başta, bilgisayarların derleme sırasında tam bir programı kaydetmek için yeterli belleği yoktu. Bu sorun, çeviri sırasında ara adımların ürünlerini tutmak için geçici dosyalar kullanılarak veya "anında" derlenerek, yani derlemenin devam etmesine izin vermek için kaynak programın önceki bölümlerinden yalnızca yeterli bilgi tutularak çözüldü.

Bellek sınırlamaları artık çok daha az sorun teşkil ediyor ve özellikle dilde ayrı derleme varsa, tüm bir derleme biriminin bellekte tutulmasını gerektirebilir. Bununla birlikte, derleyiciler bazen işlemenin bazı aşamalarında ara dosyalar oluşturmayı yararlı bulurlar. Bunların tipik bir örneği, kod oluşturma sırasında geriye doğru doğru adreslere duyulan ihtiyaçtır.

Ayrıca

Referanslar

  1. ^ Clocksin, William (1997). Cümle ve etki . Springer-Verlag. p. 93 _ ISBN  978-3-540-62971-9 . 10-10-2021 alındı . 
  2. Garrido Alenda, Alicia; Iñesta Quereda, Jose Manuel; Moreno Seco, Francisco; Perez Ortiz, Juan Antonio (2002). "1" . Derleyici Tasarımı . ISBN  978-84-7908-700-5 . 10-10-2021 alındı . 
  3. Laborda, Javier; Josep Galimany, Rosa Maria Pena, Antoni Gual (1985). "Yazılım". Pratik Bilgi İşlem Kitaplığı . Barselona: Ocean-Success Editions, SA 
  4. abc Grune , Dick ; van Reeuwijk, Kees; Bal, Henri E.; Jacobs, Ceriel JH; Langendoen, Koen (2012). Modern Derleyici Tasarımı . Springer New York. ISBN  978-1-4614-4698-9 . doi : 10.1007/978-1-4614-4699-6 . 11 Ekim 2021'de alındı . 
  5. ^ a b Hjort Blindell, Gabriel (2016). Talimat Seçimi . Springer Uluslararası Yayıncılık. p. 4. ISBN  978-3-319-34017-3 . doi : 10.1007/978-3-319-34019-7 . 12 Şubat 2022'de alındı . 
  6. Wirth, Niklaus (1996). Derleyici yapısı . Addison-Wesley. ISBN  0-201-40353-6 . 
  7. ^ a b Aho, Alfred V.; Ravi Sethi, Jeffrey D. Ullman (2008). "Derlemeye Giriş". Derleyiciler: İlkeler, Teknikler ve Uygulamalar . Meksika: Addison Wesley. 
  8. ^ Calingaert, Peter (1979). Birleştiriciler, derleyiciler ve program çevirisi (İngilizce) . Bilgisayar Bilimleri Basın. p. 139. ISBN  0-914894-23-4 . OCLC  4497216 . Erişim tarihi: 3 Temmuz 2022 . 
  9. Aho, Alfred V.; Lam, Monica S.; Sethi, Ravi; Ullman, Jeffrey D.; Ah, Alfred V. (2007). Derleyiciler: ilkeler, teknikler ve araçlar (2. baskı). ISBN  0-321-48681-1 . OCLC  70775643 . 2 Temmuz 2022'de alındı . 

Dış bağlantılar