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.