Ara temsil - Intermediate representation
Program yürütme |
---|
Genel konseptler |
Kod türleri |
Derleme stratejileri |
|
Önemli çalışma zamanları |
|
Önemli derleyiciler ve araç zincirleri |
|
Bir ara temsil ( IR ), kaynak kodunu temsil etmek için bir derleyici veya sanal makine tarafından dahili olarak kullanılan veri yapısı veya kodudur . Bir BT, optimizasyon ve çeviri gibi daha sonraki işlemler için elverişli olacak şekilde tasarlanmıştır . "İyi" bir BT, doğru olmalıdır - kaynak kodunu bilgi kaybı olmadan temsil edebilmelidir - ve herhangi bir belirli kaynak veya hedef dilden bağımsız olmalıdır . Bir IR birkaç biçimden birini alabilir: bir bellek içi veri yapısı veya program tarafından okunabilen özel bir demet veya yığın tabanlı kod . İkinci durumda, ara dil olarak da adlandırılır .
Çoğu modern derleyicide kurallı bir örnek bulunur. Örneğin, CPython yorumlayıcısı, bir programı temsil eden doğrusal insan tarafından okunabilir metni, yürütmeden önce akış analizine ve yeniden düzenlemeye izin veren bir ara grafik yapısına dönüştürür . Bunun gibi bir ara temsilin kullanılması, GNU Derleyici Koleksiyonu ve LLVM gibi derleyici sistemlerinin birçok farklı hedef mimari için kod oluşturmak üzere birçok farklı kaynak dil tarafından kullanılmasına izin verir .
orta dil
Bir ara dil , bilgisayar programlarının analizine yardımcı olmak için tasarlanmış soyut bir makinenin dilidir . Terim , bir programın kaynak kodunun, bir hedef makine için nesne veya makine kodu oluşturmak için kullanılmadan önce kod iyileştirme dönüşümleri için daha uygun bir forma çevrildiği derleyicilerdeki kullanımlarından gelir . Bir ara dilin tasarımı, tipik olarak pratik bir makine dilinden üç temel yolla farklıdır:
- Her talimat tam olarak bir temel işlemi temsil eder; örneğin , mikroişlemcilerde yaygın olan "kaydırma-ekleme" adresleme modları mevcut değildir.
- Kontrol akışı bilgisi, talimat setine dahil edilmeyebilir.
- Kullanılabilir işlemci kayıtlarının sayısı büyük, hatta sınırsız olabilir.
Ara diller için popüler bir biçim, üç adresli koddur .
Bu terim aynı zamanda , kendileri nesne veya makine kodu çıktısı vermeyen, ancak yalnızca ara dili çıktılayan bazı üst düzey programlama dilleri tarafından ara dil olarak kullanılan dillere atıfta bulunmak için kullanılır . Bu ara dil, bu tür bir dil için bir derleyiciye gönderilir ve daha sonra bitmiş nesne veya makine kodu çıktısı alınır. Bu genellikle optimizasyon sürecini kolaylaştırmak veya C gibi birçok işlemci ve işletim sistemi için derleyicileri olan bir ara dil kullanarak taşınabilirliği artırmak için yapılır . Bunun için kullanılan diller, yüksek seviyeli diller ve montaj dilleri gibi düşük seviyeli diller arasındaki karmaşıklık bakımından düşer .
Diller
Açıkça bir ara dil olarak tasarlanmamış olsa da, C bir soyutlama olarak 'ın doğası montaj ve fiili olarak aynı anda her yerde sistem dili içinde Unix benzeri diğer işletim sistemleri ve ona bir popüler ara dili yaptı: Eiffel , Sather , Esterel , bazı ağızlar arasında Lisp ( gür , Gambit ), Haskell'e ( Glasgow Haskell derleyicisi ), ciyaklamak sitesindeki Smalltalk-alt kümesi ağız, Cython , seed7 , SystemTap'ı , Vala , V ve diğerleri, bir ara dil olarak C faydalanmak. C'nin varyantları, C-- ve C Intermediate Language dahil olmak üzere taşınabilir bir derleme dili olarak C'nin özelliklerini sağlamak üzere tasarlanmıştır .
Bir sanal makineyi veya p-kod makinesini hedefleyen herhangi bir dil , bir ara dil olarak kabul edilebilir:
- Java bayt kodu
- Microsoft'un Ortak Ara Dili , makine koduna statik veya dinamik derlemeden önce .NET Framework için tüm derleyiciler tarafından paylaşılmak üzere tasarlanmış bir ara dildir .
- Çoğu ara dil, statik olarak yazılan dilleri desteklemek için tasarlanırken, Parrot ara temsili , dinamik olarak yazılan dilleri (başlangıçta Perl ve Python) desteklemek için tasarlanmıştır.
- TIMI , IBM i platformundaki derleyiciler tarafından kullanılır .
- BCPL için O kodu
- MATLAB önceden derlenmiş kod
- Microsoft P Kodu
- Pascal p kodu
GNU Compiler Collection (GCC) basitleştirmek taşınabilirlik ve dahili birkaç ara dilleri kullanan çapraz derleme . Bu diller arasında
- tarihsel Kayıt Transfer Dili (RTL)
- ağaç dili GENEL
- SSA Gimple tabanlı. (GENERIC'ten daha düşük seviye; çoğu optimize edici için giriş; kompakt bir "bayt kodu" gösterimine sahiptir.)
GCC, nihai hedef olarak bu BT'lerin oluşturulmasını destekler:
- HSA Ara Katmanı
- LLVM Orta Düzey Temsili (LLVM optimize edicileri ve kodlayıcıyı kullanan, artık kullanılmayan llvm-gcc'de GIMPLE'den dönüştürülmüştür)
LLVM derleyici çerçeve dayanmaktadır LLVM IR kompakt, ikili tefrika gösterimi aynı zamanda "bitcode" olarak adlandırılır ve Apple tarafından ürünleştirilmiş edildiği ara dil,. GIMPLE Bytecode gibi, LLVM Bitcode da bağlantı zamanı optimizasyonunda kullanışlıdır. GCC gibi LLVM da bazı IR'lere Google'ın da dahil olmak üzere doğrudan dağıtım içindir hedefleyen PNaCI IR ve SPIR . LLVM içindeki bir başka gelişme , farklı heterojen hedefler için kod oluşturma ve farklı derleyicilerin çıktılarını birleştirme potansiyeline sahip Çok Düzeyli Ara Temsil (MLIR) kullanımıdır.
ILOC ara dili, derleyici tasarımındaki sınıflarda basit bir hedef dil olarak kullanılır.
Başka
Statik analiz araçları genellikle bir ara gösterim kullanır. Örneğin radare2 , ikili dosya analizi ve tersine mühendislik için bir araç kutusudur. İkili dosyaları analiz etmek için ESIL ve REIL ara dillerini kullanır.
Ayrıca bakınız
- Diller arası makine çevirisi
- Pivot dili
- Soyut sözdizimi ağacı
- Bayt kodu (Ara kod)
- Sembol tablosu
- Kaynaktan kaynağa derleyici
- Grafik yeniden yazma ve terim yeniden yazma
- UNCOL