Почему llvm считается неподходящим для реализации JIT? - PullRequest
56 голосов
/ 26 июля 2011

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

Почему LLVM не подходит для создания JIT?

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

Ответы [ 6 ]

47 голосов
/ 05 марта 2012

Почему LLVM не подходит для создания JIT?

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

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

27 голосов
/ 26 июля 2011

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

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

12 голосов
/ 29 июля 2011

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

10 голосов
/ 18 июля 2014

Обновление: с 7/2014 в LLVM добавлена ​​функция под названием «Точки исправления», которая используется для поддержки полиморфных встроенных кэшей в JavaScript JIT для Safari FTL. Это относится именно к случаю использования, на который жаловались Комментарий Армина Риго в оригинальном вопросе.

9 голосов
/ 29 июля 2011

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

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

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

4 голосов
/ 15 января 2014

Более подробную информацию о LLVM IR смотрите здесь: LLVM IR - это компилятор IR .

...