Что такое хороший встраиваемый язык для существующего Java-приложения?
Я хочу встроить dsl или существующий полный язык в свое приложение. Это должен быть простой, полный язык Тьюринга, но простой и достаточно легкий, чтобы код можно было интерпретировать без особых накладных расходов.
Также другие "процессы" не могут влиять на другие процессы.
Я подумывал об использовании Clojure и вызове интерпретатора / компилятора времени выполнения Clojure для кода Clojure, но время выполнения Clojure занимает намного больше времени, чем мне нужно. Кроме того, я не слишком рад использовать язык Clojure для этого проекта. Я думал более процедурным и C-like.
Я рассмотрел язык ила Олы Бини. http://ioke.org/index.html
Кроме того, я подумал о написании DSL на Scala? Или используя существующий DSL.
Обновлено: похоже, Rhino - хороший пример встроенного языка.
6 ответов
Динамическая природа Groovy идеально подходит для написания DSL. Действительно, существует большое количество Groovy DSL, реализованных веб-инфраструктурой Grails, и множество учебных пособий и книг, которые учат, как писать DSL с помощью Groovy.
Кроме того, синтаксис Groovy является почти расширенным набором Java, поэтому его следует относительно легко подобрать (по сравнению с Clojure). Вызов между Java и Groovy-кодом происходит без проблем, поэтому вы можете легко использовать все ваши любимые JDK-классы в Groovy-коде.
Я был бы склонен избегать IOKE из-за его незрелости, и для целей DSL я думаю, что динамически типизированный язык, такой как Groovy или JavaScript, является лучшим выбором, чем Scala.
Как насчет JavaScript?
http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html
Он встроен в Java 6.
Проверьте https://scripting.dev.java.net/ для списка Механизмов Сценария для встраивания других языков в Ваши приложения Java. Обратите внимание, что некоторые из указанных языков теперь поставляются с собственной интеграцией JSR 223, поэтому нет необходимости использовать стороннюю библиотеку.
Я предлагаю Java. Это: хорошо известный, быстрый, легко интегрируемый с Java, стабильный, статически типизированный, легко переносимый код и т. Д., И т. Д.
Если вы хотите использовать DSL, вы не хотите встраивать существующий язык, вы хотите создать "язык, специфичный для домена". Для меня это значит гораздо больше, чем просто изменить некоторые ключевые слова и не использовать скобки.
Например, сейчас я работаю над ТВ-планированием прямо сейчас. Когда мы создаем фальшивые справочные данные для теста, мы всегда добавляем комментарий, который выглядит следующим образом (вырезано прямо из теста, над которым я работаю):
* TIME:8.....30....9.....30....10....30....11....30....12....30....
* 4FOX:____________[Spotlight.............][Jeopardy..]____________
* 6CBS:[Heroes....][Heroes....][Heroes....]________________________
* 8HMK:xx[A.River.Runs.Through.It....][Blades.Of.Glory...]_________
Если мне потребуется создать дополнительные данные для руководства, я напрямую интерпретирую эти комментарии как DSL (делая их длинной строкой или массивом строк вместо комментариев).
Это было бы подходящим DSL.
Если вы только что внедрили гибкий язык, Groovy или JRuby созданы для этого, как и BeanShell.
На самом деле, существует целый API, построенный на сменных языках сценариев для подключаемых модулей, так что вы сможете использовать любой язык JVM, какой захотите, и не менять свой код немного.
Небольшой интерпретатор BrainF*ck должен подойти в соответствии с вашими требованиями:)
Если это не совсем то, что вы имели в виду, подумайте, что вы хотите решить. Какое у вас тематическое исследование? Можно ли позже добавить новый код по своему усмотрению без необходимости повторного развертывания новой версии вашего приложения?