2009-07-21 4 views
14

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

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

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

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

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

+0

Просто быть любопытным: Можете ли вы сказать что-то о своей мотивации? Встраиваете ли вы другой язык для другого (лучше, проще, ...) синтаксиса (поскольку существуют встраиваемые интерпретаторы, которые используют именно C в качестве своего языка)? Или это связано с тем, что для вашего приложения есть какой-то программный интерфейс без перекомпиляции? Или это для настройки конечного пользователя ...? – ThomasH

+0

Это логика игры, в основном диалог и квесты для ролевой игры, которую я сейчас планирую. –

ответ

7

Вот документ с веб-сайта Python для встраивания Python 2.6 ...

http://docs.python.org/extending/embedding.html

+3

Я нашел, что интеграция с Python очень проста в использовании, FWIW. Я смог создать что-то полезное и работающее (включая вызов пользовательских подпрограмм в моем C-коде) через полдня. – Joe

+3

Мой опыт встраивания языков сценариев в C включает только Perl, Python, Lua и Tcl. Что касается кривой обучения (время от нуля до рабочей программы), я бы дал Lua 1, Tcl a 2, Python a 5 и Perl - 359 000. Но затем я работал с Lua и Tcl после работы с Python, тогда как я изучил вложение Python, зная только Perl, поэтому мой опыт, возможно, сделал как Lua, так и Tcl более легкими, чем они есть. Но я согласен с Джо - для Python требуется около полудня, а около 20 минут - с Lua. Lua очень легко внедрить. –

+3

Я принимаю это выше всех «Используйте Lua!» потому что я могу убить двух птиц одним камнем (я все равно хотел узнать Python) и потому, что он работает. Дорогой Анонимный читатель, который пришел к этому вопросу от Google: прочел все остальные ответы, они все отлично. –

17

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

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

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

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

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

+1

Я использовал Lua для этого, и это очень хорошо. Он предназначен для встраивания в другие системы. Разумеется, согласны с массивами на основе 1; у каждого языка есть свои небольшие фрагменты Braindamage, и это один из Lua's, но он совместим. –

3

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

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

1

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

Как сказал Lua предназначен для этого вложения, используя интерпретатор можно выставить объекты на сценарий и вызова Lua функции из C, поиск вложения Lua в С и вы должны найти много информации, а также Дон 't пропустить раздел руководства lua "The Application Programming Interface"

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

16

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

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

3

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

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

2

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

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

8

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

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

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

typedef struct my_object *Object; 
Object some_object; 

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

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

  • Функции вызова, которые фактически знают, что находится внутри struct my_object.

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

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

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

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

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

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

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

Смежные вопросы