Low Level Virtual Machine

A Wikipédiából, a szabad enciklopédiából
LLVM
LLVM Logo.svg

Fejlesztő LLVM Developer Group
Első kiadás 2003
Legfrissebb stabil
kiadás
2.9
(2011. április 6.)
Legfrissebb fejlesztői kiadás ismeretlen +/-
Programozási nyelv C++
Operációs rendszer keresztplatformos
Kategória fordítóprogram
Licenc University of Illinois Open Source License[1]
A LLVM weboldala

A Low Level Virtual Machine, röviden LLVM („alacsony szintű virtuális gép”) egy C++-ban írt fordítóprogram-infrastruktúra, amit tetszőleges programozási nyelvek fordítási idejű, linkelési idejű, futási idejű és holtidejű („idle-time”) optimalizálására fejlesztettek ki. A kezdetben C/C++-ra kifejlesztett LLVM-hez sikere és nyelvfüggetlen designja miatt azóta különböző front-endeket (előfeldolgozókat) illesztettek, többek között Objective-C, Fortran, Ada, Haskell, Java bájtkód, Python, Ruby, ActionScript, GLSL és Clang nyelvekhez. Az LLVM projekt 2000-ben indult az Urbana–Champaign-i Illinois Egyetemen Vikram Adve és Chris Lattner irányítása alatt. Az LLVM eredeti célkitűzése szerint kutatási infrastruktúra volt a statikus és dinamikus programozási nyelvek dinamikus fordítási technikáinak tanulmányozásához. Az LLVM-et a University of Illinois Open Source License[1] alatt adták ki, ami egy BSD-jellegű licenc. 2005-ben az Apple felfogadta Lattnert és kialakítottak egy csapatot az LLVM az Apple fejlesztői környezetében való használatára.[2] Az LLVM szerves részét képezi az Apple fejlesztői eszközeinek a Mac OS X-hez és az iOS-hez.[3]

Leírása[szerkesztés | forrásszöveg szerkesztése]

Az LLVM egy teljes fordítói rendszer középső rétegeként tud működni, egy fordítóprogram köztes formában (intermediate form, IF) lévő kódját bemenetként véve egy optimalizált köztes kódot bocsát ki. Ez az új IF aztán konvertálható és összelinkelhető a célplatform gépfüggő assembly kódjára. Az LLVM képes elfogadni a GCC eszközlánc által használt köztes kódot, így az ehhez a projekthez készült fordítók széles skálájával együtt tud működni.

Az LLVM képes áthelyezhető kódot generálni fordítási időben, linkelési időben vagy akár gépi kódot generálni futási időben.

Az LLVM egy nyelvfüggetlen utasításkészletet és típusrendszert támogat. Minden utasítás statikus, egyszeri hozzárendelési formában (static single assignment form, SSA) található, azaz minden változó (itt: típusos regiszter) értéke egyszer kerül hozzárendelésre, aztán „befagy”. Ez egyszerűsíti a változók közötti függőségek kiértékelését. Az LLVM lehetővé teszi a kód statikus fordítását, ahogyan az a hagyományos GCC rendszerben szokásos, vagy a késői gépi kódra fordítást, mint a Java programozási nyelvnél is használt röpfordító (just-in-time compiler, JIT) esetében.

A típusrendszerbe tartoznak olyan alapvető adattípusok mint egészek és lebegőpontos számok, továbbá öt származtatott típus: pointerek, vektorok, rekordok és függvények. Egy-egy nyelv konkrét típusát az LLVM ezen alaptípusaiból kell összekombinálni. Például egy C++-osztályt struktúrák, függvények és függvénymutatók (function pointerek) tömbjeiből.

Az LLVM röpfordítója képes a szükségtelen statikus ágakat futásidőben kioptimalizálni a programból, ami hasznos olyan esetek részleges kiértékelésekor, amikor a program rengeteg opciójának nagy részére nincs szükség az adott környezetben. Ezt például kihasználják a Mac OS X Leopard (v10.5) OpenGL-csővezetékében a hiányzó hardveres funkciók támogatásánál.[4]

Az OpenGL grafikus kódrészét köztes formában hagyva a célgépen való futtatáskor került csak lefordításra. Így a nagy teljesítményű GPU-val rendelkező gépeken a keletkező kód egészen áramvonalas lett, szerepe szerint a parancsokat többnyire minimális változtatással átadta a GPU-nak. A gyengébb GPU-jú gépeken az LLVM befordítja azokat az opcionális eljárásokat, amik a helyi CPU-n emulálják a GPU által nem ismert utasításokat. Az LLVM-nek nagy szerepe volt az Intel GMA lapkakészletet használó olcsó gépeken a teljesítmény feljavításában.

A nyers teljesítmény összehasonlításakor az LLVM 2.7 átlagosan 10%-kal a GCC mögött van a generált kód minőségében (a lefordított program sebességében), míg a fordítás sebességében 20-30%-ot ráver.[5][6]

Front-endek[szerkesztés | forrásszöveg szerkesztése]

Az LLVM-et eredetileg a GCC kódgenerátorának lecserélésére tervezték,[7] és a GCC számos front-endjét hozzáigazították. Az LLVM jelenleg a következő programozási nyelvek fordítását támogatja: Ada, C, C++, D, Fortran és Objective-C, különböző front-endek használatával, melyek némelyike még a GCC 4.0.1 és 4.2 verziójából származik.

Az LLVM iránt mutatkozó széles körű érdeklődés több arra irányuló projekt beindításához vezetett, hogy néhány nyelvhez új front-endet készítsenek. A legnagyobb figyelmet a Clang, egy a C, Objective-C és C++ nyelveket támogató új fordítóprogram kapta. A főleg az Apple által támogatott Clang fő célkitűzése a GCC rendszer C/Objective-C fordítóprogramjának lecserélése volt egy olyan modernebb rendszerre, ami könnyebben integrálható integrált fejlesztői környezetekbe, és jobban támogatja a többszálú végrehajtást. A GCC projektben az Objective-C fejlesztése meglehetősen lassan haladt, ezért az Apple inkább egy külön fenntartott fejlesztési ágban tartotta a változtatásait. Az, hogy saját fordítóval rendelkeznek, lehetővé tette az Apple számára, hogy megoldja az LLVM-nél is előforduló problémákat az IDE-integrációval és más modern funkciókkal kapcsolatban.

Az Utrecht nevű Haskell-fordító olyan kódot képes generálni az LLVM számára, ami – annak ellenére, hogy a fejlesztés korai stádiumában vannak – sok esetben hatékonyabb a C-kódgenerátornál.[8] A Glasgow Haskell Compilernek (GHC) van egy működő LLVM-backendje, ami 30%-ot gyorsít a lefordított kódon összehasonlítva a GHC-vel fordított natív kóddal vagy a generált C-kód utáni lefordított kóddal, és a GHC által használt optimalizálási technikákat egy kivételével tartalmazza.[9]

Számos más komponens is létezik, a fejlesztés különböző fázisaiban; köztük egy Java bájtkód-frontend, egy Common Intermediate Language (CIL) frontend, egy CPython frontend,[10], a Ruby 1.9 MacRuby implementációja, a különböző frontendek a Standard ML-hez, és egy új, gráfszínezéses regiszterallokátor.

Kapcsolódó szócikkek[szerkesztés | forrásszöveg szerkesztése]

Források[szerkesztés | forrásszöveg szerkesztése]

  1. ^ a b LLVM: Frequently Asked Questions. (Hozzáférés: 2010. december 23.)
  2. Adam Treat, mkspecs and patches for LLVM compile of Qt4
  3. Apple LLVM Compiler http://developer.apple.com/technologies/tools/
  4. Chris Lattner: A cool use of LLVM at Apple: the OpenGL stack. LLVMdev mailing list, 2006. augusztus 15. (Hozzáférés: 2011. szeptember 25.)
  5. V. Makarov: SPEC2000: Comparison of LLVM-2.7 and GCC4.5.0 on x86. (Hozzáférés: 2011. szeptember 25.)
  6. V. Makarov: SPEC2000: Comparison of LLVM-2.7 and GCC4.5.0 on x86_64. (Hozzáférés: 2011. szeptember 25.)
  7. Lattner, Chris; Vikram Adve: Architecture For a Next-Generation GCC. First Annual GCC Developers' Summit, 2003. május 1. (Hozzáférés: 2011. szeptember 25.)
  8. Compiling Haskell To LLVM. (Hozzáférés: 2009. február 22.)
  9. LLVM Project Blog: The Glasgow Haskell Compiler and LLVM. (Hozzáférés: 2011. szeptember 25.)
  10. unladen-swallow - A faster implementation of Python. (Hozzáférés: 2009. május 7.)

Külső hivatkozások[szerkesztés | forrásszöveg szerkesztése]