LLVM

La projekto **LLVM** de tradukila infrastrukturo  (antaŭe **maLaLta  Virtuala Maŝino**) estas "*kolekto de modula kaj reuzebla tradukiloj kaj ĉenilaj* *teknologioj*" uzita por evoluigi tradukilaj facadaj interfacoj kaj internaj interfacoj.

LLVM estas skribita per C++ kaj estas desegnita por traduk-tempa, lig-tempa, rul-tempa kaj vak-tempa optimigo de programaroj skribitaj per arbitraj programlingvoj. Originale efektivigita por C kaj C++, la lingvo-sendependa desegno de LLVM poste starigis larĝan varion de facadaj interfacoj: lingvoj kun tradukiloj kiuj uzas LLVM inkludas ActionScript, Ada, C#, Ofta Lisp, Crystal, D, Delphi, Fortran, OpenGL Ombranta Lingvon, Halide, Haskell, Java bytecode, Julia, Lua, Objektiva-C, Pony, Python, R, Ruby, Rust, CUDA, Scala kaj Swift
.

La LLVMa projekto komencis dum 2000 ĉe la Universitato de Ilinojso ĉe Urbana–Champaign, sub la direkto de Vikram Adve kaj Chris Lattner. LLVM estis originale evoluigita kiel esplora infrastrukturo prienketi dinamikajn kompilajn teknikojn por statika kaj dinamika programlingvoj. LLVM estis liberigita sub la malfermita kodlicencoj de Universitato de Ilinojsa kaj NCSA, ĉiopermesa libera programara licenco. Dum 2005, Apple Inc. dungitis Lattner kaj formis teamon por labori pri la LLVMa sistemo por diversaj uzoj ene de la evoluadaj sistemoj de Apple. LLVM estas integrita parto de plej lastaj evoluadaj iloj de Apple por OS X kaj iOS. Ekde 2013 Sony uzis Clang, la ĉefan facada interfaco de LLVM en la  programara disvolvada ilara de ĝia PS4 Videoludilo.

La nomo LLVM estis originale siglo el *maLalta* niveLa Virtuala Maŝino, sed tio devenis kreske malpli taŭga dum *LLVM* fariĝis "kadra projekto", kiu inkludis varion de aliaj tradukiloj kaj malalta-nivelaj ilaj teknologioj, do la projekto forlasis la akronimo. Nun, LLVM estas marko kiu aplikas al la LLVMa kadra projekto, la LLVMa meza prezento, la LLVMa erarserĉilo, la LLVM C++ Norma Biblioteko (kun plena subteno de C++11 kaj C++14), ktp. LLVM estas administrita de la LLVMa Fondaĵo. Ĝia prezidanto estas tradukila inĝeniero Tanya Lattner.

La Asocio por Komputanta Maŝinaron donacis al Adve, Lattner kaj Evan Cheng la 2012an ACMan Programaran Sisteman Premion por LLVM.

## Superrigardo kaj priskribo 
LLVM povas provizi la mezajn tavolojn de plena tradukila sistemo, kiu prenas mezan prezentan kodon el  tradukilo kaj emisas optimigitan mezprezenton. Ĉi tiu nova mezprezento tiam povas esti transformita kaj ligita al maŝino-dependa asembla lingva kodo por iu cela platformo. LLVM povas akcepti la mezprezento de la GNU Compiler Collection (GCC) ilĉeno, eblige uzi ĝin kun larĝa aro de okazantaj tradukiloj, kiuj estas skribita por tiu projekto.

LLVM ankaŭ povas produkti reasignebla maŝina kodo dum traduk-tempo aŭ lig-tempo aŭ eĉ duuma maŝinkodo dum rul-tempo.

LLVM subtenas lingv-sendependa instrukciaro kaj tipa sistemo. Ĉiu instruo estas en statika ununura ensigna formo, signifanta ke ĉiu varianto (nomita tipan registron) estas ensignita unufoje kaj tiam malŝanĝotebla. Tio helpas simpligi la analizon de dependecoj inter variantoj. LLVM eblas kodon esti statike tradukita, kiel ĝi estas per la tradicia GCCa sistemo aŭ lasita por posta traduko el la mezreprento al la maŝina kodo per ĝustatempe tradukado, simile al Ĝavo. La tipa sistemo konsistas en bazaj tipoj kiel induktaj aŭ glit-frakci-markaj nombroj kaj kvin derivitaj tipoj: referencoj, vicoj, vektoroj, strukturoj kaj funkcioj. Tipa konstruo laŭ konkreta lingvo estas prezentebla per kombinado tiujn bazajn tipojn per LLVM. Ekzemple, iu klaso laŭ C++ estas prezentebla per miksaĵo de strukturoj, funkcioj kaj vicoj de referencoj al funkcioj.

La LLVMa ĝustatempe tradukilo povas optimigi malnecesan statikajn branĉojn forige de programaro dum rultempo, kaj tiel estas utila por parta takso por kazoj kie programaro havas multajn elektojn, plejparte determinebla kiel malnecesa en specifa medio. Tiu trajto estas uzita en la OpenGL ĉenstablo de Mac OS X Leopardo (v10.5) por provizi subtenon por mankantaj aparataraj trajtoj.
Grafikaĵa kodo ene de la OpenGL stako estis lasita en meza prezento kaj tiam tradukita kiam rulita laŭ la cela maŝino. En sistemoj kun potencegaj grafikaĵaj procezilaj unuoj (GPU), la rezultonta kodo estas tre maldika, pasanta la instruojn al la GPU kun minimumaj ŝanĝoj. En sistemoj kun potenecetaj GPUoj, LLVM tradukus neneprajn procedojn, kiuj rulas per la loka centra procezilo unuo (CPU) kiu imitas instruciojn ke la GPU ne povas ruli interne. LLVM plibonigis rendimentoj per potenecetaj maŝinoj ekipita kun Intel GMA icaroj. Simila sistemo estis disvolvita por la Gallium3D-a LLVMa dukto kaj inkludita en la GNOME ŝelo por ebli ĝin ruli sen konvena 3Da aparata pelilo ŝargita.

Por rul-tempa rendimento de la kompilitaj programoj, GCC antaŭe kromrendimentis LLVM ĉirkaŭ 10% laŭ mezumo. Pli novaj rezultoj indikas ke LLVM nun atingis GCC nivelo por tiu karakterizaĵo, kaj nun tradukas duumaĵojn per proksimume egala rendimento.

## Komponantoj 
LLVM devenis kadra projekto, kiu enhavas multoblajn komponantojn.

### Facadaj interfacoj: programara lingvo subteno 
LLVM estis originale skribita por anstataŭi de la ekzistanta kodogenerilo en la GCCa stako, kaj multaj el la GCCaj facadaj interfacoj estis modifita por funkcii kun ĝi. LLVM nuntempe subtenas tradukadon por Ada, C, C++, D, Delphi, Fortran, Haskell, Objektiva-C kaj Swift laŭ diversaj facadaj interfacoj, iuj derivitaj de 4.0.1a kaj 4.2a versioj el la GNU Compiler Collection.

Vasta intereso pri LLVM kondukis al pluraj zorgoj pri evoluigi novajn facadajn interfacojn por vario da lingvoj. La plejatentato estas Clang, iu nova tradukilo kiu subtenas C, C++ kaj Objektive-C. Ĉefe subtenita de Apple, Clang estas celota por anstataŭigi la C/Objektive-C tradukilon en la GCCa sistemo kun sistemo kiu estas pli facile integrigita kun programadaj medioj (IDEs) kaj havas pli larĝan subtenon por plurfadenado. Subteno por OpenMP instrukcioj estis inkludita en Clang ekde 3.8a eldonado. Disvolvado de Objektive-C per GCC estis stagnanta kaj la ŝanĝoj de Apple al la lingvo estis subtenita laŭ aparte prizorgita branĉo.

La  Haskell-a tradukilo de Utrecht povas produkti kodon por LLVM. Kvankam la generilo estas en la fruaj fazoj de disvolvado, por multaj kazoj ĝi estis pli efika ol la C-a kod-generilo. La Glasgow Haskell Compiler (GHC) havas funkciantan LLVM-a interna interfaco, kiu atingas 30% plirapidadon supre de la tradukita kodo ol la indiĝena kodo tradukita per GHC-a aŭ C-a kod-generado sekvita per tradukado, perdiĝanta nur unu el la multaj optimigaj teknikoj efektivigita laŭ la GHC.

Multaj aliaj komponantoj estas en diversaj fazoj de disvolvado, inklude, sed nelimigite, la Rust tradukilo, Java okopkodo facade interfaco, Komunuma Meza Lingvo facada interfaco, la MacRuby efektivigo de Ruby 1.9, diversaj facadaj interfacoj por Norma ML kaj nova registra asignilo per grafea kolorado.

#### Norma biblioteka subteno 
LLVM subtenas ĝian propran norman bibliotekon, sed ankaŭ alternativajn C-an norman bibliotekon, musl kaj ekde 3.9a version, komencanta subteno por ARM.

### LLVM meza prezento 
[eta|LLVMa mezprezento estas uzita ekz., de Radeonsi kaj de LLVM-dukto. Ambaŭ estas parto de [Mesa 3D.]]
La kerno de LLVM estas la meza prezento, malalt-nivela programlingvo simila al asembla lingvo. Mezprezento estas forte tipita instrukciareto komputado kiu abstraktas detalojn de la celo. Ekzemple, la voksekvenco estas abstraktita per *call *(voku) kaj *ret* (returnu) instrukcioj kun eksplicitaj argumentoj. Ankaŭ, anstataŭ fiksa aro da registroj, mezprezento uzas senliman aron de tempaj laŭ la formo %0, %1, ktp. LLVM subtenas tri mezprezentajn izomorfajn formojn: hom-legebla asembla formo, C++ objekta formo, kiu taŭgas facadajn interfacojn, kaj densa duumkoda formo por seriigo. Simpla "Saluton, mondo!" programo en la asembla formo:
```llvm
@.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]* @.str, i32 0, i32 0
    %tmp2 = call i32 (i8*, ...)* @printf( i8* %tmp1 ) nounwind
    ret i32 0
}
```

### Interna interfaco: instrukciara kaj mikroarkitektura subteno 
Ekde 3.4a versio, LLVM subtenas multajn instrukciarojn, inklude ARM, Qualcomm Hexagon, MIPS, Nvidia Paralela Fadena Plenumo (nomita *NVPTX* en LLVMa dokumentaro), PowerPC, AMD TeraScale, AMDaj Graphics Core Next, SPARC, z/Architecture (nomita *SystemZ* en LLVMa dokumentaro), x86/x86-64 kaj XCore. Kelkaj trajtoj ne estas haveblaj por kelkaj platformoj. Plejparte trajtoj estas disponebla por x86/x86-64, z/Architechture, ARM kaj PowerPC.

#### LLVMa Maŝinkodo 
La LLVMa maŝinkoda subprojecto estas la kadro de LLVM por traduki maŝinajn instrukciojn inter tekstaj formoj kaj maŝina kodo. Antaŭe, LLVM apogigis la sisteman asemblilon aŭ iun provizitan per ilĉeno, por traduki asemblan lingvon al maŝina kodo. Integra asemblapogo de LLVMa maŝinkodo subtenas plejpartojn de LLVMaj celoj, inklude x86, x86-64, ARM kaj ARM64. Por kelkaj celoj, inklude la diversajn MIPSajn instrukciaroj, la integra asemblapoga subteno estas uzebla sed ankoraŭ en la beta fazo.

### Integra bindilo: lld 
La *lld *subprojecto estas provo disvolvi integritan senplatformodependan bindilon por LLVM. Nuntempe, Clang kaj LLVM devas alvoki la sistemon aŭ celan bindilon por produkti plenumon . Tio preventas la uzadon de bindilaj trajtoj ke ne ĉiuj subtenitaj bindilaj versioj subtenas por iu platformo. lld celas forigi dependecon de ekstera liveranta bindilo ==

## Vidu ankaŭ 
* C--
* Amsterdamo Compiler Ilara (ACK)
* LLDB (Erarserĉilo)
* GNUa lightning
* GNU Compiler Collection (GCC)
* Pure (programlingvo)
* OpenCL
* Emscripten
* TenDRA Disdonada Formo
* Arkitekturo Neŭtrala Disdonada Formo (ANDF)
* Komparo de aplikaj virtualaj maŝinoj
* SPIR-V

## Referencoj 
## Eksteraj ligiloj 
* 
* LLVMa Projekto Blogo
* LLVM: Kompila Kadro por Dumviva Programa Analizo & Transformo, aperinta papero de Chris Lattner, Vikram Adve
* LLVMa Lingvo Referenca Manlibro, priskribas la LLVM meza reprezentado
* !
* Diskuto de LLVM de John Siracusa ĉe Ars Technica
* LLVMLinux Vikio
* La Desegno de LLVM de Chris Lattner, *la Revuo de d-ro. Dobb*, majo 2012

Kategorio:Tradukiloj
Kategorio:Libera programaro