Czym dokładnie jest LLVM?

464

Cały czas słyszę o LLVM. Jest w Perlu, potem w Haskell, a potem ktoś używa go w innym języku? Co to jest?

bodacydo
źródło
45
W książce znajduje się dobry rozdział wyjaśniający wszystko ładnie: www.aosabook.org/en/llvm.html
David d C e Freitas

Odpowiedzi:

369

LLVM to biblioteka używana do konstruowania, optymalizacji i produkcji pośredniego i / lub binarnego kodu maszynowego.

LLVM może być używany jako środowisko kompilatora, w którym udostępnia się „front end” (parser i lexer) oraz „back end” (kod, który konwertuje reprezentację LLVM na rzeczywisty kod maszynowy).

LLVM może również działać jako kompilator JIT - obsługuje generowanie zestawów x86 / x86_64 i PPC / PPC64 z szybkimi optymalizacjami kodu w celu zwiększenia prędkości kompilacji.

Jeśli jesteś zainteresowany, możesz grać z kodem maszynowym LLVM, który jest generowany z kodu C lub C ++ na ich stronie demonstracyjnej , ale strona demonstracyjna jest obecnie wyłączona od 2013 roku.

LiraNuna
źródło
39
Jeśli chcesz się nim bawić, zapoznaj się z tym niesamowitym artykułem: gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna
29
Link podany w odpowiedzi mówi „Strona demo LLVM jest obecnie wyłączona”.
EngrStudent
5
ellcc.org/demo/index.cgi to kolejny sposób na kompilację C / C ++ przez LLVM do różnych celów, w tym kodu pośredniego
Tom Goodfellow
1
czy możesz podać prawdziwy przykład tego, co to znaczy?
Migrate2Lazarus zobacz mój profil
112

Dobre podsumowanie LLVM jest następujące:

wprowadź opis zdjęcia tutaj

Na froncie masz Perla i wiele innych języków wysokiego poziomu. W backendie masz kod tubylczy, który działa bezpośrednio na maszynie.

W centrum znajduje się twoja pośrednia reprezentacja kodu. Jeśli każdy język wysokiego poziomu może być reprezentowany w tym formacie IR LLVM, narzędzia analityczne oparte na tym IR mogą być łatwo ponownie użyte - to podstawowa racja.

Peter Teoh
źródło
39
obraz jest wart tysiąca słów 👍
ipatch
3
Wygląda więc na to, że LLVM jest przydatny dla projektantów kompilatorów. Czy programista powinien dbać o to, czy kompiluje ze standardowym kompilatorem lub kompilatorem opartym na LLVM, oprócz analizowania generowanego kodu niezależnie od kodu źródłowego?
jinawee,
4
jeśli możesz skompilować z LLVM do jego IR, wówczas możesz otworzyć dla ciebie wiele narzędzi do analizy IR. Ale jeśli twoje narzędzie jest w stanie analizować tylko natywne pliki binarne (na przykład x86), to czy jest to pliki binarne generowane przez LLVM, pliki binarne generowane przez gcc, czy generowane przez kompilator Intel, nie ma różnicy.
Peter Teoh,
73

LLVM (kiedyś oznacza „maszynę wirtualną niskiego poziomu”, ale już nie jest) to infrastruktura kompilatora napisana w C ++, która została zaprojektowana do optymalizacji kompilacji, czasu łącza, czasu działania i „bezczynności” napisanych programów w dowolnych językach programowania. Pierwotnie zaimplementowany dla C / C ++, niezależny od języka projekt (i sukces) LLVM od tego czasu stworzył szeroką gamę front-endów, w tym Objective C, Fortran, Ada, Haskell, kod bajtowy Java, Python, Ruby, ActionScript, GLSL , i inni.

Przeczytaj to, aby uzyskać więcej wyjaśnień. Zobacz
także Unladen Swallow

N 1.1
źródło
13
.. więc co doktorzy próbują powiedzieć; podczas gdy LLVM jest akronimem dla maszyny wirtualnej niskiego poziomu , projekt nazywa się po prostu LLVM , a nie pełne słowa.
Jochem Kuijpers
2
Wcześniej miał powyższy skrót, ale później usunął en.wikipedia.org/wiki/LLVM
VVB
2
Podsumowując komentarze. „Maszyna wirtualna niskiego poziomu (LLVM)” powinna być czymś w rodzaju „LLVM (co oznaczało„ maszynę wirtualną niskiego poziomu ”na wcześniejszym etapie projektu)”
ssokolow
52

Zgodnie z książką „Pierwsze kroki z podstawowymi bibliotekami LLVM” (c):

W rzeczywistości nazwa LLVM może odnosić się do jednego z poniższych:

  • Projekt / infrastruktura LLVM: Jest to parasol dla kilku projektów, które razem tworzą kompletny kompilator: frontendy, backendy, optymalizatory, asemblery, linkery, libc ++, compiler-rt i silnik JIT. Słowo „LLVM” ma takie znaczenie, na przykład w następującym zdaniu: „LLVM składa się z kilku projektów”.

  • Kompilator oparty na LLVM: jest to kompilator zbudowany częściowo lub całkowicie z infrastrukturą LLVM. Na przykład kompilator może używać LLVM jako interfejsu użytkownika i zaplecza, ale do wykonania końcowego łącza używa bibliotek systemowych GCC i GNU. LLVM ma to znaczenie w następującym zdaniu, na przykład: „Użyłem LLVM do kompilacji programów C na platformie MIPS”.

  • Biblioteki LLVM: jest to część kodu infrastruktury LLVM do wielokrotnego użytku. Na przykład LLVM ma następujące znaczenie w zdaniu: „Mój projekt używa LLVM do generowania kodu za pomocą struktury kompilacji Just-in-Time”.

  • Rdzeń LLVM: Optymalizacje zachodzące na poziomie języka pośredniego i algorytmy zaplecza tworzą rdzeń LLVM, w którym rozpoczął się projekt. LLVM ma to znaczenie w następującym zdaniu: „LLVM i Clang to dwa różne projekty”.

  • LLVM IR: Jest to reprezentacja pośrednia kompilatora LLVM. LLVM ma to znaczenie, gdy jest używane w zdaniach takich jak „Zbudowałem interfejs, który tłumaczy mój własny język na LLVM”.

Ittrin
źródło
35

LLVM to w zasadzie biblioteka używana do budowy kompilatorów i / lub oprogramowania zorientowanego na język. Podstawową istotą jest to, że chociaż masz gcc, który jest prawdopodobnie najpowszechniejszym pakietem kompilatorów, nie jest zbudowany tak, aby można go było ponownie używać, tj. trudno jest pobrać komponenty z gcc i użyć go do zbudowania własnej aplikacji. LLVM rozwiązuje ten problem dobrze, budując zestaw „modułowych i wielokrotnego użytku technologii kompilatora i łańcucha narzędzi”, których każdy mógłby użyć do budowy kompilatorów i oprogramowania zorientowanego na język.

redbandit
źródło
6
Więc LLVM to biblioteka, a Clang to kompilator?
Abdul
11
Clang jest kompilatorem frontendu C / C ++ LLVM. Konwertuje kod C na kod bitowy LLVM, który jest tłumaczony na niektóre języki asemblera przez kompilator zaplecza.
Boris Mulder
6

Infrastruktura kompilatora LLVM jest szczególnie przydatna do przeprowadzania optymalizacji i transformacji kodu. Składa się również z szeregu narzędzi służących do różnych zastosowań. llvm-prof to narzędzie do profilowania, które umożliwia profilowanie wykonania w celu zidentyfikowania hotspotów programu. Opt to narzędzie do optymalizacji, które oferuje różne przebiegi optymalizacji (na przykład eliminacja martwego kodu).

Co ważne, LLVM zapewnia biblioteki do pisania własnych haseł. Na przykład, jeśli chcesz dodać kontrolę zakresu dla niektórych argumentów przekazywanych do niektórych funkcji Programu, wystarczy napisanie prostej LLVM Pass.

Aby uzyskać więcej informacji na temat pisania własnej przepustki, sprawdź to http://llvm.org/docs/WritingAnLLVMPass.html

Hashim Sharif
źródło