#truffle #&raalvm
#truffle #&raalvm
Вопрос:
Я просматривал ссылку GraalVM на JS, и большинство примеров показывают создание контекста и выполнение js-кода в этом контексте.
Context context = Context.create()
Есть ли способ прямой компиляции JS-кода во что-то вроде эквивалента байт-кода, загрузки и запуска напрямую?
Ответ №1:
Языки GraalVM, JavaScript, Ruby, R, Python, Webassembly, GraalSqueak и так далее не компилируют целевую программу в байт-код.
Языковая реализация является интерпретатором абстрактного синтаксического дерева для целевого языка. Этот интерпретатор написан на Java с использованием API Truffle framework.
Во время выполнения вы создаете программу AST, используя узлы этого интерпретатора, и они знают, как оценивать себя. Например, что-то вроде a b
может стать 3 объектами узла AddNode
и 2 дочерними узлами. И AddNode.evaluate()
может быть что-то вроде return left.evaluate() ri&ht evaluate()
.
Вы можете интерпретировать дерево целевой программы, и именно так она выполняется. Во время выполнения интерпретатор может модифицировать дерево, оптимизируя выполнение после сбора некоторого профиля для того, что будет выполняться. Это своего рода объединение кода интерпретатора и данных из программы с использованием метода, называемого частичной оценкой (который вы можете рассматривать как очень всеобъемлющее встраивание).
Затем код интерпретатора дополнительно JIT-компилируется с помощью jit-компилятора JVM. Но для программы нет промежуточного представления байт-кода.
Конечно, вы можете использовать js
утилиту из GraalVM для запуска кода JavaScript непосредственно с ним. Или node.js
из GraalVM (или иным способом). Но я думаю, что это не то, о чем здесь спрашивают.
Комментарии:
1. спасибо за это. Я нашел статью, которая более подробно описывает ваше резюме: jrebel.com/blo&/&raal-and-truffle-for-lan&ua&e-interpretation
2. ха-ха, это запись в блоге @mani-sarkar, которую мы опубликовали, когда я еще работал в ZeroTurnaround. Как увлекателен, тесен мир!