Каким образом (и) LLVM Низкий уровень?

12

Как LLVM (низкоуровневая виртуальная машина) является низкоуровневой? (На момент написания статьи я не нашел такого расширения аббревиатуры "LLVM" на его веб-сайте, но в Википедии .)

Он называется «Низкий уровень», для чего он предназначен (инфраструктура компилятора), или потому что он работает на «более низком уровне», чем другие инструменты?

В качестве (своего рода) «иллюстрации» этого, является ли LLVM более низкого уровня, чем JVM и CLR , или он предназначен только для использования «более низкого уровня»?

Abbafei
источник

Ответы:

16

Уровень LLVM ниже, чем у типичных виртуальных машин, таких как JVM и CLR. Например, хотя у него есть хуки для сборщика мусора, он не предоставляет сам сборщик мусора.

Аналогично, JVM имеет встроенный JIT-компилятор (за исключением действительно древних версий). У LLVM есть несколько JIT-компиляторов для LLVM IR, но разработчик все еще должен собрать все вместе и фактически JIT-код.

Когда JVM встречает неразрешенный внешний объект, он выходит и находит подходящий класс для его удовлетворения и знает, как искать файлы .class непосредственно в файловой системе и в файлах .jar 1 . JIT-компиляторы LLVM имеют зацепки, с помощью которых вы можете решить, как обрабатывать подобные вещи. Как и следовало ожидать, некоторые люди написали несколько версий по умолчанию, поэтому он может делать вещи примерно в том же порядке, что и JVM - но вы также можете игнорировать их и делать что-то по-другому, если вы выберете.

Проще говоря, если вы разрабатываете компилятор (или что-то в этом порядке), у него есть много инструментов, которые сделают вашу жизнь проще. Вместо того, чтобы сильно беспокоиться об оптимизации, вы можете сделать примерно простейший перевод из исходного кода в LLVM IR, а затем использовать библиотеки LLVM для управления оптимизацией, JIT, связыванием и т. Д. Тем не менее, они являются библиотеками - это обеспечивает некоторые действительно полезные функции, так что вам не нужно разбираться со всеми деталями, но они все еще являются функциями, и вы все еще пишете код для их вызова. Это не готовый продукт, просто полезные инструменты для создания продуктов относительно быстро и легко.


1 Технически, не все это встроено в собственно JVM. Он определяет то, что обычно называется первоначальным загрузчиком классов как часть собственно JVM, а затем в java.util.ClassLoader указываются загрузчики пользовательских классов, которые обрабатывают другие вещи. Некоторые загрузчики классов включены по умолчанию, и если вы хотите достаточно сильно, вы можете дополнить их, определив свои собственные.

Джерри Гроб
источник
12

Это низкий уровень, потому что он спроектирован таким образом, чтобы существующие или будущие виртуальные машины (JVM) могли использовать его в качестве ядра своей реализации.

Посмотрите на это следующим образом: виртуальные машины Java и Python являются очень переносимыми, потому что они написаны на стандартном C и во многом полагаются на свои собственные библиотеки. Цель LLVM - предоставить инфраструктуру, позволяющую легко портировать любую виртуальную машину на платформу, которая уже поддерживает LLVM.

LLVM предлагает поддержку статической компиляции и JIT-компиляции и разработана таким образом, чтобы она могла работать в пространстве доверенной операционной системы. Это означает, что теоретически запуск виртуальной машины поверх LLVM должен означать гораздо меньше работы и производить что-то гораздо более быстрое и эффективное. Теоретически.

Тогда LLVM, будучи более низкого уровня, должно быть легче портировать на разные ОС и аппаратные архитектуры.

Можно добиться значительной экономии, если разработчики языка смогут писать на единой, легко портируемой низкоуровневой платформе. Самые известные виртуальные машины находятся на полпути между языком, который они обслуживают, и операционной системой, и им приходится реализовывать свои собственные промежуточные представления и JITC.

апалала
источник
5

Часть «низкого уровня» имени LLVM относится к уровню используемого виртуального набора команд. Промежуточный язык (IR), который использует LLVM, близок к уровню машинного кода, хотя он не зависит от архитектуры и является общим.

С другой стороны, байт-код JVM и CLR находится на довольно высоком уровне, поскольку содержит инструкции более высокого уровня абстракции. Оба они являются объектно-ориентированными стековыми языками сборки. Например, JVM имеет инструкцию invokevirtual, которая должна знать конкретную объектную модель языка Java.

Zayenz
источник
3

Это, безусловно, более низкий уровень, чем у любой конкретной виртуальной машины и унифицированных виртуальных машин, таких как JVM и CLR. Его дизайн близок к промежуточному представлению низкого уровня в GCC (GIMPLE) и аналогичных компиляторах. Не существует GC по умолчанию, не применяется конкретная система типов высокого уровня, выравнивание не предполагается (оно должно быть указано явно), целочисленные типы данных и типы данных с плавающей запятой являются явными (и зависят от платформы), а самый низкий уровень из всех - a Приличная арифметика указателя доступна.

SK-логика
источник