JavaScript как байтовый код Emterpreter


Это одна из тех историй, которые, если вы поймете, что происходит на самом деле, могут заставить вас кричать, пытаясь оторваться от подушки. Становится ли мир программирования более странным?

Когда вы думаете об Emterpreter, естественной реакцией является странное ощущение – очень похожее на то, которое вы, вероятно, испытали, когда впервые столкнулись с начальным компилятором, то есть компилятором, написанным на языке, который он компилирует, и может компилироваться сам.

У Алона Закая, основателя проекта компилятора Emscripten, C to asm.js, возникла очень странная идея. Он модифицировал Emscripten, чтобы преобразовать asm.js в формат байт-кода и создать интерпретатор JavaScript для этого байтового кода. Подождите, пока это осядет.

Мы берем код C / C ++ и конвертируем его в подмножество JavaScript asm.js. Затем мы конвертируем asm.js в байтовый код и выплевываем для него интерпретатор, написанный на JavaScript.

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

Уменьшение задержки – цель этой, казалось бы, безумной идеи. Когда вы загружаете большой файл asm.js, он должен быть проанализирован, а это означает, что часто существует большой разрыв между загрузкой и получением результатов. Если вы также используете опережающий компилятор AOT, задержка еще больше, потому что все это должно быть скомпилировано до того, как оно начнется. Для запуска тестовой программы потребовалось около 300 мс, а с AOT это удвоилось до 600 мс после загрузки страницы. Та же программа, что и байт-код, запускалась за 150 мсек с AOT и чуть меньше без него.

Конечно, есть цена. Код Emterpreter работает от шести до двадцати раз медленнее. Очевидно, что если вы используете asm.js, скорость выполнения будет важна. Частичное решение – пометить некоторые подпрограммы как критические и оставить их как asm.js. Это минимизирует время загрузки большей части кода, но позволяет запускать asm.js, когда это необходимо. Это работает, но лучшее решение – использовать двухфазный запуск. Сначала загрузите интерпретируемый код, а затем загрузите asm.js в фоновом режиме.

С этим изменением мы получаем странное гибридное поведение. Код сначала загружается примерно через 200 мс, но работает примерно на одной пятой скорости, а затем через 900 мс мы возвращаемся к полной скорости asm.js.

Сама идея Emterpreter является экспериментальной, но вы можете попробовать ее и посмотреть, работает ли вам сочетание низкой задержки и возможной полной производительности. Лично я все еще пытаюсь справиться с идеей C / C + на JavaScript, на байтовый код, запускаемый интерпретатором JavaScript.


Добавить комментарий