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

У меня есть приложение C, и я хочу включить язык сценариев, чтобы добавить определенные функции в скрипты. У меня просто нет опыта с этим и не знаю, с чего начать (все еще изучая C и пытаясь понять приложение).

Как работает вложение и связь между моим приложением и скриптами? Я думаю, мне нужен интерпретатор для языка сценариев как библиотека (DLL в Windows или исходный код C, который может быть скомпилирован в мое приложение)? И тогда я могу сделать что-то вроде

interpreter->run("myscript", some_object);

Как узнать script о свойствах объекта? Скажем, мой script хочет прочитать или изменить some_object- > some_field?

Существуют ли языки сценариев, оптимизированные для такого рода вложений? Я знаю, что есть Lua, который популярен в игровом деве, и языки, такие как Python, Perl, PHP или Ruby, которые кажутся более ориентированными в качестве автономных приложений, но мои знания в глубокой архитектуре не позволяют более образованных догадок:) (Tagged Lua и Python, потому что они будут моими фаворитами, но пока они работают на x86 Windows, Linux и Mac OS X, я открыт для других языков сценариев, если их легко внедрить в приложение C)

Ответы

Ответ 2

Lua. Он имеет очень небольшую площадь, довольно быстро, и я нашел (субъективно), чтобы иметь самый приятный API для взаимодействия с C.

Если вы хотите коснуться объектов Lua от C - это довольно просто, используя встроенные API. Если вы хотите коснуться данных C от Lua - это немного больше работы, обычно вам нужно будет сделать методы-оболочки, чтобы показать, что вы хотите разрешить Lua.

Малая база кода и жесткий контроль над количеством библиотек по умолчанию, введенных в ваш встроенный интерпретатор, также означают, что вы можете сделать разумные предположения по безопасности.

Единственная нечетная часть - это нумерация массива на основе 1, однако она не была такой большой по сравнению с тем, что я думал, учитывая существование итераторов.

Как интегрироваться с C: в дистрибутиве tarball для Lua есть каталог "и т.д." с несколькими очень хорошими полезными примерами, которые должны быстро начать работу. В частности - etc/min.c показывает, как запустить интерпретатор, заставить его интерпретировать файл и заставить его вызвать функцию C (в этом случае "печать" ). Оттуда вы можете ознакомиться с документацией Lua и источником стандартных библиотек, включенных в дистрибутив.

Ответ 3

Некоторые полезные ссылки:

Я знаком с Python. Python - очень богатый язык и имеет огромное количество доступных библиотек.

Ответ 4

Lua полностью оптимизирован именно для такого рода вложений. Хорошей отправной точкой является Роберто Ierusalimschy книги Программирование в Lua; вы можете получить предыдущую версию бесплатно онлайн.

Как ваш script знает о свойствах вашего объекта C?

Представьте себе, что ваш объект определен следующим образом:

typedef struct my_object *Object;
Object some_object;

Что ваш код C знает о свойствах этого объекта? Почти ничего, это что. Все, что вы можете сделать, это

  • Пропустите указатели на объект, поместите их в структуры данных и т.д.

  • Функции вызова, которые действительно знают, что внутри struct my_object.

Lua получает доступ к объектам C точно так же: косвенно через функции:

  • Вы вызываете вызовы API, чтобы поместить указатель на объект в стек Lua, из которого он может попасть в структуры данных Lua, переменные или где-либо еще в юниверсе Lua.

  • Вы определяете функции, которые знакомы с внутренними объектами, и экспортируете эти функции в Lua.

  • В "вспомогательной библиотеке" есть много вещей, которые помогут вам. Не забывайте об этом!

Все это объясняется ясностью кристалла в третьей части книги Роберто, в которую включены примеры. Одна тонкая точка

  • У вас есть выбор выделения памяти самостоятельно ( "легкие пользовательские данные" ) или выделение памяти Lua. Как правило, лучше выделять память Lua, потому что она может автоматически освобождать объект, когда он больше не нужен, и вы также можете связать Lua metatable, что позволяет вам (среди других трюков) позволить объекту участвовать в стандартных операциях Lua как поисковые поля, а не только вызовы функций.

Последнее замечание: хотя можно использовать SWIG или toLua или другие инструменты, чтобы попытаться сгенерировать код для подключения C и Lua, я настоятельно призываю вас написать код самостоятельно, вручную. На самом деле это довольно просто, и это единственный способ понять, что происходит на самом деле.

Ответ 5

Lua разработан именно для этой цели и довольно прост в работе.

Еще одна вещь, на которую стоит обратить внимание, - QtScript, основанный на Javascript, хотя это потребует некоторой работы для "qt-ify" ваше приложение.

Ответ 6

Вы также можете взглянуть на SWIG, упрощенную упаковку и генератор интерфейсов. Как можно было бы предположить, он генерирует большую часть кода плиты котла, чтобы связать ваш код C/С++ с механизмом сценариев (который может быть довольно громоздким для выполнения вручную).

Он поддерживает Python и Lua (ваши предпочтения) и многие другие языки. Очень легко создать модуль, расширяющий язык сценариев. Расширение вложений и, что вам нужно, требует немного больших усилий.

Ответ 7

Вы можете взглянуть на Мастерство игры в скриптинге. Поскольку я заинтересован в высоком уровне аспект компьютерных игр, а эта книга была рекомендована мне очень часто.

К сожалению, книга, похоже, не печатается (по крайней мере, в Европе).

Ответ 8

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

Как сказал Lua для этой цели, с использованием интерпретатора вы можете подвергать объекты script и вызывать функции lua из C, искать вложение lua в C, и вы должны найти много информации, также не пропустите раздел руководства lua Интерфейс прикладного программирования

Хотя Python более подходит для автономного использования, он также может быть встроен, он может быть полезен, если ваши скрипты используют библиотеки огромного объема, поставляемые с Python.