Уровень LLVM ниже, чем у типичных виртуальных машин, таких как JVM и CLR. Например, хотя у него есть хуки для сборщика мусора, он не предоставляет сам сборщик мусора.
Аналогично, JVM имеет встроенный JIT-компилятор (за исключением действительно древних версий). У LLVM есть несколько JIT-компиляторов для LLVM IR, но разработчик все еще должен собрать все вместе и фактически JIT-код.
Когда JVM встречает неразрешенный внешний объект, он выходит и находит подходящий класс для его удовлетворения и знает, как искать файлы .class непосредственно в файловой системе и в файлах .jar 1 . JIT-компиляторы LLVM имеют зацепки, с помощью которых вы можете решить, как обрабатывать подобные вещи. Как и следовало ожидать, некоторые люди написали несколько версий по умолчанию, поэтому он может делать вещи примерно в том же порядке, что и JVM - но вы также можете игнорировать их и делать что-то по-другому, если вы выберете.
Проще говоря, если вы разрабатываете компилятор (или что-то в этом порядке), у него есть много инструментов, которые сделают вашу жизнь проще. Вместо того, чтобы сильно беспокоиться об оптимизации, вы можете сделать примерно простейший перевод из исходного кода в LLVM IR, а затем использовать библиотеки LLVM для управления оптимизацией, JIT, связыванием и т. Д. Тем не менее, они являются библиотеками - это обеспечивает некоторые действительно полезные функции, так что вам не нужно разбираться со всеми деталями, но они все еще являются функциями, и вы все еще пишете код для их вызова. Это не готовый продукт, просто полезные инструменты для создания продуктов относительно быстро и легко.
1 Технически, не все это встроено в собственно JVM. Он определяет то, что обычно называется первоначальным загрузчиком классов как часть собственно JVM, а затем в java.util.ClassLoader указываются загрузчики пользовательских классов, которые обрабатывают другие вещи. Некоторые загрузчики классов включены по умолчанию, и если вы хотите достаточно сильно, вы можете дополнить их, определив свои собственные.