W jaki sposób (y) jest niski poziom LLVM?

12

W jaki sposób LLVM (Low Level Virtual Machine) Low Level? (W momencie pisania tego artykułu nie znalazłem tego rozszerzenia skrótu „LLVM” na jego stronie internetowej, ale na Wikipedii .)

Czy nazywa się „niski poziom” w tym, do czego jest przeznaczony (infrastruktura kompilatora), czy dlatego, że działa na „niższym poziomie” niż inne narzędzia?

Jako (rodzaj) „ilustracji” tego, czy LLVM jest niższego poziomu niż JVM i CLR , czy też jest przeznaczony tylko do zastosowań „niższego poziomu”?

Abbafei
źródło

Odpowiedzi:

16

LLVM jest niższy poziom niż typowe maszyny wirtualne, takie jak JVM i CLR. Na przykład, chociaż ma haczyki do modułu wyrzucającego elementy bezużyteczne, nie zapewnia on samego modułu do wyrzucania elementów bezużytecznych.

Podobnie JVM ma wbudowany kompilator JIT (z wyjątkiem naprawdę starożytnych wersji). LLVM ma kilka kompilatorów JIT dla LLVM IR, ale wciąż do dewelopera należy połączenie różnych elementów i faktycznie JIT kodu.

Gdy JVM napotyka nierozwiązany element zewnętrzny, wychodzi i znajduje odpowiednią klasę, aby go zaspokoić, i wie, jak szukać plików .class bezpośrednio w systemie plików i .jar 1 . Kompilatory JIT firmy LLVM mają zaczepy, w których można zdecydować, jak mają być obsługiwane takie rzeczy. Jak można się spodziewać, niektórzy ludzie napisali kilka domyślnych wersji, więc może robić mniej więcej to samo, co JVM - ale możesz je również zignorować i robić różne rzeczy, jeśli zechcesz.

Krótko mówiąc, jeśli opracowujesz kompilator (lub coś w tej kolejności), ma wiele narzędzi, które ułatwią ci życie. Zamiast martwić się o optymalizację, możesz wykonać z grubsza najprostsze tłumaczenie, którym możesz zarządzać z kodu źródłowego na LLVM IR, a następnie użyć bibliotek LLVM do zarządzania optymalizacją, JITingiem, łączeniem itp. Niemniej jednak są to biblioteki - zapewnia to biblioteki niektóre naprawdę przydatne funkcje, więc nie musisz zajmować się wszystkimi szczegółami, ale wciąż są funkcjami i nadal piszesz kod, aby je wywołać. To nie jest gotowy produkt, tylko użyteczne narzędzia do budowania produktów stosunkowo szybko i łatwo.


1 Technicznie rzecz biorąc, nie wszystko to jest wbudowane we właściwą JVM. Określa to, co zwykle nazywane jest podstawowym modułem ładującym jako część właściwej maszyny JVM, a następnie w java.util.ClassLoader są określone moduły ładujące użytkowników, które obsługują inne rzeczy. Niektóre moduły ładujące są domyślnie dołączone, a jeśli chcesz wystarczająco mocno, możesz je uzupełnić, definiując własne.

Jerry Coffin
źródło
12

Jest niski, ponieważ został zaprojektowany tak, aby istniejące lub przyszłe maszyny wirtualne (JVM) mogły wykorzystywać je jako rdzeń ich implementacji.

Zobacz to w ten sposób: Maszyny wirtualne Java i Python są bardzo przenośne, ponieważ są napisane w standardowym C i w dużej mierze polegają na własnych bibliotekach. Zamiarem LLVM jest zapewnienie infrastruktury, aby łatwo było przenieść dowolną maszynę wirtualną na platformę, która już obsługuje LLVM.

LLVM oferuje obsługę kompilacji statycznej i JIT, a jest zaprojektowany w taki sposób, aby mógł działać w zaufanym obszarze systemu operacyjnego. Oznacza to, że teoretycznie uruchomienie maszyny wirtualnej na LLVM powinno oznaczać znacznie mniej pracy i dawać coś znacznie szybszego i wydajniejszego. W teorii.

Wówczas LLVM, jako niższy poziom, powinien być łatwiejszy do przeniesienia na różne architektury systemu operacyjnego i sprzętu.

Jeśli implementatorzy języka będą mogli pisać na jednej, łatwej w transporcie platformie niskiego poziomu, trzeba zaoszczędzić sporo pieniędzy. Najbardziej znane maszyny wirtualne znajdują się w połowie drogi między językiem, którym służą, a systemem operacyjnym i muszą zaimplementować własne reprezentacje pośrednie oraz JITC.

Apalala
źródło
5

Część „niskiego poziomu” nazwy LLVM odnosi się do poziomu stosowanego zestawu instrukcji wirtualnych. Język pośredni (IR), którego używa LLVM, jest zbliżony do poziomu kodu maszynowego, chociaż jest niezależny od architektury i ogólnie.

Z drugiej strony bajt JVM i CLR jest dość wysoki, ponieważ zawiera instrukcje, które znajdują się na wyższej warstwie abstrakcji. Oba są zorientowanymi obiektowo językami asemblera. Na przykład JVM ma instrukcję invokevirtual, która jest instrukcją, która musi wiedzieć o konkretnym modelu obiektowym języka Java.

Zayenz
źródło
3

Jest to z pewnością niższy poziom niż którakolwiek z maszyn wirtualnych specyficznych dla języka i zunifikowanych maszyn wirtualnych, takich jak JVM i CLR. Jego konstrukcja jest zbliżona do reprezentacji pośredniej niskiego poziomu w GCC (GIMPLE) i podobnych kompilatorach. Nie ma domyślnej GC, nie jest egzekwowany żaden konkretny system typu wysokiego poziomu, nie zakłada się wyrównania (należy to wyraźnie określić), typy danych liczb całkowitych i zmiennoprzecinkowych są jawne (i zależne od platformy), a najniższy ze wszystkich - a przyzwoita arytmetyka wskaźnika jest dostępna.

Logika SK
źródło