Почему кода LLVM, считаются непригодными для реализации JIT-компилятором?


многие динамические языки реализуют (или хотят реализовать) JIT-компилятор, чтобы ускорить время их выполнения. Неизбежно, кто-то из галереи арахиса спрашивает, почему они не используют LLVM. Ответ часто звучит так: "LLVM непригоден для построения JIT.(Например, комментарий Армина Риго здесь.)

почему LLVM непригоден для построения JIT?

примечание: Я знаю, что LLVM имеет свой собственный JIT. Если кода LLVM используется, чтобы быть неподходящим, но сейчас подходит, пожалуйста, скажите, что изменилось. Я не говорю о запуске байт-кода LLVM на LLVM JIT, я говорю об использовании библиотек LLVM для реализации JIT для динамического языка.

6 53

6 ответов:

есть некоторые заметки о LLVM в ненагруженной Ласточке посмертного блога: http://qinsb.blogspot.com/2011/03/unladen-swallow-retrospective.html .

к сожалению, LLVM в своем текущем состоянии действительно разработан как статический оптимизатор компилятора и серверная часть. Генерация и оптимизация кода LLVM-это хорошо, но дорого. Все оптимизации предназначены для работы с ИК, генерируемыми статическими C-подобными языками. Большинство важных оптимизаций для оптимизация Python требует высокого уровня знаний о том, как программа выполнялась на предыдущих итерациях, и LLVM не помог нам это сделать.

почему LLVM непригоден для построения JIT?

я писал HLVM, высокоуровневая виртуальная машина с богатой системой статических типов, включая типы значений, устранение хвостовых вызовов, универсальную печать, потоки C FFI и POSIX с поддержкой как статической, так и JIT-компиляции. В частности, HLVM предлагает невероятную производительность для виртуальной машины высокого уровня. Я даже реализовал ML-подобный интерактивный интерфейс с различными типами и сопоставлением шаблонов используя JIT-компилятор, как показано в этом демонстрация компьютерной алгебры. Вся моя работа, связанная с HLVM, в совокупности составляет всего несколько недель работы (и я не компьютерный ученый, а просто дилетант).

Я думаю, что результаты говорят сами за себя и однозначно демонстрируют, что LLVM является отлично подходит для компиляции JIT.

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

обновление: начиная с 7/2014, LLVM добавила функцию под названием "точки исправления", которые используются для поддержки полиморфных встроенных кэшей в сафари ФТЛ JavaScript-код с помощью JIT. Это охватывает именно тот случай использования, на который жаловался комментарий Int Armin Rigo в исходном вопросе.

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

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

для динамических языков LLVM не может быть правильным инструментом, просто потому, что он был разработан для оптимизации системных языков программирования, таких как C и C++, которые сильно/статически типизированы и поддерживают очень низкоуровневые функции. В общем случае оптимизация, выполняемая на C, на самом деле не делает динамические языки быстрыми, потому что вы просто создаете эффективный способ запуска медленной системы. Современные динамические языковые Джиты делают такие вещи, как встраивание функции, которые известны только во время выполнения, или оптимизация на основе того, какой тип переменной имеет большую часть времени, для которого LLVM не предназначен.

для более подробной разглагольствования о LLVM IR см. здесь: LLVM IR-это компилятор IR.