Каковы различия между LLVM и Java-байт-кодом? - PullRequest
63 голосов
/ 18 января 2009

Я не понимаю разницы между LLVM и Java (байт-кодом), что они?

-edit- под «что они» я имею в виду различия между LLVM и Java (байт-код), а не то, что LLVM и Java.

Ответы [ 3 ]

82 голосов
/ 18 января 2009

Предполагается, что вы имеете в виду JVM, а не Java:

LLVM - это виртуальная машина на основе регистров низкого уровня . Он предназначен для абстрагирования базового оборудования и проведения четкой линии между серверной частью компилятора (генерация машинного кода) и интерфейсной частью (синтаксический анализ и т. Д.).

JVM - это виртуальная машина с многоуровневым стеком. JVM обеспечивает сборку мусора, имеет представление об объектах и ​​вызовах виртуальных методов и многое другое. Таким образом, JVM обеспечивает гораздо более высокий уровень инфраструктуры для взаимодействия языков (так же, как Microsoft CLR).

(Можно построить эти абстракции поверх LLVM так же, как можно построить их поверх C.)

26 голосов
/ 22 ноября 2009

Жаль, что этот вопрос встал не с той ноги. Я пришел к нему в поисках более подробного сравнения.

Самое большое различие между байт-кодом JVM и битовым кодом LLVM заключается в том, что инструкции JVM ориентированы на стек, а битовый код LLVM - нет. Это означает, что вместо загрузки значений в регистры, байт-код JVM загружает значения в стек и вычисляет значения оттуда. Я считаю, что преимущество этого в том, что компилятору не нужно выделять регистры, но я не уверен.

Битовый код LLVM ближе к машинному коду, но не привязан к конкретной архитектуре. Например, я думаю, что битовый код LLVM может использовать произвольное количество логических регистров. Может быть, кто-то более знакомый с LLVM может говорить здесь?

0 голосов
/ 19 мая 2009

Java - это язык программирования, который использует JVM в качестве средства выполнения "Just in Time" (JIT), тогда как LLVM - это набор конструктора компилятора, предназначенный для разработки новых языков и внешних интерфейсов для существующих языков. У LLVM есть движок JIT, но его не нужно использовать, если он вам не нужен. Вы можете выбросить LLVM-ассемблер, байт-код или специфичный для платформы ассемблер вместо использования JIT.

...