Low Level Virtual Machine
Status versiyi storinki
Na tsii storintsi pokazano neperevireni zmini
| Tip | Kompiliatori, optimizatori i generatori kodu |
|---|---|
| Rozrobniki | LLVM Developer Group |
| Pershii vipusk | 24 zhovtnia 2003[2] |
| Stabil'nii vipusk | 20.1.8 (9 lipnia 2025) |
| Operatsiina sistema | krosplatformnist' |
| Mova programuvannia | C++ |
| Litsenziia | University of Illinois Open Source License[3] |
| Repozitorii | github.com/llvm/llvm-project |
| Vebsait | llvm.org |
Low Level Virtual Machine (LLVM) -- universal'na sistema analizu, transformatsiyi i optimizatsiyi program, shcho realizuie virtual'nu mashinu z RISC-podibnimi instruktsiiami. Mozhe vikoristovuvatisia iak optimizuval'nii kompiliator ts'ogo bait-kodu v mashinnii kod dlia riznikh arkhitektur abo dlia iogo interpretatsiyi ta JIT-kompiliatsiyi (dlia deiakikh platform).
LLVM dozvoliaie kompiliuvati programi, napisani movami S, C++, ObjC, Fortran, Ada, Haskell, Java, Python, Ruby, Rust, JavaScript, GLSL, abo bud'-iakoiu inshoiu, dlia iakoyi realizovano front-end. V ramkakh proiektu rozrobleno frontend Clang dlia mov C i C++ i versiia GCC, shcho vikoristovuiut' LLVM iak bekend. U Glasgow Haskell Compiler takozh realizovana kompiliatsiia za dopomogoiu LLVM, isnuie shche bezlich program, shcho vikoristovuiut' tsiu infrastrukturu.
LLVM -- ne prosto chergovii akademichnii proiekt. Iogo istoriia pochalas' u 2000 rotsi v Universiteti Illinoisa, a teper LLVM vikoristovuiut' taki giganti industriyi iak Apple, Adobe ta Google. Zokrema, na LLVM zasnovana pidsistema OpenGL u MacOS X 10.5, a iPhone SDK vikoristovuie GCC z bekendom na LLVM. Apple ta Google ie odnimi iz osnovnikh sponsoriv proiektu, a natkhnennik LLVM -- Kris Lattner -- teper pratsiuie v Apple.
U osnovi LLVM lezhit' promizhne podannia kodu (intermediate representation, IR), nad iakim mozhna vikonuvati transformatsiyi u vsi kompiliatsiyi, komponuvannia i vikonannia. Iz n'ogo generuiet'sia optimizovanii mashinnii kod dlia nizki platform, iak statichno, tak i dinamichno (JIT-kompiliatsiia). LLVM pidtrimuie generatsiiu kodu dlia x86, x86-64, ARM, PowerPC, SPARC, MIPS, IA-64, Alpha.
LLVM napisana na C++ i portovana na bil'shist' unix-sistem i Windows. Sistema maie modul'nu strukturu i mozhe rozshiriuvatis' dodatkovimi algoritmami transformatsiyi (compiler passes) i kodogeneratorami dlia novikh aparatnikh platform. Frontend koristuvacha, iak pravilo, linkuiet'sia iz LLVM i vikoristovuie C++ API dlia generatsiyi kodu i iogo peretvoren'. Odnak LLVM mistit' u sobi i standalone utiliti.
U LLVM vkliuchena obgortka API dlia OCaml.
LLVM pidtrimuie robotu na nastupnikh platformakh:
| Operatsiina sistema | Arkhitektura | Kompiliator |
|---|---|---|
| FreeBSD | x86 | GCC, Clang |
| FreeBSD | AMD64 | GCC, Clang |
| Linux | AMD64 | GCC, Clang |
| Linux | x86 | GCC, Clang |
| Mac OS X | PowerPC | GCC |
| Mac OS X | x86 | GCC, Clang |
| Solaris | UltraSPARC | GCC |
| Cygwin/Win32 | x86 | GCC 3.4.X, Binutils 2.15 |
| MinGW/Win32 | x86 | GCC 3.4.X, Binutils 2.15 |
LLVM maie chastkovu pidtrimku takikh platform:
| Operatsiina sistema | Arkhitektura | Kompiliator |
|---|---|---|
| Windows | x86 | Visual Studio .NET |
| AIX | PowerPC | GCC |
| Linux | PowerPC | GCC |
| Linux | Alpha | GCC |
| Linux | Itanium (IA-64) | GCC |
| HP-UX | Itanium (IA-64) | HP aCC |
| Tsili chisla dovil'noyi rozriadnosti | irozriadnist' |
|
| ||
| Chisla z rukhomoiu komoiu | float, double, tipi, spetsifichni dlia konkretnoyi platformi (napriklad, x86_fp80) | |
| Puste znachennia | void | |
| Vkazivniki | tip* | i32* -- vkazivnik na 32-bitne tsile |
| Masivi | [chislo elementiv x tip] |
|
| Strukturi | { i32, i32, double } | |
| Vektor -- spetsial'nii tip dlia sproshchennia SIMD-operatsii. Vektor skladaiet'sia iz 2^n znachen' primitivnogo tipu -- tsilogo abo z plavaiuchoiu krapkoiu. | ||
| < chislo elementiv x tip > | < 4 x float > -- vektor XMM | |
| Funktsiyi |
| |
Sistema tipiv rekursivna, tobto mozhna vikoristovuvati bagatovimirni masivi, masivi struktur, vkazivniki na strukturi i funktsiyi i t. d.
Bil'shist' instruktsii u LLVM priimaiut' dva argumenti (operanda) i vertaiut' odne znachennia (triadresnii kod). Znachennia viznachaiut'sia tekstovim identifikatorom. Lokal'ni znachennia poznachaiut'sia prefiksom %, a global'ni -- @. Lokal'ni znachennia takozh nazivaiut' registrami, a LLVM -- virtual'noiu mashinoiu z neskinchennim chislom registriv. Priklad:
%diff = sub double %a, %b
%z = add <4 x float> %v1, %v2 -- poelementne dodavannia
%cond = icmp eq %x, %y -- Porivniannia tsilikh chisel. Rezul'tat maie tip i1
%success = call i32 @puts(i8* %str)
Tip operandiv zavzhdi vkazuiet'sia iavno, i odnoznachno viznachaie tip rezul'tatu. Operandi arifmetichnikh instruktsii povinni mati odnakovii tip, ale sami instruktsiyi <
LLVM pidtrimuie povnii nabir arifmetichnikh operatsii, pobitovikh logichnikh operatsii i operatsii zsuvu, a takozh spetsial'ni instruktsiyi dlia roboti z vektorami.
LLVM IR strogo tipizovanii, tomu isnuiut' operatsiyi privedennia tipiv, iaki iavno koduiut'sia spetsial'nimi instruktsiiami. Nabir iz 9 instruktsii pokrivaie vsi mozhlivi privedennia mizh riznimi chislovimi tipami: tsilimi i z rukhomoiu komoiu, iz znakom i bez, riznoyi rozriadnosti i t.p. Krim ts'ogo ie instruktsiyi peretvorennia mizh tsilimi i vkazivnikami, a takozh instruktsiia bitcast, iaka privede vse do vs'ogo, ale za rezul'tat vi vidpovidaiete sami.
Krim znachen'-registriv, u LLVM ie i robota iz pam'iattiu. Znachennia v pam'iati adresuiut'sia tipizovanimi vkazivnikami. Zvernutisia do pam'iati mozhna za dopomogoiu dvokh instruktsii: load i store. Napriklad:
%tmp = add i32 %x, 5 -- dodati 5
store i32 %tmp, i32* %x.ptr -- i povernuti nazad
Instruktsiia malloc transliuiet'sia u viklik odnoimennoyi sistemnoyi funktsiyi i vidiliaie pam'iat' u kupi, povertaiuchi znachennia -- vkazivnik viznachenogo tipu. U pari z neiu ide instruktsiia free.
%string = malloc i8, i32 %length
%array = malloc [16 x i32]
free i8* %string
Instruktsiia alloca vidiliaie pam'iat' na steku.
%array = alloca float, i32 8 -- %array maie tip float*, a ne [8 x float]!
Pam'iat', vidilena alloca, avtomatichno zvil'niaiet'sia pri vikhodi iz funktsiyi za dopomogoiu instruktsii ret abo unwind.
Z proiektiv, zasnovanikh na LLVM, shcho rozvivaiut'sia paralel'no, mozhna vidznachiti:
- KLEE [Arkhivovano 25 grudnia 2012 u Wayback Machine.] - simvol'nii analizator i generator testovikh naboriv;
- Runtime-biblioteka compiler-rt [Arkhivovano 6 lipnia 2009 u Wayback Machine.];
- llvm-mc [Arkhivovano 15 sichnia 2013 u Wayback Machine.] - avtogenerator asemblera, dizasemblera ta inshikh, pov'iazanikh z mashinnim kodom komponentiv, na osnovi opisiv parametriv LLVM-sumisnikh platform.
- VMKit [Arkhivovano 9 listopada 2020 u Wayback Machine.] - virtual'na mashina dlia Java i .NET;
- Realizatsiia funktsiinoyi movi programuvannia Pure[nedostupne posilannia z chervnia 2019];
- LDC [Arkhivovano 18 travnia 2012 u WebCite] - kompiliator dlia movi D;
- Roadsend PHP - optimizator, statichnii i JIT kompiliator dlia movi PHP;
- Virtual'ni mashini dlia Ruby: Rubinius [Arkhivovano 13 grudnia 2015 u Wayback Machine.] i MacRuby [Arkhivovano 24 grudnia 2012 u Wayback Machine.];
- Unladen Swallow [Arkhivovano 10 liutogo 2011 u Wayback Machine.] - realizatsiia movi Python;
- LLVM-Lua [Arkhivovano 22 sichnia 2009 u Wayback Machine.]
- FlashCCompiler [Arkhivovano 5 veresnia 2012 u Wayback Machine.] - zasib dlia kompiliatsiyi kodu na movi Si u vid, pridatnii dlia vikonannia u virtual'nii mashini Adobe Flash;
- LLDB [1] [Arkhivovano 6 serpnia 2012 u Wayback Machine.] - modul'na infrastruktura znevadzhennia, vikoristovuie taki pidsistemi LLVM iak API dlia dizasembliuvannia, Clang AST (Abstract Syntax Tree), parser viraziv, generator kodu i JIT-kompiliator. LLDB pidtrimuie znevadzhennia bagatonitevikh program na movakh C, Objective-C i C++; vidrizniaiet'sia mozhlivistiu pidkliuchennia plaginiv i skriptiv na movi Python; demonstruie ekstremal'no visoku shvidkodiia pri znevadzhenni program velikogo rozmiru;
- Emscripten [2] [Arkhivovano 20 bereznia 2017 u Wayback Machine.] - transkompiliator bitkodu LLVM v JavaScript, shcho dozvoliaie peretvoriti dlia zapusku v brauzeri zastosunki, spochatku napisani na movi Si. Napriklad, vdalosia zapustiti Python, Lua, Quake, Freetype;
- sparse-llvm[nedostupne posilannia z chervnia 2019] ---- bekend, natsilenii na stvorennia Si-kompiliatora, zdatnogo zbirati iadro Linux.
- Portable OpenCL -- vidkrita i nezalezhna realizatsiia standartu OpenCL;
- CUDA Compiler -- dozvoliaie zgeneruvati GPU-instruktsiyi z kodu, napisanogo na movakh Si, Si++ ta Fortran;
- Julia -- vidkrita dinamichna mova programuvannia, shcho vikoristovuie napratsiuvannia proiektu LLVM.
U 2010 Asotsiatsiia obchisliuval'noyi tekhniki (ACM), naiavtoritetnisha mizhnarodna organizatsiia, v oblasti komp'iuternikh sistem prisudila proiektu LLVM premiiu za vnesok u rozvitok mov programuvannia (SIGPLAN Programming Languages Software Award). Premiia prisudzhuiet'sia za znachnii vpliv na pov'iazani z movami programuvannia doslidzhennia, realizatsiyi tekhnologii i instrumenti.
- LLVM [Arkhivovano 3 travnia 2004 u Wayback Machine.]
- libJIT Linear Scan Register Allocator [Arkhivovano 12 liutogo 2012 u WebCite]
- Amy Brown and Greg Wilson (eds.). Chapter 11. LLVM (Chris Lattner) // The Architecture of Open Source Applications. -- 2011. -- P. 155-170. -- ISBN 978-1-257-63801-7.