Принятие Вас означает JVM, а не Java:
LLVM низкий уровень основанная на регистре виртуальная машина. Это разработано, чтобы абстрагировать используемое оборудование и провести чистую линию между бэкендом компилятора (генерация машинного кода) и фронтендом (парсинг, и т.д.).
JVM является намного высокоуровневой стековой виртуальной машиной. JVM обеспечивает сборку "мусора", имеет понятие объектов и виртуальных вызовов метода и т.д. Таким образом JVM обеспечивает намного высокоуровневую инфраструктуру для совместимости языка (во многом как CLR Microsoft).
(Возможно создать эти абстракции по LLVM, как возможно создать их сверху C.)
Java - это язык программирования, который использует JVM как средство выполнения «точно в срок» (JIT), тогда как LLVM - это конструктор компилятора, предназначенный для разработки новых языков и интерфейсов. для существующих языков. LLVM имеет механизм JIT, но его не нужно использовать, если он вам не нужен. Вы можете отказаться от ассемблера LLVM, байт-кода или специфичного для платформы ассемблера вместо использования JIT-исполнения.
It's too bad this question got off on the wrong foot. I came to it looking for a more detailed comparison.
The biggest difference between JVM bytecode and and LLVM bitcode is that JVM instructions are stack-oriented, whereas LLVM bitcode is not. This means that rather than loading values into registers, JVM bytecode loads values onto a stack and computes values from there. I believe that an advantage of this is that the compiler doesn't have to allocate registers, but I'm not sure.
LLVM bitcode is closer to machine-level code, but isn't bound by a particular architecture. For instance, I think that LLVM bitcode can make use of an arbitrary number of logical registers. Maybe someone more familiar with LLVM can speak up here?