Возможно ли скомпилировать (перенести) Scala в браузер, сохранив возможность динамически интерпретировать код Scala, предоставляемый пользователем?

#javascript #scala #reflection #scala.js #transpiler

#javascript #scala #отражение #scala.js #transpiler

Вопрос:

Я знаю, что Scala.js можно перенести в JS, но он не поддерживает отражение. Есть ли какой-либо способ интерпретировать предоставленный пользователем код Scala, не возвращаясь к стороне сервера?

Если интерпретация Scala таким образом невозможна, возможно ли запустить предоставленный пользователем код JavaScript из кода Scala (т. Е. Из того кода Scala, который будет перенесен)?

Комментарии:

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

2. Сначала просто некоторые примитивы, такие как математические операции и печать. Также определения функций, возможно, манипулирование списком…

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

4. На самом деле все это для минималистичного языка, который встраивает некоторую форму «собственного» кода, чтобы иметь возможность что-то делать. Это связано с крайним минималистичным подходом: каждая функциональность поступает с основного языка (в виде библиотек).

Ответ №1:

На первый вопрос: нет, это невозможно. Компилятор Scala не может быть скомпилирован в JavaScript по ряду причин, что делает невозможной компиляцию пользовательского кода в браузере.

Ко второму вопросу: да, с js.eval(dynamicJSCodeString) . Применяются стандартные предупреждения о eval и безопасности.

Ответ №2:

На первый вопрос: да, это определенно возможно. Вам просто нужно написать интерпретатор Scala либо на ECMAScript, либо на языке, для которого существует компилятор для ECMAScript (например, TypeScript, CoffeeScript, Python, Ruby, Kotlin или, конечно, Scala), либо на языке, для которого существует интерпретатор, написанный либо на ECMAScript, либо на языке, для которого существует компилятор для ECMAScript … и, конечно, вы также можете связать эти подходы.