LLVM
| LLVM | |
|---|---|
| Bir çeşit | derleyici |
| geliştirici | Vikram Adwe [d] ve Chris Lattner [d] |
| Yazılmış | C++ [3] , C [4] ve montaj dili [4] |
| İşletim sistemi | çapraz platform |
| İlk baskı | 24 Ekim 2003 [1] |
| En son sürüm | |
| Lisans | Illinois Üniversitesi açık lisansı [d] [5]veApache Lisansı 2.0[6] |
| İnternet sitesi | llvm.org _ |
| Wikimedia Commons'taki medya dosyaları | |
LLVM (eski adıyla Low Level Virtual Machine [7] ), derleyiciler ve ilgili yardımcı programlar oluşturmak için bir yazılım altyapı projesidir . Makine kodunu optimize etmek, yorumlamak ve derlemek için bir sistem olan yüksek seviyeli dillerden ("ön uçlar" olarak adlandırılan) bir dizi derleyiciden oluşur. Altyapı, çeşitli dönüşümlerin birlikte çalıştığı üst düzey bir derleyici olan RISC benzeri, platformdan bağımsız bir makine talimatı kodlama sistemine ( LLVM IR bayt kodu ) dayanmaktadır.
C++ ile yazılmış olup derleme, bağlama ve yürütme aşamalarında optimizasyonlar sağlar. Başlangıçta, projede Clang ön ucu kullanılarak C ve C++ dilleri için derleyiciler uygulandı , daha sonra aşağıdakiler dahil birçok dil için ön uçlar ortaya çıktı: ActionScript , Ada , C# [8] , Common Lisp , Crystal , CUDA , D , Delphi , Dylan, Fortran , Grafik G Programlama Dili, Halide , Haskell , Java (bytecode), JavaScript , Julia , Kotlin , Lua , Objective-C , OpenGL Shading Language , Ruby , Rust , Scala , Swift , Xojo .
LLVM, ARM , x86 , x86-64 , PowerPC , MIPS , SPARC , RISC-V ve daha fazlası ( Nvidia ve AMD'den GPU'lar dahil ) dahil olmak üzere çeşitli mimariler için yerel kod üretebilir .
Bazı projelerin kendi LLVM derleyicileri vardır (örn. GCC'nin LLVM versiyonu), bazıları Glasgow Haskell Compiler gibi LLVM çerçevesini [9] kullanır .
Geliştirme, 2000 yılında Illinois Üniversitesi'nde başladı . 2010'ların ortalarında, LLVM sektörde yaygınlaştı: diğerlerinin yanı sıra Adobe , Apple ve Google tarafından kullanılıyordu . Özellikle , Mac OS X 10.5'teki OpenGL alt sistemi LLVM'ye dayalıdır ve iPhone SDK , bir LLVM arka ucu ile GCC ön işlemcisini (ön uç) kullanır. Apple ve Google, projenin ana sponsorlarından biridir ve ana geliştiricilerden biri olan Chris Lattner, Apple'da 11 yıl çalıştı (2017'den beri - Tesla Motors'ta [10] , 2020'den beri - işlemci geliştiricisinde ve RISC-V mimarisi SiFive [11] tabanlı mikrodenetleyiciler ).
Özellikler
LLVM, derleme, bağlama ve yürütme sırasında dönüştürülebilen bir ara kod temsiline ( Ara Temsil, IR ) dayanır . Bu gösterimden, hem statik hem de dinamik olarak ( JIT derlemesi ) bir dizi platform için optimize edilmiş makine kodu oluşturulur. LLVM 9.0.0, x86 , x86-64 , ARM , PowerPC , SPARC , MIPS , RISC-V , Qualcomm Hexagon , NVPTX, SystemZ, Xcore için statik kod oluşturmayı destekler. JIT derlemesi (çalışma zamanında makine kodu oluşturma), x86, x86_64, PowerPC, MIPS, SystemZ ve kısmen ARM [12] mimarileri için desteklenir .
LLVM, C++ ile yazılmıştır ve çoğu Unix benzeri sisteme ve Windows'a taşınmıştır . Sistem modüler bir yapıya sahiptir, bireysel modülleri çeşitli yazılım sistemlerine kurulabilir, yeni donanım platformları için ek dönüştürme algoritmaları ve kod üreteçleri ile genişletilebilir.
LLVM, OCaml için bir API sarmalayıcı içerir .
Platformlar
LLVM aşağıdaki platformları destekler:
| İşletim sistemi | Mimari | Derleyici |
|---|---|---|
| linux | x86 / AMD64 | GCC , Clang |
| ÜcretsizBSD | x86 / AMD64 | GCC , Clang |
| OpenBSD | x86 / AMD64 | GCC , Clang |
| Mac OS X | PowerPC | KİK |
| Mac OS X | x86 / AMD64 | GCC , Clang |
| Solaris | UltraSPARC | KİK |
| Cygwin / Win32 | x86 | GCC 3.4.X, Binutils 2.15 |
| MinGW / Win32 | x86 | GCC 3.4.X, Binutils 2.15 |
LLVM, aşağıdaki platformlar için kısmi desteğe sahiptir:
| İşletim sistemi | Mimari | Derleyici |
|---|---|---|
| AIX | PowerPC | KİK |
| linux | PowerPC | KİK |
| Amiga işletim sistemi | m68k , PowerPC | KİK |
| pencereler | x86 | MSVC |
Veri türleri
Basit tipler
| İsteğe bağlı bitlik tamsayıları | biraz derinlik |
|
| ||
| Kayan nokta sayıları | float , double , platforma özgü türler (ör. x86_fp80 ) | |
| boş değer | geçersiz | |
Türetilmiş türler
| işaretçiler | bir çeşit* | i32* - 32 bit tamsayıya işaretçi |
| diziler | [eleman sayısı x tip] |
|
| yapılar | { i32, i32, çift } | |
| Bir vektör, SIMD işlemlerini basitleştirmek için özel bir türdür.
Vektör, ilkel bir tür - tamsayı veya kayan nokta - 2 n değerinden oluşur. |
<eleman sayısı x tip> | < 4 x kayan nokta > - XMM vektörü |
| Fonksiyonlar |
|
Tip sistemi üst üste bindirmeyi/iç içe yerleştirmeyi destekler, yani çok boyutlu dizileri, yapı dizilerini, yapılara ve işlevlere yönelik işaretçileri vb. kullanabilirsiniz.
İşlemler
LLVM'deki komutların çoğu iki argüman (işlenen) alır ve bir değer (üç adres kodu) döndürür. Değerler bir metin tanımlayıcısı ile tanımlanır. Yerel değerlerin önüne %, genel değerlerin önüne ise @. Yerel değerlere ayrıca yazmaçlar da denir ve LLVM'ye sonsuz sayıda kayda sahip bir sanal makine de denir. Örnek:
%toplam = i32 %n, 5 ekle %diff = alt çift %a, %b %z = <4 x float> ekle %v1, %v2 ; element bazında toplama %cond = icmp eq %x, %y ; Tamsayı karşılaştırması. Sonuç, i1 tipindedir. %başarı = i32'yi çağır @puts(i8* %str)
İşlenenlerin türü her zaman açıkça belirtilir ve sonucun türünü kesin olarak belirler. Aritmetik talimatların işlenenleri aynı tipte olmalıdır, ancak talimatların kendisi herhangi bir sayısal tip ve vektör için "aşırı yüklenmiştir".
LLVM, tam bir aritmetik işlem kümesini, bit düzeyinde mantıksal işlemleri ve kaydırma işlemlerini ve ayrıca vektörlerle çalışmak için özel talimatları destekler.
LLVM IR güçlü bir şekilde yazılmıştır, bu nedenle özel talimatlarla açıkça kodlanmış atama işlemleri vardır. 9 komuttan oluşan bir dizi, farklı sayısal türler arasındaki olası tüm dönüşümleri kapsar: tamsayı ve kayan nokta, işaretli ve işaretsiz, farklı bit uzunluğu vb. döküm bitcast(bu tür dönüşümlerin doğruluğundan programcı sorumludur).
Bellek
Kayıt değerlerine ek olarak, LLVM ayrıca hafıza işleme özelliğine sahiptir. Bellekteki değerler, yazılan işaretçiler tarafından adreslenir . İki talimatı kullanarak belleğe erişebilirsiniz: loadve store. Örneğin:
%x = yük i32* %x.ptr ; %x.ptr işaretçisinde i32 tipi değeri yükle %tmp = i32 ekle %x, 5 ; 5 ekle sakla i32 %tmp, i32* %x.ptr ; ve geri koy
Talimat malloc, aynı ada sahip sistem işlevinin çağrısına çevrilir ve öbek üzerinde bellek ayırır, bir değer döndürür - belirli bir türde bir işaretçi . Talimatlarla birlikte gelir free.
%struct.ptr = malloc { çift, çift }
%string = malloc i8, i32 %uzunluk
%dizi = malloc [16 x i32]
ücretsiz i8* %dizesi
Talimat alloca, yığında bellek ayırır.
%x.ptr = tahsis çift ; %x.ptr, double* türündedir %dizi = alloca float, i32 8 ; %dizi, float* türündedir, [8 x float] değil!
Ayrılan bellek , işlevden veya komutları allocakullanılarak çıkıldığında otomatik olarak serbest bırakılır .
retunwind
İşaretçilerle işlemler
Dizilerin, yapıların vb. öğelerinin adreslerini doğru yazarak hesaplamak için komut kullanılır getelementptr.
%dizi = alloca i32, i32 %size %ptr = getelementptr i32* %dizi, i32 %index ; i32 tipinin değeri*
getelementptrsadece adresi hesaplar, ancak hafızaya erişmez. Talimat, keyfi sayıda indeksi kabul eder ve herhangi bir yuvalamanın yapılarına atıfta bulunabilir.
Ayrıca talimatlar extractvalueve insertvalue. getelementptrToplam veri türüne (dizi veya yapı) bir işaretçi almamaları, ancak bu türün kendisinin değeri olmalarından farklıdırlar . extractvaluealt öğenin karşılık gelen değerini döndürür, ancak insertvaluetoplama türü için yeni bir değer üretir.
%n = özüt değeri { i32, [4 x i8*] } %s, 0
%tmp = i32 %n, 1 ekle
%s.1 = ekleme değeri { i32, [4 x i8*] } %s, i32 %tmp, 0
Notlar
- ↑ Lattner K. LLVM 1.0 Sürümü nihayet mevcut!
- ↑ LLVM 15.0.4 Yayınlandı - 2022.
- ↑ Open Hub'daki llvm Açık Kaynak Projesi: Diller Sayfası - 2006.
- ↑ 1 2 Open Hub'daki llvm Açık Kaynak Projesi: Diller Sayfası
- ↑ Lisans _
- ↑ http://releases.llvm.org/9.0.0/LICENSE.TXT - 2019.
- ↑ LLVMdev: LLVM'nin adı 3 Kasım 2016'da Wayback Machine'de arşivlendi , Chris Lattner (Apple), 2011-12-21 "'LLVM' artık resmi olarak bir kısaltma değil. Bir zamanlar genişlettiği kısaltma da kafa karıştırıcıydı ve neredeyse 1. günden itibaren uygunsuzdu.
- ↑ LLILC . Erişim tarihi: 14 Nisan 2015. 19 Mayıs 2019 tarihinde kaynağından arşivlendi .
- ↑ LLVM ile oluşturulan projeler . llvm. Erişim tarihi: 24 Mayıs 2018. 24 Mayıs 2018 tarihinde kaynağından arşivlendi .
- ↑ Hoş Geldiniz Chris Lattner | tesla _ Erişim tarihi: 11 Ocak 2017. 11 Ocak 2017 tarihinde kaynağından arşivlendi .
- ↑ LLVM kurucusu SiFive'a katıldı . Erişim tarihi: 28 Ocak 2020. 28 Ocak 2020 tarihinde kaynağından arşivlendi .
- ↑ LLVM Hedeften Bağımsız Kod Oluşturucu 1 Mayıs 2021'de Wayback Machine Hedef Özellik Matrisi bölümünde arşivlendi
Edebiyat
- Andrei Borovsky. LLVM: Hızlı Kod Oluşturucu // Linux Biçimi . - Sorun. 2010 , Sayı 2 (128) . - S. 76-79 .
- Amy Brown ve Greg Wilson (editörler). Bölüm 11. LLVM (Chris Lattner) // Açık Kaynak Uygulamalarının Mimarisi . - 2011. - S. 155-170. — 432 s. - ISBN 978-1-257-63801-7 . ( çeviri )
- Arpan Sen. LLVM çerçevesini kullanarak çalışan bir derleyici oluşturma. Bölüm 1 IBM DeveloperWorks (11/12/2012). Erişim tarihi: 15 Mayıs 2015 ,Bölüm 2
- Chris Latner. LLVM'nin Tasarımı . Dr. Dobb's Journal (29 Mayıs 2012). Erişim tarihi: 15 Mayıs 2015.
- John Sirakus. Mac OS X 10.6 Snow Leopard: Ars Technica incelemesi → LLVM ve Clang . Ars Technica (1 Eylül 2009). Erişim tarihi: 15 Mayıs 2015.
Bağlantılar
- llvm.org - LLVM'nin resmi web sitesi
- GÜVENLİK Kodu
- libJIT Doğrusal Tarama Kaydı Ayırıcı