Какие языки генерируют байт-коды и могут быть загружены / выполнены в C ++ - PullRequest
2 голосов
/ 17 января 2012

Я хотел бы знать, какие языки подходят для этого сценария:

Я пишу приложение (C ++) и мне нужно добавить в него некоторую поддержку сценариев, но этот язык должен уметьбыть "скомпилированным".

Эта компиляция генерирует некоторый тип "байт-кода", который не читается людьми.Затем мне нужно иметь возможность получить этот байт-код, загрузить его в приложение C ++ и выполнить его.

Экспорт функций приложения c ++ в сценарий и обратный вызов функций сценария является обязательным.

Основная идея заключается в расширении функциональности приложения, не затрагивая код C ++, но пользователю должно быть трудно читать эти сценарии.

Какие языки можно использовать?

Ответы [ 5 ]

4 голосов
/ 17 января 2012

Возможно, Brainfuck? Конечно, легко найти интерпретаторы и гораздо менее читабельны, чем ваш обычный машинный код или байтовый код.

1 голос
/ 21 июня 2016

LuaJIT - это хороший, быстрый интерпретатор Lua, который превращает Lua в собственный машинный код. Байт-код LuaJIT не зависит от платформы, в отличие от обычного Lua.

Взгляните на себя: http://luajit.org/luajit.html http://luajit.org/extensions.html

1 голос
/ 17 января 2012

Может быть Vox * может соответствовать вашему счету?

Скрипты могут быть предварительно скомпилированы в переносимый байт-код, и их очень легко внедрить, используя API на основе стека, подобный Lua:

// most basic embedding example
VoxVM* v = vox_open(1024);
vox_aux_seterrorhandlers(v);
vox_pushroottable();
vox_dofile(v, "somescript.vx", false, true);
vox_pop(v, 1);
vox_close(v);

Для более полнофункционального примера см. etc / minimal.cpp и src / frontend / frontend.cpp


* Vox isпроект, над которым я работаю, чтобы заменить Lua в личных целях.Он основан на сильно модифицированной версии виртуальной машины squirrel3 (но не больше не совместим с белкой!).

Синтаксис также немного изменился: вместо использования <- дляновые слоты, он использует :=, чтобы избежать неоднозначного синтаксиса.

Ядро закончено и готово для использования во встроенных проектах, но stdlib все еще не завершен, так как Vox - очень молодой проект (из-за этогодокументация в настоящее время отсутствует, но stdlib является хорошим примером для встроенного программирования, а также примеров для сценариев общего назначения).

1 голос
/ 17 января 2012

Я бы предложил вам использовать LLVM . Промежуточное представление LLVM может быть сохранено в формате байт-кода. Вам нужно будет использовать существующий интерфейс для языка сценариев или разработать свой собственный интерфейс. Ваше приложение C ++ может загрузить файл байт-кода и JIT его. Здесь - список существующих проектов, основанных на LLVM. Вы можете найти там решение, которое соответствует вашим потребностям.

1 голос
/ 17 января 2012

Я хотел бы предложить ChaiScript , но у нас нет встроенной поддержки шифрования или байт-кода.

Тем не менее, нет причин, по которым вы не могли бы использовать какой-либо из существующих скриптов C ++. Можно использовать ChaiScript, luabind и т. Д., Если вы предоставите свои собственные функции шифрования и дешифрования для подачи сценария в движок.

Единственный известный мне скрипт-движок, который поддерживает c ++ и байт-код и относительно неясен, - AngelScript . У них есть страница о загрузке предварительно скомпилированного байт-кода .

...