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 SwiftLLVM, Chris Lattner, in The architecture of Open Source Applications, edited by Amy Brown, Greg Wilson, 2011
 .

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."License", LLVM: Frequently Asked Questions, llvm.org, retrieved 27 January 2012  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.Michael Larabel, "GNOME Shell Works Without GPU Driver Support", phoronix, 6 November 2011

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.http://llvm.org/releases/3.9.0/docs/ReleaseNotes.html

 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:@.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 PowerPCTarget-specific Implementation Notes: Target Feature Matrix // The LLVM Target-Independent Code Generator, LLVM site..

 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.

 Revizia historiohttp://llvm.org/releases/ 
+
Revizia historioVersioElkarceriga dato3.9.02a septembro 20163.8.111a julio 20163.8.08a marto 20163.7.15a januaro 20163.7.01a septembro 20153.6.216a julio 20153.6.126a majo 20153.6.027a februaro 20153.5.22a aprilo 20153.5.120a januaro 20153.5.03a septembro 20143.4.219a junio 20143.4.17a majo 20143.4.02a januaro 20143.317a junio 20133.220a decembro 20123.122a majo 20123.01a decembro 20112.96a aprilo 20112.85a oktobro 20102.727a aprilo 20102.623a oktobro 20092.52a marto 20092.49a novembro 20082.39a junio 20082.211a februaro 20082.126a septembro 20072.023a majo 20071.919a novembro 20061.89a aŭgusto 20061.720a aprilo 20061.68a novembro 20051.518a majo 20051.49a decembro 20041.313a aŭgusto 20041.219a marto 20041.117a decembro 20031.024a oktobro 2003

 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