LLVM

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania
LLVM
Kompilator
Producent LLVM Developer Group
Platforma sprzętowa Wieloplatformowy
Aktualna wersja stabilna 3.4.1 / 9 maja 2014[1]
Licencja University of Illinois/NCSA Open Source License
llvm.org

LLVM (poprzednio Low Level Virtual Machine[2]) jest napisanym w C++ kompilatorem. Pierwotnie był zaprojektowany dla języka C/C++, lecz dzięki jego ogólnej architekturze powstało wiele front-endów obejmujących m.in. języki Objective-C, Fortran, Ada, Haskell, D, Java, Python, Ruby czy ActionScript.

Projekt powstał w 2000 roku na Uniwersytecie Illinois w Urbana-Champaign pod kierownictwem Vikrama Adve oraz Chrisa Lattnera. LLVM początkowo służył badaniom nad technikami dynamicznej kompilacji dla statycznych i dynamicznych języków programowania i został wydany na licencji BSD. W 2005 roku Apple Inc. zatrudniło Lattnera i powołało zespół programistów w celu wykorzystania LLVM w systemach tworzenia aplikacji tej firmy[3]. LLVM jest integralną częścią najnowszych narzędzi programistycznych dla systemu Mac OS X oraz iOS.

Zasada działania[edytuj | edytuj kod]

Kluczową część systemu kompilacji LLVM stanowi warstwa pośrednia, która pobiera kod pośredni (IF – Intermediate form) z kompilatora dla określonego języka programowania i optymalizuje go. Może on zostać później przekonwertowany na kod asemblera dla konkretnej platformy sprzętowej, lub też pozostawiony do późniejszej kompilacji w locie w stylu języka Java. LLVM obsługuje kod pośredni kompilatora GCC, co umożliwia wykorzystanie szerokiej gamy już istniejących kompilatorów dla tamtego projektu.

LLVM posiada niezależny od języka zestaw instrukcji oraz system typów. Każda instrukcja przedstawiona jest w postaci SSA (static single assignment form), co oznacza że do każdej zmiennej (zwana typowanym rejestrem) możemy przypisać wartość co najwyżej jeden raz. Upraszcza to analizę zależności między poszczególnymi zmiennymi. Wszelkie konwersje typów obsługiwane są jawnie przy pomocy instrukcji rzutowania. LLVM posiada podstawowe typy takie jak liczby całkowite określonych rozmiarów i dokładnie pięć typów pochodnych: wskaźniki, tablice, wektory, struktury i funkcje. Dowolny typ w danym języku programowania może być przedstawiony jako kombinacja typów podstawowych LLVM. Przykładowo, klasa C++ może być przedstawiona jako kombinacja struktur, funkcji i tablic wskaźników funkcji.

LLVM-owy kompilator JIT potrafi wykrywać i usuwać niepotrzebne rozgałęzienia programu w trakcie jego wykonywania. Dzięki temu przydaje się on podczas stosowania techniki Partial evaluation, gdy program posiada wiele możliwych ścieżek wykonania – w przypadku większości z nich można bardzo łatwo określić, które z nich są niepotrzebne w określonej sytuacji. Ta właściwość jest wykorzystywana w obsłudze potokowania OpenGL w Mac OS X Leopard (v. 10.5) do radzenia sobie z brakami sprzętowego wsparcia dla rozmaitych opcji[4]. Kod do obsługi operacji graficznych OpenGL-a został pozostawiony w formie pośredniej i jest kompilowany w locie na maszynie docelowej. W systemach z potężnymi kartami graficznymi uzyskiwany kod maszynowy był niezwykle mały, przekazując wszystkie komendy do karty z minimalnymi narzutami. W pozostałych systemach LLVM kompilował dodatkowe funkcje, które emulowały brakujące opcje karty graficznej. LLVM odegrał także kluczową rolę w poprawianiu wydajności na niskobudżetowych maszynach wykorzystujących chipsety Intel GMA.

Front-endy[edytuj | edytuj kod]

LLVM został zaprojektowany jako wydajniejszy zamiennik dla GCC w już istniejących łańcuchach budowania[5] i wiele z istniejących front-endów GCC zostało przeprojektowanych do współpracy z nim. Ponadto szerokie zainteresowanie projektem doprowadziło do powstania zupełnie nowych, dedykowanych front-endów. Jednym z najambitniejszych jest Clang dla języków C, C++ oraz Objective-C, którego rozwój wspierany jest przez Apple. Koncentruje się on na stworzeniu nowocześniejszego zamiennika dla analogicznego kompilatora z GCC, łatwiejszego do zintegrowania ze środowiskami IDE i oferującego lepsze wsparcie dla współbieżności.

Zobacz też[edytuj | edytuj kod]

Odnośniki zewnętrzne[edytuj | edytuj kod]

Przypisy

  1. LLVM 3.4.1 Release Notes (ang.). [dostęp 2014-05-10].
  2. http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-December/046440.html
  3. Adam Treat: mkspecs and patches for LLVM compile of Qt4.
  4. Chris Lattner: A cool use of LLVM at Apple: the OpenGL stack (ang.). Lista dyskusyjna LLVMdev, 2006-08-15. [dostęp 2010-05-04].
  5. Chris Lattner, Vikram Adve: Architecture For a Next-Generation GCC. First Annual GCC Developers' Summit, maj 2003. [dostęp 2010-05-04].