LLVM
LLVM | |
---|---|
Lasta stabila versio | 18.1.8 |
Programlingvo | C++, C, asembla lingvo |
Permesilo | Permesilo de Apache, Versio 2.0 |
Retejo | 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.[1]
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[2][3][4] [5][6].
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.[7] 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[8]. LLVM estas integrita parto de plej lastaj evoluadaj iloj de Apple por OS X kaj iOS[9]. Ekde 2013 Sony uzis Clang, la ĉefan facada interfaco de LLVM en la programara disvolvada ilara de ĝia PS4 Videoludilo[10].
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[11]. 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[12]. LLVM estas administrita de la LLVMa Fondaĵo. Ĝia prezidanto estas tradukila inĝeniero Tanya Lattner.[13]
La Asocio por Komputanta Maŝinaron donacis al Adve, Lattner kaj Evan Cheng la 2012an ACMan Programaran Sisteman Premion por LLVM[14].
Superrigardo kaj priskribo
[redakti | redakti fonton]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[15]. Ĉ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[16]. 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.[17]
Por rul-tempa rendimento de la kompilitaj programoj, GCC antaŭe kromrendimentis LLVM ĉirkaŭ 10% laŭ mezumo[18][19]. Pli novaj rezultoj indikas ke LLVM nun atingis GCC nivelo por tiu karakterizaĵo, kaj nun tradukas duumaĵojn per proksimume egala rendimento[20].
Komponantoj
[redakti | redakti fonton]LLVM devenis kadra projekto, kiu enhavas multoblajn komponantojn.
Facadaj interfacoj: programara lingvo subteno
[redakti | redakti fonton]LLVM estis originale skribita por anstataŭi de la ekzistanta kodogenerilo en la GCCa stako[21], 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[22]. Disvolvado de Objektive-C per GCC estis stagnanta kaj la ŝanĝoj de Apple al la lingvo estis subtenita laŭ aparte prizorgita branĉo.[mankas fonto](Bonvolu krei Kategorio:Artikoloj kun senfontaj asertoj ekde october 2014!)
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[23]. 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[24].
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.[mankas fonto](Bonvolu krei Kategorio:Artikoloj kun senfontaj asertoj ekde june 2012!)
Norma biblioteka subteno
[redakti | redakti fonton]LLVM subtenas ĝian propran norman bibliotekon, sed ankaŭ alternativajn C-an norman bibliotekon, musl kaj ekde 3.9a version, komencanta subteno por ARM.[mankas fonto](Bonvolu krei Kategorio:Artikoloj kun senfontaj asertoj ekde september 2016!)[25]
LLVM meza prezento
[redakti | redakti fonton]![](http://178.128.105.246/cars-http-upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Mesa_layers_of_crap_2016.svg/220px-Mesa_layers_of_crap_2016.svg.png)
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
[redakti | redakti fonton]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[26]. Kelkaj trajtoj ne estas haveblaj por kelkaj platformoj. Plejparte trajtoj estas disponebla por x86/x86-64, z/Architechture, ARM kaj PowerPC[27].
LLVMa Maŝinkodo
[redakti | redakti fonton]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
[redakti | redakti fonton]La lld subprojecto estas provo disvolvi integritan senplatformodependan bindilon por LLVM.[28] Nuntempe, Clang kaj LLVM devas alvoki la sistemon aŭ celan bindilon por produkti plenumon . Tio preventas la uzadon de bindilaj trajtoj ke ne ĉiuj subetenitaj bindilaj versioj subtenas por iu platformo. lld celas forigi dependecon de ekstera liveranta bindilo[28].
Revizia historio[29]
[redakti | redakti fonton]Versio | Elkarceriga dato |
---|---|
3.9.0 | 2a septembro 2016 |
3.8.1 | 11a julio 2016 |
3.8.0 | 8a marto 2016 |
3.7.1 | 5a januaro 2016 |
3.7.0 | 1a septembro 2015 |
3.6.2 | 16a julio 2015 |
3.6.1 | 26a majo 2015 |
3.6.0 | 27a februaro 2015 |
3.5.2 | 2a aprilo 2015 |
3.5.1 | 20a januaro 2015 |
3.5.0 | 3a septembro 2014 |
3.4.2 | 19a junio 2014 |
3.4.1 | 7a majo 2014 |
3.4.0 | 2a januaro 2014 |
3.3 | 17a junio 2013 |
3.2 | 20a decembro 2012 |
3.1 | 22a majo 2012 |
3.0 | 1a decembro 2011 |
2.9 | 6a aprilo 2011 |
2.8 | 5a oktobro 2010 |
2.7 | 27a aprilo 2010 |
2.6 | 23a oktobro 2009 |
2.5 | 2a marto 2009 |
2.4 | 9a novembro 2008 |
2.3 | 9a junio 2008 |
2.2 | 11a februaro 2008 |
2.1 | 26a septembro 2007 |
2.0 | 23a majo 2007 |
1.9 | 19a novembro 2006 |
1.8 | 9a aŭgusto 2006 |
1.7 | 20a aprilo 2006 |
1.6 | 8a novembro 2005 |
1.5 | 18a majo 2005 |
1.4 | 9a decembro 2004 |
1.3 | 13a aŭgusto 2004 |
1.2 | 19a marto 2004 |
1.1 | 17a decembro 2003 |
1.0 | 24a oktobro 2003 |
Vidu ankaŭ
[redakti | redakti fonton]- 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
[redakti | redakti fonton]- ↑ The LLVM Compiler Infrastructure.
- ↑ .
- ↑ .
- ↑ LLVM, Chris Lattner, in The architecture of Open Source Applications, edited by Amy Brown, Greg Wilson, 2011
- ↑ Projects built with LLVM.
- ↑ “Compiling Scala to LLVM”.
- ↑ "License", LLVM: Frequently Asked Questions, llvm.org, retrieved 27 January 2012
- ↑ .
- ↑ .
- ↑ .
- ↑ Lattner, Chris. [LLVMdev The name of LLVM] (angle) (elektronika). lists.llvm.org (21). Arkivita el la originalo je 2023-06-13. Alirita 2024-01-25.
- ↑ “libc++” C++ Standard Library.
- ↑ The LLVM Foundation (3 April 2014).
- ↑ ACM Awards. Arkivita el la originalo je 2012-04-02. Alirita 2016-12-22.
- ↑ LLVM Language Reference Manual.
- ↑ Lattner, Chris. [LLVMdev A cool use of LLVM at Apple: the OpenGL stack] (angle) (dissendolisto). lists.llvm.org (15). Arkivita el la originalo je 20230613. Alirita 2023-09-06.
- ↑ Michael Larabel, "GNOME Shell Works Without GPU Driver Support", phoronix, 6 November 2011
- ↑ The used machine is 3.4Ghz Intel Core i7-2600 with 8GB memory under Fedora Core14.
- ↑ The used machine is 3.4Ghz Intel Core i7-2600 with 8GB memory under Fedora Core14.
- ↑ LLVM/Clang 3.2 Compiler Competing With GCC (27 December 2012).
- ↑ Ŝablono:Cite conference
- ↑ Clang 3.8 Release Notes.
- ↑ Compiling Haskell To LLVM. Arkivita el la originalo je 2013-05-31.
- ↑ The Glasgow Haskell Compiler and LLVM.
- ↑ http://llvm.org/releases/3.9.0/docs/ReleaseNotes.html
- ↑ Stellard, Tom. [LLVMdev RFC: R600, a new backend for AMD GPUs] (angle) (elektronoka). lists.llvm.org (26). Arkivita el la originalo je 2023-01-22. Alirita 2024-01-25.
- ↑ Target-specific Implementation Notes: Target Feature Matrix // The LLVM Target-Independent Code Generator, LLVM site.
- ↑ 28,0 28,1 LLD - The LLVM Linker.
- ↑ http://llvm.org/releases/
Eksteraj ligiloj
[redakti | redakti fonton]- Oficiala retejo
- 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
- LLVM - 2.0 and beyond! ĉe YouTube!
- 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