LLVM

LLVM
Autor LLVM Developer Group
Aktualna wersja stabilna 22.1.7
(2 czerwca 2026) [±]
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

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

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ż

Przypisy

  1. Zarchiwizowana kopia. [dostęp 2014-06-09]. [zarchiwizowane z tego adresu (2012-01-12)].
  2. Adam Treat: mkspecs and patches for LLVM compile of Qt4. [zarchiwizowane z tego adresu (2012-07-10)].
  3. 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.).
  4. Chris Lattner, Vikram Adve: Architecture For a Next-Generation GCC. First Annual GCC Developers' Summit, maj 2003. [dostęp 2010-05-04].

Linki zewnętrzne

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.
Kembali kehalaman sebelumnya