Comments 16
А давайте бцдем соревноваться в знаниях систем, нежели англ. языка?
Кто-нибудь в исходники то заглядывал этой штуке? А то девелоперы могут написать все, что угодно в пресс-релизах, а в кишочки то никто не удосужился посмотреть.
Хабр — это комьюнити переводчиков или людей с мозгами?
Кто-нибудь в исходники то заглядывал этой штуке? А то девелоперы могут написать все, что угодно в пресс-релизах, а в кишочки то никто не удосужился посмотреть.
Хабр — это комьюнити переводчиков или людей с мозгами?
… resulting native code.
Не это ли самое основное?
Принцип JIT компиляторов как раз в том, что перед вызовом функции (в общем случае) они её компилируют в native код платформы, на которой запущена виртуальная машина. Поэтому последующие вызовы более дешевые.
С циклами та же история. Код тела цикла единажды компилируется и затем все N раз выполняется уже как native.
В Dragon Book про JIT ничего нету, вроде бы.
PS: в репозитории мозилы чёрт ногу сломит, и чтобы найти там код, ответственный за JIT, надо потратить не мало времени…
Не это ли самое основное?
Принцип JIT компиляторов как раз в том, что перед вызовом функции (в общем случае) они её компилируют в native код платформы, на которой запущена виртуальная машина. Поэтому последующие вызовы более дешевые.
С циклами та же история. Код тела цикла единажды компилируется и затем все N раз выполняется уже как native.
В Dragon Book про JIT ничего нету, вроде бы.
PS: в репозитории мозилы чёрт ногу сломит, и чтобы найти там код, ответственный за JIT, надо потратить не мало времени…
ВЫ дали ссылку на работу Франца, а вы её сами-то читали? Франц продвигает идею трассирующего JITа, т.е. такого JITa: находит вход в «горячее место» (заголовок цикла), когда исполнение входит в это горячее место он начинает записывать все _исполняющиеся_ инструкции в одну (почти) линейную последовательность. Затем эта линейная последовательность оптимизируется. Собственно это и есть ключевое отличие от классического JITа. В языках с динамической типизацией не получается просто вывести тип произвольной переменной, поэтому классический JIT мало что может (он же еще и ограничен по времени, так что ему глобально думать о типах некогда). Трассирующий JIT же записывает последовательность _специализированных_ инструкций.
Скажем если у нас есть запись
x = z + y.
Там используется трассирующий
Скажем если у нас есть запись
x = z + y.
Там используется трассирующий
Прошу прощения. Какие-то странные shortcut'ы
Скажем если у нас есть код
x = z + y
То обычный JIT скорее всего породит код вида
if (isnumber(z) && isnumber(y))
x = sumNumbers(z, y)
else if (isstring(z) && isnumber(y))
x = concat(z, tostring(y))
…
Вообщем мотню переходов. Трассирующий же JIT в породит специализированный фрагмент кода с _фиксированными_ типами z и y. И всего двумя проверками на тип, если эти проверки проваляться то произвойдёт деоптимизация, т.е. выход из оптимизированного кода обратно в интерпретатор. Какие типы фиксировать определяется статически: если какой-то цикл постоянно исполнятся так, что в его теле z является строкой, а y — числом, то компиляция случится именно в таких предположениях.
Далее трассирующий JIT может записывать инструкции между вызовами: это позволяет автоматически делать открытую подстановку и специализацию косвенного вызова, что опять же положительно сказывается на производительности.
Спасибо за внимание =)
Скажем если у нас есть код
x = z + y
То обычный JIT скорее всего породит код вида
if (isnumber(z) && isnumber(y))
x = sumNumbers(z, y)
else if (isstring(z) && isnumber(y))
x = concat(z, tostring(y))
…
Вообщем мотню переходов. Трассирующий же JIT в породит специализированный фрагмент кода с _фиксированными_ типами z и y. И всего двумя проверками на тип, если эти проверки проваляться то произвойдёт деоптимизация, т.е. выход из оптимизированного кода обратно в интерпретатор. Какие типы фиксировать определяется статически: если какой-то цикл постоянно исполнятся так, что в его теле z является строкой, а y — числом, то компиляция случится именно в таких предположениях.
Далее трассирующий JIT может записывать инструкции между вызовами: это позволяет автоматически делать открытую подстановку и специализацию косвенного вызова, что опять же положительно сказывается на производительности.
Спасибо за внимание =)
>новый метод трансляции байт-кода в машинный код на лету.
Это не новый метод, а очень даже старый. (я о direct-threaded program representation, c2.com/cgi/wiki? DirectThreadedCode)
Не вводите людей в заблуждение.
Это не новый метод, а очень даже старый. (я о direct-threaded program representation, c2.com/cgi/wiki? DirectThreadedCode)
Не вводите людей в заблуждение.
пожалуйста поднимите карму — не хватает чуть чуть запостить новый топик.
прошу прощения за оффтоп.
прошу прощения за оффтоп.
Когда же этот JIT будет стоять в браузере иначально( и во всех )
Sign up to leave a comment.
Разберемся с мартышкой-трассировщицей