Я не понимаю разницы между LLVM и java (байт-кодом), что это такое?
-edit- под «что это такое» я имею в виду разницу между LLVM и java (байт-кодом), а не то, что такое LLVM и java.
если вопрос сформулирован неоднозначно, то не глупые ответы, а вопрос. извините, но тот, кто говорит, что приведенные ниже ответы «глупые», должен перечитать все в этой ветке. Когда я ответил на ваш вопрос, это было похоже на «разницу между llvm и java». Комментарий Кена звучит довольно высокомерно.
Люблю комментарий Кен. Извините AcidZombie24 за некоторые из этих ответов.




Предполагая, что вы имеете в виду JVM, а не Java:
LLVM - это виртуальная машина на основе регистров низкий уровень. Он предназначен для абстрагирования базового оборудования и проведения чистой линии между серверной частью компилятора (генерация машинного кода) и клиентской частью (синтаксический анализ и т. д.).
JVM - это виртуальная машина на основе стека гораздо более высокого уровня. JVM обеспечивает сборку мусора, имеет понятие объектов и вызовов виртуальных методов и многое другое. Таким образом, JVM предоставляет инфраструктуру гораздо более высокого уровня для языковой совместимости (во многом как Microsoft CLR).
(Эти абстракции можно построить поверх LLVM так же, как их можно построить поверх C.)
LLVM поддерживает сборщик мусора подробнее здесь
@Robert Zaremba Вы когда-нибудь пробовали реализовать сборку мусора с помощью LLVM? У меня есть. По сути, вы должны делать все самостоятельно (они даже не предоставляют простой сборщик мусора, хотя есть устаревший пример, плавающий вокруг). LLVM просто предоставляет встроенные функции для вашего кода для подключения к сборщику мусора. В отличие от JVM, которая предоставляет встроенный обязательный сборщик мусора, который автоматически работает со всеми объектами.
@mgiuca Спустя 5 лет ARC в Swift намного лучше, чем Java GC. quora.com/…
Не является ли одно из различий в том, что JVM почти похож на интерпретатор, поскольку пользователю необходимо установить его для выполнения программ, в то время как LLVM используется для предварительной генерации исполняемых файлов для конкретной архитектуры (я могу очень ошибаться, только что начал узнав об этом)?
(Вероятно, я описываю JIT и AOT, где JVM чаще используется для JIT и LLVM AOT?)
Java - это язык программирования, который использует JVM как средство выполнения «точно в срок» (JIT), тогда как LLVM - это конструктор компилятора, предназначенный для разработки новых языков и интерфейсов для существующих языков. LLVM делает имеет механизм JIT, но его не нужно использовать, если он вам не нужен. Вы можете выбросить ассемблер LLVM, байт-код или специфичный для платформы ассемблер вместо использования JIT-исполнения.
Очень жаль, что этот вопрос встал не с той ноги. Я пришел к нему в поисках более подробного сравнения.
Самая большая разница между байт-кодом JVM и бит-кодом LLVM заключается в том, что инструкции JVM ориентированы на стек, а битовый код LLVM - нет. Это означает, что вместо загрузки значений в регистры байт-код JVM загружает значения в стек и вычисляет значения оттуда. Я считаю, что преимуществом этого является то, что компилятору не нужно выделять регистры, но я не уверен.
Битовый код LLVM ближе к коду машинного уровня, но не привязан к конкретной архитектуре. Например, я думаю, что битовый код LLVM может использовать произвольное количество логических регистров. Может быть, здесь выступит кто-нибудь, более знакомый с LLVM?
«Я считаю, что преимуществом этого является то, что компилятору не нужно выделять регистры, но я не уверен». Не уверен в этом. Преимущество ISTR в том, что проще проверять на основе стека.
«Я считаю, что преимуществом этого является то, что компилятору не нужно выделять регистры, но я не уверен». - Компилятор на основе LLVM не занимается распределением регистров - это скорее форма SSA. LLVM / JVM для эффективной работы должен делает это, поскольку в целом память намного медленнее, чем регистры ЦП (или, скорее, даже медленнее).
Значения загрузки в стек - это недостаток с точки зрения производительности. Посмотрите на это pdf.
какая разница между бит-кодом и байт-кодом? они означают то же самое или есть что-то еще?
llvm IR (промежуточное представление) предполагает, что у вас есть бесконечное количество регистров для работы, серверная часть 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.
От имени тех из нас, кто действительно понял ваш вопрос, я хотел бы извиниться за все полученные вами глупые ответы. :-(