LLVM є нижчим рівнем, ніж типові ВМ, такі як JVM та CLR. Наприклад, хоча він має гачки для сміттєзбірника, він не забезпечує сміттєзбірник сам.
Так само JVM має вбудований компілятор JIT (за винятком справді давніх версій). У LLVM є кілька компіляторів JIT для LLVM IR, але розробник все ще повинен підключити речі і фактично JIT-код.
Коли JVM стикається з невирішеним зовнішнім, він виходить і знаходить потрібний клас для його задоволення, і знає, як шукати .class файли безпосередньо у файловій системі та у .jar-файлах 1 . У компіляторів JIT LLVM є гачки, на яких можна вирішити, як керуються подібними справами. Як і слід було очікувати, деякі люди написали деякі версії за замовчуванням, тож вони можуть робити речі приблизно в тому ж порядку, що і JVM, але ви також можете ігнорувати їх і робити щось по-іншому, якщо захочете.
Простіше кажучи, якщо ви розробляєте компілятор (або щось на те, щоб замовити), у нього є багато інструментів, щоб полегшити ваше життя. Замість того, щоб багато переживати з приводу оптимізації, ви можете зробити приблизно найпростіший переклад, яким ви можете керувати зі свого вихідного коду до ІК LLVM, а потім використовувати бібліотеки LLVM для керування оптимізацією, JITing, посилання тощо. Тим не менш, це бібліотеки - це забезпечує деякі дійсно корисні функції, тому вам не доведеться мати справу з усіма деталями, але вони все одно функціонують, і ви все ще пишете код, щоб викликати їх. Це не готовий продукт, просто корисні інструменти для побудови виробів порівняно швидко та легко.
1 Технічно не все це вбудовано у власне СВМ. Він визначає те, що зазвичай називають завантажувачем класів первинних частин як частиною власного JVM, а потім є навантажувачі класів користувачів, вказані в java.util.ClassLoader, які обробляють інші речі. Деякі навантажувачі класів включені за замовчуванням, і якщо ви хочете досить погано, ви можете доповнити їх, визначивши власні.