LLVM
Autor | LLVM Developer Group |
---|---|
Aktualna wersja stabilna | 19.1.3 (30 października 2024) [±] |
Język programowania | C++ |
Platforma sprzętowa | Wieloplatformowy |
Rodzaj | Kompilator |
Licencja | University of Illinois/NCSA Open Source License |
Strona internetowa |
LLVM (poprzednio Low Level Virtual Machine[1]) – napisany w C++ kompilator. 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, Scala, 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[2]. LLVM jest integralną częścią najnowszych narzędzi programistycznych dla systemu 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 (JIT), podobnie jak w języku Java. LLVM obsługuje kod pośredni kompilatora GCC, co umożliwia wykorzystanie szerokiej gamy już istniejących front-endów z tego 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), co oznacza że do każdej zmiennej (zwanej typowanym rejestrem) można przypisać wartość co najwyżej jeden raz. Ułatwia 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 optymalizować niepotrzebne rozgałęzienia programu w trakcie jego wykonywania, wykorzystując technikę partial evaluation, gdy program posiada wiele możliwych ścieżek wykonania, a w przypadku większości z nich można łatwo określić, które z nich są niepotrzebne w danym środowisku. Ta właściwość jest wykorzystywana w potokach OpenGL w Mac OS X Leopard (v. 10.5) do obsługi funkcji niewspieranych sprzętowo[3]. 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 mocnymi kartami graficznymi uzyskiwany kod maszynowy jest mały, przekazując wszystkie komendy do karty z minimalnymi narzutami. W systemach ze słabymi kartami LLVM kompiluje dodatkowe funkcje, które emulują brakujące instrukcje karty graficznej. LLVM poprawił wydajność 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[4] 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]Przypisy
[edytuj | edytuj kod]- ↑ Zarchiwizowana kopia. [dostęp 2014-06-09]. [zarchiwizowane z tego adresu (2012-01-12)].
- ↑ Adam Treat: mkspecs and patches for LLVM compile of Qt4. [zarchiwizowane z tego adresu (2012-07-10)].
- ↑ Chris Lattner: A cool use of LLVM at Apple: the OpenGL stack. Lista dyskusyjna LLVMdev, 2006-08-15. [dostęp 2010-05-04]. [zarchiwizowane z tego adresu (2006-11-04)]. (ang.).
- ↑ Chris Lattner, Vikram Adve: Architecture For a Next-Generation GCC. First Annual GCC Developers' Summit, maj 2003. [dostęp 2010-05-04].