Vi povas plibonigi la jenon:
Se vi korektis unu el la menciitaj mankoj, bonvolu forigi la koncernan parametron de la ŝablono {{Pluraj problemoj}}. Detaloj estas en ladokumentado. |
LLVM | |
---|---|
Lastastabila versio | 20.1.0 |
Programlingvo | C++, C, asembla lingvo |
Permesilo | Permesilo de Apache, Versio 2.0 |
Retejo | llvm |
La projektoLLVM de tradukila infrastrukturo (antaŭemaLaLta Virtuala Maŝino) estas "kolekto de modula kaj reuzeblatradukiloj kaj ĉenilajteknologioj" uzita por evoluigitradukilajfacadaj interfacoj kajinternaj interfacoj.[1]
LLVM estas skribita perC++ kaj estas desegnita por traduk-tempa, lig-tempa, rul-tempa kaj vak-tempa optimigo de programaroj skribitaj per arbitrajprogramlingvoj. Originale efektivigita por C kaj C++, la lingvo-sendependa desegno de LLVM poste starigis larĝan varion defacadaj 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 laUniversitato 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 dinamikaprogramlingvoj. 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 deApple[8]. LLVM estas integrita parto de plej lastaj evoluadaj iloj de Apple porOS X kaj iOS[9]. Ekde 2013 Sony uzis Clang, la ĉefanfacada interfaco de LLVM en la programara disvolvada ilara de ĝiaPS4 Videoludilo[10].
La nomo LLVM estis originale siglo elmaLalta niveLa Virtuala Maŝino, sed tio devenis kreske malpli taŭga dumLLVM fariĝis "kadra projekto", kiu inkludis varion de aliaj tradukiloj kaj malalta-nivelaj ilaj teknologioj, do la projekto forlasis laakronimo[11]. Nun, LLVM estas marko kiu aplikas al la LLVMa kadra projekto, la LLVMa meza prezento, la LLVMaerarserĉ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].
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-dependaasembla lingva kodo por iu cela platformo. LLVM povas akcepti la mezprezento de laGNU 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 lokacentra 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 laGNOME ŝ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].
LLVM devenis kadra projekto, kiu enhavas multoblajn komponantojn.
LLVM estis originale skribita por anstataŭi de la ekzistantakodogenerilo en la GCCa stako[21], kaj multaj el la GCCaj facadaj interfacoj estis modifita por funkcii kun ĝi. LLVM nuntempe subtenas tradukadon porAda,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 laGNU 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 kunprogramadaj medioj (IDEs) kaj havas pli larĝan subtenon porplurfadenado. Subteno porOpenMP 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 kreiKategorio: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, laRust 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 kreiKategorio:Artikoloj kun senfontaj asertoj ekde june 2012!)
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 kreiKategorio:Artikoloj kun senfontaj asertoj ekde september 2016!)[25]
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 percall(voku) kajret (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=internalconstant[14xi8]c"hello, world\0A\00"declarei32@printf(i8*,...)definei32@main(i32%argc,i8**%argv)nounwind{entry:%tmp1=getelementptr[14xi8]*@.str,i320,i320%tmp2=calli32(i8*,...)*@printf(i8*%tmp1)nounwindreti320}
Ekde 3.4a versio, LLVM subtenas multajn instrukciarojn, inklude ARM, Qualcomm Hexagon, MIPS, Nvidia Paralela Fadena Plenumo (nomitaNVPTX en LLVMa dokumentaro),PowerPC, AMD TeraScale, AMDaj Graphics Core Next, SPARC, z/Architecture (nomitaSystemZ 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].
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.
Lalldsubprojecto estas provo disvolvi integritan senplatformodependanbindilon 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 subtenitaj bindilaj versioj subtenas por iu platformo. lld celas forigi dependecon de ekstera liveranta bindilo[28].
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 |