Я использую Nashorn для awk-подобной массовой обработки данных. Идея состоит в том, что есть много входящих данных, приходящих строка за строкой, одна за другой. И каждая строка состоит из именованных полей. Эти данные обрабатываются пользовательскими сценариями, хранящимися где-то снаружи и редактируемыми пользователями. Сценарии просты, например if( c>10) a=b+3
, где a, b и c - поля во входных строках данных. Количество данных действительно огромно. Код такой (пример для демонстрации варианта использования):
ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(
new String[]{"-strict", "--no-java", "--no-syntax-extensions", "--optimistic-types=true"},
null,
scr -> false);
CompiledScript cs;
Invocable inv=(Invocable) engine;
Bindings bd=engine.getBindings(ScriptContext.ENGINE_SCOPE);
bd.remove("load");
bd.remove("loadWithNewGlobal");
bd.remove("exit");
bd.remove("eval");
bd.remove("quit");
String scriptText=readScriptText();
cs = ((Compilable) engine).compile("function foo() {\n"+scriptText+"\n}");
cs.eval();
Map params=readIncomingData();
while(params!=null)
{
Map<String, Object> res = (Map) inv.invokeFunction("foo", params);
writeProcessedData(res);
params=readIncomingData();
}
Теперь нашорн устарел, и я ищу альтернативы. Гуглил несколько дней, но не нашел точного соответствия моим потребностям. Требования:
- Скорость. Там много данных, поэтому все будет очень быстро. Поэтому я также предполагаю, что прекомпиляция обязательна
- Должна работать под linux / openJDK
- Поддержка песочницы как минимум для доступа к данным / выполнения кода
Приятно иметь :
- Простой, c -подобный синтаксис (не lua;)
- Поддержка песочницы для использования процессора
До сих пор я обнаружил, что Rhino еще жив (последний выпуск от 13 января 2020 года), но я не уверен, что он все еще поддерживается и насколько он быстр - насколько я помню, одной из причин, по которой Java перешел на Nashorn, была скорость. И скорость очень важна в моем случае. Также найден J2V8, но linux не поддерживается. GraalVM выглядит немного излишним, также еще не понимал, как использовать его для такой задачи - может быть, нужно еще изучить, подходит ли он для этого, но похоже, что это полная замена jvm и его нельзя использовать в качестве библиотеки.
Не обязательно будет javascript, может быть есть другие альтернативы. Спасибо.