Каковы различия между LLVM и Java-байт-кодом?

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

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

3 ответа

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

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

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

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

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

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

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

Байт-коды JVM и байт-коды LLVM имеют сходства и различия. С точки зрения сходства, это два промежуточных представления программы. Таким образом, они могут представлять программы, написанные на разных языках программирования. Например, есть интерфейсы, которые переводят Java, Closure, Scala и т. Д. В байт-коды JVM, и есть интерфейсы, которые переводят C, C++, Swift, Julia, Rust и т. Д. В байт-коды LLVM.

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

Возможно, изначально байт-коды LLVM также считались интерпретируемыми, но если это произошло, то их назначение со временем изменилось. Итак, байт-коды LLVM - это представление программы, предназначенное для анализа и оптимизации. Он закодирован в формате Static Single Assignment, который больше похож на математическую абстракцию программы, чем на фактическую исполняемую сборку. Итак, в LLVM IR есть такие инструкции, как phi-функции, которые, например, не имеют прямого эквивалента в типичных компьютерных архитектурах. Таким образом, хотя можно интерпретировать байт-коды LLVM (есть инструмент под названием lli, который является частью инструментальной цепочки LLVM, который делает это), это не самый важный способ использования LLVM IR.

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

Другие вопросы по тегам