2013-11-28 5 views
6

В частности, я читал в компиляторе трассировки JIT и LuaJIT, и у меня возникли некоторые вопросы.Как работает компилятор следов LuaJIT?

Из того, что я понимаю, JIT LuaJIT не компилирует горячие методы, такие как Java HotSpot, он компилирует горячие пути, происходящие из циклов. Означает ли это, что если что-то не происходит из цикла (скажем, я вызываю функции Lua из C-api), тогда код никогда не будет перекошен? И что произойдет, когда вы нажмете еще один цикл? Будет ли путь к второму циклу JIT'ed, а затем новый путь из этого цикла, а также второй цикл будет частью одного и того же пути?

Как интерпретатор выбирает наиболее оптимальный путь? Допустим, у меня есть хеш-таблица строк ints ->. Теперь представьте, что я назвал table [x] с x равным 3 и 5 достаточно, чтобы они стали горячими путями и jitted, как интерпретатор решает, какой jitted код вызывает таблицу [x], где x равен 4?

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

ответ

7

Первой частью, на которой вы должны стоять, является LuaJIT IR и Bytecode, которые вы можете проверить на вики, это то, что интерпретатор LuaJIT запускает и оптимизирует, и, следовательно, отслеживает трассировку, чтобы определить, что нужно скомпилировать, и различные, а также дополнительные оптимизации, такие как циклическое разворачивание для горячего -Локи в пути следа.

Второе место, чтобы проверить это LJ FAQ, который имеет это сказать:

Q: Где я могу узнать больше о технологии компилятора используется LuaJIT?

Я планирую написать дополнительную документацию о внутренних компонентах LuaJIT. В то же время, пожалуйста, используйте следующий Google Scholar поиска, чтобы найти соответствующие документы:

Поиск по: Trace Compiler

Поиск: JIT Compiler

Поиск: Dynamic Language Optimizations

Поиск: SSA Form

Поиск: Linear Scan Register Allocation

Вот список инновационных функций в LuaJIT. И, вы знаете, чтение источника - это, конечно, единственный способ просветления. :-)

Abet очень неискренний (в основном потому Майк специализируется на разработке, а не документации), наиболее важная часть есть последнее предложение, источник очень чистая и единственный реальный способ узнать, как LJ делает его магии. Кроме того, innovative features link также дает еще один ключ к поиску.

В Википедии есть при трассировке JIT, однако в нижней части вы найдете то, что вы найдете наиболее полезным, чтобы помочь понять понятия, используемые в источнике LJ.

Некоторые из исходных файлов (в C), чтобы вы начали

  • lj_record.c: основной след рекордер, преобразует байт-код в ИК
  • lj_trace.c: более управления следа
  • lj_snap.c: ручки/создает след моментальные снимки
  • lj_ffrecord.c: данные для быстрых функций
  • lj_crecord.c: записи C d ata ops
+0

Я понимаю, как работает байт-код и ИК-интерфейс, и основная часть компилятора трассировки, по крайней мере, я думаю: P У меня было несколько деталей, о которых я не был уверен. Я остался в стороне от исходного кода LuaJIT, поскольку я еще не изучил сборку (и много LuaJIT написано в сборке правильно?) –

+0

В любом случае, я прочитаю все, что вы предложили, и посмотрите, приносит ли это просветление , Отличный ответ кстати! +1 –

+3

@RobinHeggelundHansen: технически только сборщик с резьбой находится в сборе (ну, особая абстракция используется с динамом), фактический трассировщик и код-эмиттер все в C (это немного странно, потому что имена полей очень компактны, но когда, как только вы понимаете соглашения, это немного легче) и Lua, я вообще использую VS, чтобы облегчить процесс создания источника. Я добавил несколько исходных файлов, которые содержат многие аспекты трассировки для моего ответа – Necrolis