LLVM - LLVM

LLVM
LLVM logosu, stilize edilmiş bir wyvern (kanatsız ejderha)
LLVM logosu, stilize edilmiş bir wyvern
Orijinal yazar(lar) Vikram Adve , Chris Lattner
Geliştirici(ler) LLVM Geliştirici Grubu
İlk sürüm 2003 ; 18 yıl önce ( 2003 )
kararlı sürüm
13.0.0 / 30 Eylül 2021 ; 17 gün önce ( 2021-09-30 )
Önizleme sürümü
13.0.0-rc4 / 24 Eylül 2021 ; 23 gün önce ( 2021-09-24 )
depo
Yazılmış C++
İşletim sistemi Çapraz platform
Tip Derleyici
Lisans UIUC ( BSD stili ) LLVM İstisnaları ile
Apache Lisansı 2.0 (v9.0.0 veya üstü)
İnternet sitesi www .llvm .org

LLVM , herhangi bir programlama dili için bir ön uç ve herhangi bir talimat seti mimarisi için bir arka uç geliştirmek üzere kullanılabilen bir dizi derleyici ve araç zinciri teknolojisidir . LLVM, çoklu geçişler üzerinden çeşitli dönüşümlerle optimize edilebilen , taşınabilir , yüksek seviyeli bir montaj dili olarak hizmet veren, dilden bağımsız bir ara temsil (IR) etrafında tasarlanmıştır .

LLVM, C++ ile yazılmıştır ve derleme zamanı , bağlantı zamanı , çalışma zamanı ve "boş zaman" optimizasyonu için tasarlanmıştır. Başlangıçta C ve C++ için uygulanan LLVM'nin dilden bağımsız tasarımı o zamandan beri çok çeşitli ön uçlar üretti: LLVM kullanan derleyicilere sahip diller arasında ActionScript , Ada , C# , Common Lisp , PicoLisp , Crystal , CUDA , D , Delphi , Dylan , Fortran , Graphical G , Halide , Haskell , Java bayt kodu , Julia , Kotlin , Lua , Objective-C , OpenCL , PostgreSQL'in SQL ve PLpgSQL, Ruby , Rust , Scala , Swift , XC, Xojo ve Zig .

Tarih

LLVM projesi 2000 yılında başlamış Urbana-Champaign Illinois Üniversitesi'nde yönetiminde, Vikram Adve ve Chris Lattner . LLVM adı , başlangıçta Düşük Düzeyli Sanal Makine için bir başlangıçtı . LLVM başlangıçta statik ve dinamik programlama dilleri için dinamik derleme tekniklerini araştırmak için bir araştırma altyapısı olarak geliştirilmiştir . LLVM altında yayınlandı University of Illinois / NCSA Açık Kaynak Lisansı , bir keyfi özgür yazılım lisansı . 2005 yılında Apple Inc. , Lattner'ı işe aldı ve Apple'ın geliştirme sistemlerinde çeşitli kullanımlar için LLVM sistemi üzerinde çalışmak üzere bir ekip kurdu. LLVM, Apple'ın macOS ve iOS için en son geliştirme araçlarının ayrılmaz bir parçasıdır .

LLVM kısaltması, karışıklığı önlemek için resmi olarak kaldırılmıştır, çünkü LLVM, mevcut geliştiricilerin çoğunun (daha spesifik olarak) proses sanal makineleri olarak düşündükleri ile çok az ilişkisi olan bir şemsiye projeye dönüşmüştür . Şimdi, LLVM LLVM şemsiye projesi için geçerli olan bir markadır, LLVM ara gösterimi (IR), LLVM ayıklayıcı ait LLVM uygulaması C ++ Standart Kütüphanesi (tam desteği ile C ++ 11 ve C ++ 14 ), vb. LLVM, LLVM Vakfı tarafından yönetilmektedir. Başkanı, derleyici mühendis Tanya Lattner'dir.

" LLVM'yi tasarlamak ve uygulamak için" , Bilgi İşlem Makineleri Derneği , 2012 ACM Yazılım Sistemi Ödülü'nü Vikram Adve, Chris Lattner ve Evan Cheng'e verdi .

v9.0.0'dan beri, LLVM İstisnaları ile Apache Lisansı 2.0'a yeniden lisanslanmıştır .

Özellikleri

LLVM alarak, tam bir derleyici sisteminin orta katmanları sağlayabilir ara temsili bir (IR) kodunu derleyici ve optimize edilmiş bir IR yayan. Bu yeni IR daha sonra dönüştürülebilir ve bir hedef platform için makineye bağlı derleme dili koduna bağlanabilir . LLVM, GNU Derleyici Koleksiyonu (GCC) araç zincirinden IR'yi kabul edebilir ve bu proje için yazılmış çok çeşitli mevcut derleyici ön uçları ile kullanılmasına izin verebilir.

LLVM da üretebilir relocatable makine kodunu çalışma zamanında derleme zamanında veya bağlantı zamanlı ve hatta ikili makina koduna.

LLVM, dilden bağımsız bir komut setini ve tip sistemini destekler . Her talimat statik tek atama biçimindedir (SSA), yani her değişkene (yazılı kayıt adı verilir) bir kez atanır ve ardından dondurulur. Bu, değişkenler arasındaki bağımlılıkların analizini basitleştirmeye yardımcı olur. LLVM, geleneksel GCC sistemi altında olduğu gibi kodun statik olarak derlenmesine veya Java'ya benzer şekilde tam zamanında derleme (JIT) yoluyla IR'den makine koduna geç derlemeye bırakılmasına izin verir . Tür sistemi, tamsayı veya kayan nokta sayıları gibi temel türlerden ve beş türetilmiş türden oluşur : işaretçiler , diziler , vektörler , yapılar ve işlevler . Somut bir dilde bir tür yapısı, bu temel türleri LLVM'de birleştirerek temsil edilebilir. Örneğin, C++'daki bir sınıf, yapıların, işlevlerin ve işlev işaretçilerinin dizilerinin bir karışımıyla temsil edilebilir .

LLVM JIT derleyicisi, çalışma zamanında bir programdan gereksiz statik dalları optimize edebilir ve bu nedenle, bir programın birçok seçeneğe sahip olduğu ve çoğu belirli bir ortamda ihtiyaç duyulmadan kolayca belirlenebildiği durumlarda kısmi değerlendirme için kullanışlıdır . Bu özellik, eksik donanım özellikleri için destek sağlamak için Mac OS X Leopard'ın (v10.5) OpenGL ardışık düzeninde kullanılır.

OpenGL yığını içindeki grafik kodu, ara gösterimde bırakılabilir ve daha sonra hedef makinede çalıştırıldığında derlenebilir. Üst düzey grafik işleme birimlerine (GPU'lar) sahip sistemlerde , elde edilen kod oldukça ince kalır ve yönergeleri minimum değişiklikle GPU'ya iletir. Düşük kaliteli GPU'lara sahip sistemlerde LLVM, yerel merkezi işlem biriminde (CPU) çalışan ve GPU'nun dahili olarak çalıştıramayacağı talimatları taklit eden isteğe bağlı prosedürleri derleyecektir . LLVM, Intel GMA yonga setlerini kullanan düşük kaliteli makinelerde performansı artırdı . Benzer bir sistem Gallium3D LLVMpipe altında geliştirildi ve uygun bir 3D donanım sürücüsü yüklenmeden çalışmasına izin vermek için GNOME kabuğuna dahil edildi .

Derlenen programların çalışma zamanı performansı için, GCC önceden 2011'de LLVM'den ortalama %10 daha iyi performans gösterdi. 2013'teki daha yeni sonuçlar, LLVM'nin bu alanda GCC'yi yakaladığını ve şimdi yaklaşık olarak eşit performansa sahip ikili dosyaları derlediğini gösteriyor.

Bileşenler

LLVM, birden fazla bileşen içeren bir şemsiye proje haline geldi.

Ön uçlar

LLVM orijinal olarak GCC yığınındaki mevcut kod oluşturucunun yerine geçecek şekilde yazılmıştır ve GCC ön uçlarının çoğu onunla çalışacak şekilde değiştirilmiştir ve bu da artık kullanılmayan LLVM-GCC paketi ile sonuçlanmıştır. Değişiklikler genellikle bir GIMPLE'den LLVM'ye IR adımını içerir, böylece GCC'nin GIMPLE sistemi yerine LLVM optimize edicileri ve codegen kullanılabilir. Apple, Xcode 4.x (2013) aracılığıyla önemli bir LLVM-GCC kullanıcısıydı . GCC ön ucunun bu kullanımı çoğunlukla geçici bir önlem olarak kabul edildi, ancak Clang'ın ortaya çıkması ve LLVM ve Clang'ın modern ve modüler kod tabanının (derleme hızının yanı sıra) avantajlarıyla birlikte, çoğunlukla modası geçmiş.

LLVM şu anda Ada , C , C++ , D , Delphi , Fortran , Haskell , Julia , Objective-C , Rust ve Swift'in çeşitli ön uçlar kullanılarak derlenmesini desteklemektedir .

LLVM'ye yönelik yaygın ilgi, çeşitli diller için yeni ön uçlar geliştirmeye yönelik çeşitli çabalara yol açmıştır. En çok ilgi gören, C, C++ ve Objective-C'yi destekleyen yeni bir derleyici olan Clang'dır. Öncelikli olarak Apple tarafından desteklenen Clang, GCC sistemindeki C/Objective-C derleyicisini, entegre geliştirme ortamları (IDE'ler) ile daha kolay entegre olan ve çoklu kullanım için daha geniş desteğe sahip bir sistemle değiştirmeyi amaçlıyor . OpenMP yönergeleri için destek, 3.8 sürümünden bu yana Clang'a dahil edilmiştir .

Utrecht Haskell derleyicisi LLVM için kod üretebilir. Oluşturucu, geliştirmenin ilk aşamalarında olmasına rağmen, çoğu durumda C kodu oluşturucudan daha verimli olmuştur. LLVM kullanan bir Glasgow Haskell Derleyici (GHC) arka ucu vardır ve bu, GHC veya C kodu oluşturma yoluyla yerel kod derlemesine göre derlenmiş kodun %30 oranında hızlandırılmasını sağlar, ardından derleme tarafından uygulanan birçok optimizasyon tekniğinden yalnızca biri eksiktir. GHC.

Rust derleyicisi, bir Java bayt kodu ön ucu, bir Ortak Orta Düzey Dil (CIL) ön ucu, Ruby 1.9'un MacRuby uygulaması, Standart ML için çeşitli ön uçlar dahil ancak bunlarla sınırlı olmayan diğer birçok bileşen çeşitli geliştirme aşamalarındadır. , ve yeni bir grafik renklendirme kayıt ayırıcı.

ara temsil

LLVM IR, örneğin radeonsi ve llvmpipe tarafından kullanılır. Her ikisi de Mesa 3D'nin bir parçasıdır .

LLVM'nin çekirdeği, Assembly'ye benzer düşük seviyeli bir programlama dili olan ara temsildir (IR). IR, hedefin çoğu detayını soyutlayan , güçlü bir şekilde yazılmış azaltılmış komut seti hesaplama (RISC) komut setidir. Örneğin, çağırma kuralı, açık argümanlarla çağrı ve ret talimatları yoluyla özetlenir . Ayrıca, sabit bir kayıt seti yerine IR, %0, %1 vb. biçimindeki sonsuz bir geçiciler kümesini kullanır. LLVM, üç eşdeğer IR biçimini destekler: insan tarafından okunabilen bir derleme biçimi, aşağıdakiler için uygun bir bellek içi biçim. ön uçlar ve serileştirme için yoğun bir bit kodu biçimi. Basit bir "Merhaba dünya!" IR formatında program :

@.str = internal constant [14 x i8] c"hello, world\0A\00"

declare i32 @printf(i8*, ...)

define i32 @main(i32 %argc, i8** %argv) nounwind {
entry:
    %tmp1 = getelementptr [14 x i8], [14 x i8]* @.str, i32 0, i32 0
    %tmp2 = call i32 (i8*, ...) @printf( i8* %tmp1 ) nounwind
    ret i32 0
}

Farklı hedefler tarafından kullanılan birçok farklı kural ve özellikler, LLVM'nin gerçekten hedeften bağımsız bir IR üretemeyeceği ve bazı yerleşik kuralları çiğnemeden yeniden hedefleyemeyeceği anlamına gelir. Belgelerde açıkça belirtilenlerin ötesinde hedef bağımlılığı örnekleri, çevrimiçi dağıtıma yönelik tamamen hedeften bağımsız bir LLVM IR varyantı olan "wordcode" için 2011 teklifinde bulunabilir. Daha pratik bir örnek, PNaCl'dir .

Arka uçlar

3.4 sürümünde LLVM , ARM , Qualcomm Hexagon , MIPS , Nvidia Parallel Thread Execution (PTX; LLVM belgelerinde NVPTX olarak adlandırılır ), PowerPC , AMD TeraScale , AMD Graphics Core Next (GCN), SPARC , z/Architecture dahil olmak üzere birçok talimat setini destekler ( LLVM belgelerinde SystemZ olarak adlandırılır ), x86 , x86-64 ve XCore . Bazı özellikler bazı platformlarda mevcut değildir. Çoğu özellik x86, x86-64, z/Architecture, ARM ve PowerPC için mevcuttur. RISC-V , sürüm 7'den itibaren desteklenir. Geçmişte LLVM, C arka ucu, Cell SPU , mblaze (MicroBlaze) , AMD R600, DEC/Compaq Alpha ( Alpha AXP ) ve Nios2 dahil olmak üzere diğer arka uçları tamamen veya kısmen destekledi , ancak çoğu bu donanımın çoğu eskimiş durumda ve LLVM geliştiricileri, destek ve bakım maliyetlerinin artık haklı olmadığına karar verdi.

LLVM ayrıca hedef olarak WebAssembly'yi destekler ve derlenmiş programların Google Chrome / Chromium , Firefox , Microsoft Edge , Apple Safari veya WAVM gibi WebAssembly'nin etkin olduğu ortamlarda yürütülmesini sağlar . LLVM uyumlu WebAssembly derleyicileri genellikle C, C++, D, Rust, Nim, Kotlin ve diğer birkaç dilde yazılmış çoğunlukla değiştirilmemiş kaynak kodunu destekler.

LLVM makine kodu (MC) alt projesi, LLVM'nin makine talimatlarını metinsel formlar ve makine kodu arasında çevirmeye yönelik çerçevesidir. Daha önce, LLVM, montajı makine koduna çevirmek için sistem montajcısına veya bir alet zinciri tarafından sağlanana güveniyordu. LLVM MC'nin entegre derleyicisi, x86, x86-64, ARM ve ARM64 dahil olmak üzere çoğu LLVM hedefini destekler. Çeşitli MIPS komut setleri de dahil olmak üzere bazı hedefler için tümleşik derleme desteği kullanılabilir ancak hala beta aşamasındadır.

bağlayıcı

lld alt projesi, LLVM için yerleşik, platformdan bağımsız bir bağlayıcı geliştirme girişimidir . lld, üçüncü taraf bir bağlayıcıya olan bağımlılığı ortadan kaldırmayı amaçlar. Mayıs 2017 itibarıyla, lld, azalan eksiksizlik sırasına göre ELF , PE/COFF , Mach-O ve WebAssembly'yi destekler . lld, GNU ld'nin her iki türünden daha hızlıdır .

GNU bağlayıcılarından farklı olarak, lld, bağlantı zamanı optimizasyonu için yerleşik desteğe sahiptir . Bu, bir bağlayıcı eklentisinin kullanımını atladığı için daha hızlı kod üretimine izin verir, ancak diğer yandan LTO'nun diğer çeşitleriyle birlikte çalışabilirliği yasaklar.

C++ Standart Kitaplığı

LLVM projesi, libc++ adlı, MIT Lisansı ve UIUC lisansı altında çift lisanslı bir C++ Standart Kitaplığı uygulamasını içerir .

v9.0.0'dan beri, LLVM İstisnaları ile Apache Lisansı 2.0'a yeniden lisanslanmıştır .

Polly

Bu, çokyüzlü bir model kullanarak otomatik paralellik ve vektörleştirmenin yanı sıra bir dizi önbellek-yerellik optimizasyonu uygular.

hata ayıklayıcı

türevler

İzin verilen lisansı nedeniyle, birçok satıcı kendi ayarlı LLVM çatallarını yayınlar. Bu, LLVM'nin bu nedenle özellik kontrollerinde sürüm numaralarının kullanılmasını önermeyen belgeleri tarafından resmi olarak tanınır. Satıcılardan bazıları şunlardır:

Ayrıca bakınız

Edebiyat

  • Chris Lattner - Açık Kaynak Uygulamalarının Mimarisi - Bölüm 11 LLVM , ISBN  978-1257638017 , 2012'de CC BY 3.0 ( Açık Erişim ) altında yayınlandı .
  • LLVM: Hayat Boyu Program Analizi ve Dönüşümü için Bir Derleme Çerçevesi , Chris Lattner, Vikram Adve tarafından yayınlanan bir makale

Referanslar

Dış bağlantılar