LLVM

LLVM stał się projektem parasolowym zawierającym wiele komponentów.

ZakładkiEdit

LLVM został pierwotnie napisany jako zamiennik dla istniejącego generatora kodu w stosie GCC, i wiele z nakładek GCC zostało zmodyfikowanych do pracy z nim, w wyniku czego powstał nieistniejący już pakiet LLVM-GCC. Modyfikacje generalnie obejmują krok IR z GIMPLE do LLVM, tak że optymalizatory LLVM i codegen mogą być używane zamiast systemu GIMPLE GCC. Apple było znaczącym użytkownikiem LLVM-GCC przez Xcode 4.x (2013). To użycie frontendu GCC było uważane głównie za środek tymczasowy, ale wraz z pojawieniem się Clanga i zaletami LLVM i nowoczesnej i modułowej bazy kodowej Clanga (a także szybkości kompilacji), jest w większości przestarzałe.

LLVM obecnie wspiera kompilację Ada, C, C++, D, Delphi, Fortran, Haskell, Julia, Objective-C, Rust i Swift za pomocą różnych front-endów.

Powszechne zainteresowanie LLVM doprowadziło do kilku wysiłków mających na celu stworzenie nowych front-endów dla różnych języków. Tym, który otrzymał najwięcej uwagi jest Clang, nowy kompilator obsługujący C, C++ i Objective-C. Clang, wspierany głównie przez Apple, ma na celu zastąpienie kompilatora C/Objective-C w systemie GCC systemem, który jest łatwiejszy do zintegrowania ze zintegrowanymi środowiskami programistycznymi (IDE) i ma szersze wsparcie dla wielowątkowości. Wsparcie dla dyrektyw OpenMP jest zawarte w Clangu od wydania 3.8.

Kompilator Utrecht Haskell może generować kod dla LLVM. Choć generator ten jest we wczesnej fazie rozwoju, w wielu przypadkach okazał się bardziej wydajny niż generator kodu C. Istnieje Glasgow Haskell Compiler (GHC) backend używający LLVM, który osiąga 30% wzrost prędkości skompilowanego kodu w stosunku do natywnego kodu kompilowanego przez GHC lub generowania kodu C, po którym następuje kompilacja, pomijając tylko jedną z wielu technik optymalizacyjnych zaimplementowanych przez GHC.

Wiele innych komponentów jest w różnych stadiach rozwoju, włączając w to, ale nie ograniczając się do kompilatora Rust, nakładki na kod bajtowy Java, nakładki na Common Intermediate Language (CIL), implementacji Ruby 1.9, różne fronty dla Standard ML, oraz nowy alokator rejestru kolorowania grafów.

Przedstawienie pośrednieEdit

LLVM IR jest używany np, przez radeonsi i przez llvmpipe. Oba są częścią Mesa 3D.

Rdzeniem LLVM jest reprezentacja pośrednia (IR), niskopoziomowy język programowania podobny do montażu. IR jest silnie typowanym zestawem instrukcji reduced instruction set computing (RISC), który abstrahuje od większości szczegółów celu. Na przykład, konwencja wywoływania jest abstrahowana przez instrukcje call i ret z jawnymi argumentami. Ponadto, zamiast stałego zestawu rejestrów, IR używa nieskończonego zestawu tymczasowych instrukcji w postaci %0, %1, itd. LLVM obsługuje trzy równoważne formy IR: czytelny dla człowieka format asemblerowy, format in-memory odpowiedni dla frontendów oraz format gęstego bitkodu do serializacji. Prosty program „Hello, world!” w formacie IR:

@.str = internal constant c"hello, world\0A\00"declare i32 @printf(i8*, ...)define i32 @main(i32 %argc, i8** %argv) nounwind {entry: %tmp1 = getelementptr , * @.str, i32 0, i32 0 %tmp2 = call i32 (i8*, ...) @printf( i8* %tmp1 ) nounwind ret i32 0}

Wiele różnych konwencji używanych i funkcji dostarczanych przez różne cele oznacza, że LLVM nie może naprawdę wyprodukować IR niezależnego od celu i retargetować go bez złamania pewnych ustalonych reguł. Przykłady zależności od celu poza tym, co jest wyraźnie wspomniane w dokumentacji, można znaleźć w propozycji „wordcode” z 2011 roku, całkowicie niezależnej od celu odmiany LLVM IR przeznaczonej do dystrybucji online. Bardziej praktycznym przykładem jest PNaCl.

ZakończenieEdit

W wersji 3.4, LLVM obsługuje wiele zestawów instrukcji, w tym ARM, Qualcomm Hexagon, MIPS, Nvidia Parallel Thread Execution (PTX; zwany NVPTX w dokumentacji LLVM), PowerPC, AMD TeraScale, AMD Graphics Core Next (GCN), SPARC, z/Architecture (zwany SystemZ w dokumentacji LLVM), x86, x86-64 i XCore. Niektóre funkcje nie są dostępne na niektórych platformach. Większość funkcji jest obecna dla x86, x86-64, z/Architektury, ARM i PowerPC. RISC-V jest obsługiwany od wersji 7. W przeszłości LLVM obsługiwał również w pełni lub częściowo inne backendy, w tym C backend, Cell SPU, mblaze (MicroBlaze), AMD R600, DEC/Compaq Alpha (Alpha AXP) i Nios2, ale większość z tego sprzętu jest w większości przestarzała, a wsparcie i utrzymanie LLVM dla niego nie było uzasadnione.

LLVM obsługuje również WebAssembly jako cel, umożliwiając wykonywanie skompilowanych programów w środowiskach obsługujących WebAssembly, takich jak Google Chrome / Chromium, Firefox, Microsoft Edge, Apple Safari lub WAVM. Kompilatory WebAssembly zgodne z LLVM zazwyczaj obsługują w większości niezmodyfikowany kod źródłowy napisany w C, C++, D, Rust, Nim, Kotlin i kilku innych językach.

Podprojekt LLVM machine code (MC) to framework LLVM do translacji instrukcji maszynowych pomiędzy formą tekstową a kodem maszynowym. Wcześniej, LLVM polegał na asemblerze systemowym, lub tym dostarczonym przez toolchain, do tłumaczenia asemblera na kod maszynowy. Zintegrowany asembler w LLVM MC obsługuje większość obiektów docelowych LLVM, w tym x86, x86-64, ARM i ARM64. Dla niektórych celów, w tym różnych zestawów instrukcji MIPS, wsparcie asemblera zintegrowanego jest użyteczne, ale wciąż w fazie beta.

LinkerEdit

Podprojekt lld jest próbą opracowania wbudowanego, niezależnego od platformy linkera dla LLVM. lld ma na celu usunięcie zależności od linkera innej firmy. Na maj 2017, lld obsługuje ELF, PE/COFF, Mach-O i WebAssembly w kolejności malejącej kompletności. lld jest szybszy niż oba smaki GNU ld.

W przeciwieństwie do linkerów GNU, lld posiada wbudowane wsparcie dla optymalizacji link-time. Pozwala to na szybsze generowanie kodu, ponieważ omija użycie wtyczki linkera, ale z drugiej strony zabrania interoperacyjności z innymi smakami LTO.

Standardowa Biblioteka C++Edit

Projekt LLVM zawiera implementację Standardowej Biblioteki C++ o nazwie libc++, podwójnie licencjonowaną na licencji MIT i UIUC.

Od wersji 9.0.0 została ona objęta licencją Apache License 2.0 z wyjątkami LLVM.

PollyEdit

Zaimplementowano w niej zestaw optymalizacji cache-locality, a także autoparalelizm i wektoryzację przy użyciu modelu wielościanów.

DebuggerEdit

Główny artykuł: LLDB (debugger)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.