Многие люди, пишущие игровые программы и другие приложения, встраивают язык в приложение, чтобы позволить пользователям писать небольшие программы.
Насколько я могу судить, наиболее популярными встроенными языками в очень грубо-популярном порядке первого порядка (хотя "более популярный" не обязательно означает "лучше"), кажется:
- предметно-ориентированный язык, разработанный специально для этого конкретного приложения и нигде не используемый
- Lua a
- Tcl
- Python a b , часто упрощенное подмножество, например PyMite c
- Forth
- JavaScript a
- Лисп
- AngelScript a
- XPL0 a b
- Белка a
- Haskell a b
- NPCI (Nano Pseudo C Interpreted) a
- RoboTalk
- интерпретация некоторого аппаратного машинного языка (почему это наименее популярный выбор? По уважительным причинам, описанным ниже).
Возможно, вы захотите проверить Gamedev StackExchange, в частности такие вопросы, как «Как добавить язык сценариев в игру?» .
Вы можете проверить некоторые вопросы здесь, в StackOverflow с тегом «встроенный язык» ;
такие как
«Выбор встроенного языка» ,
«Какой хороший встраиваемый язык я могу использовать для сценариев внутри моего программного обеспечения?»
«Альтернативы Lua как встроенному языку?»
«Какой язык сценариев игры лучше использовать: Lua или Python?» ,
и т.д.
Многие реализации этих языков используют какие-то
байт-код внутри.
Часто две разные реализации одного и того же языка программирования высокого уровня, такого как JavaScript, используют два совершенно разных языка байт-кода ( a ).
Часто несколько языков программирования высокого уровня компилируются с одним и тем же базовым языком байт-кода - например, реализация Python в Jython, реализация JavaScript в Rhino, реализация Tcl в Jac, JScheme и несколько других реализаций Scheme и несколько реализаций Pascal; все компилируются в один и тот же байт-код JVM.
подробности
Зачем использовать язык сценариев, а не интерпретировать какой-либо аппаратный машинный язык?
Почему "Альтернативные жесткие и мягкие слои" ?
Чтобы получить простоту и более быстрое развитие.
ускоренная разработка
Люди обычно работают быстрее с языками сценариев, а не скомпилированными языками.
Начало работы с первоначальным прототипом, как правило, происходит намного быстрее - интерпретатор обрабатывает закулисные вещи, которые машинный язык вынуждает вас явно записывать: установка начальных значений переменных на ноль, подпрограмма-пролог и подпрограмма -epilog код, malloc и realloc и свободное и связанное с ним управление памятью, увеличение размера контейнеров при их заполнении и т. д.
Если у вас есть первоначальный прототип, добавление новых функций происходит быстрее: языки сценариев имеют быстрые циклы редактирования-выполнения-отладки, поскольку они избегают этапа «компиляции» циклов редактирования-компиляции-выполнения-отладки скомпилированных языков. *
простота
Мы хотим, чтобы язык встроенного языка был «простым» двумя способами:
Если пользователь хочет написать небольшой код, который выполняет некоторую концептуально тривиальную задачу, мы не хотим пугать этого человека сложным языком, который требует 20 фунтов книг и месяцев обучения, чтобы написать «Привет, $ USER» без переполнения буфера.
Поскольку мы реализуем язык, мы хотим реализовать что-то простое. Возможно, несколько простых базовых инструкций, для которых мы можем выбить простой интерпретатор на выходных, и, возможно, какой-то уже существующий компилятор, который мы сможем использовать с минимальной настройкой.
Когда люди строят ЦП, аппаратные ограничения всегда заканчиваются ограничением набора команд.
Многие концептуально «простые» операции - вещи, которые люди используют постоянно -
в конечном итоге потребуется много инструкций на машинном языке для реализации.
Встроенные языки не имеют этих аппаратных ограничений, что позволяет нам внедрять
более сложные «инструкции», которые делают вещи, которые (человеку) кажутся концептуально простыми.
Это часто упрощает систему обоими способами, упомянутыми выше:
Люди, пишущие напрямую на языке (или люди, пишущие компиляторы для языка), заканчивают тем, что пишут гораздо меньше кода, тратят меньше времени на пошаговое выполнение кода и его отладку и т. Д.
Для каждой такой высокоуровневой операции мы переносим сложность с компилятора на реализацию инструкции внутри интерпретатора. Вместо того, чтобы (вы пишете код), компилятор разбивает некоторую высокоуровневую операцию на короткий цикл на промежуточном языке (и многократно повторяет этот цикл в вашем интерпретаторе во время выполнения), компилятор выдает одну инструкцию на промежуточном языке (и вы написать ту же серию операций в реализации этой промежуточной «инструкции» вашего интерпретатора). Со всеми компонентами, интенсивно использующими процессор, реализованными на вашем скомпилированном языке («внутренние» сложные инструкции), чрезвычайно простые интерпретаторы часто более чем достаточно быстры. (То есть вы избегаете тратить много времени на создание JIT или на попытки ускорить процесс другими способами).
По этим и другим причинам многие программисты игр используют язык сценариев в качестве своего "встроенного языка".
(теперь я вижу, что Хавьер уже рекомендовал «использовать встроенный язык сценариев»,
так что это превратилось в долгую разглагольствование на , почему это хорошая альтернатива для интерпретации аппаратного машинного языка и указания альтернатив, когда один конкретный язык сценариев не кажется подходящим).