Блог программиста

AngelScript

Что такое AngelScript? Это интерпретируемый язык программирования для использования в качестве скриптового языка в своих приложениях.

Программа «Hello, world» на этом языке выглядит так:

void main()
{
	print("Hello, world!\n");
}

Очень сильно напоминает язык Си. Научимся использовать AngelScript в своих проектах.

Установка AngelScript

По своей сути, AngelScript является библиотекой скриптов и не позволяет скриптам выполняться самим по себе. А раз он является библиотекой, качаем архив со странички http://www.angelcode.com/angelscript/downloads.html и распаковываем в папку C:\projects\lib. Путь должен выглядеть примерно так: C:\projects\lib\angelscript\sdk.

Теперь сам AngelScript необходимо скомпилировать. Заходим в папку C:\projects\lib\angelscript\sdk\angelscript\projects и находим проект под соответствующую IDE. Я использую Visual Studio. После компиляции в папке C:\projects\lib\angelscript\sdk\angelscript\lib должен появиться файл angelscriptd.lib.

Создаём консольное приложение в Visual Studio и вставляем следующий код:

#include <angelscript.h>
#include <scriptstdstring/scriptstdstring.h>
#include <scriptbuilder/scriptbuilder.h>

#pragma comment (lib, "angelscriptd.lib")

int main()
{
	// Создаём объект движка скрипта
	asIScriptEngine *engine = asCreateScriptEngine();

    return 0;
}

В настройках проекта для инклудов прописываем пути:

C:\projects\lib\angelscript\sdk\angelscript\include;C:\projects\lib\angelscript\sdk\add_on;

для библиотек:

C:\projects\lib\angelscript\sdk\angelscript\lib

Компилируем. Если всё ОК, установка на этом завершена.

Используем свой враппер AS_WRAP

Функции API для встраивания AngelScript в программу на C++ слишком сложные, не прозрачные. Поэтому пришлось написать для этого дела свой враппер AS_WRAP. Работать с моим враппером очень просто (исходники на гитхабе: as_wrap).

	AngelScript as;

	as.regCppFunc("void print(const string &in)", asFUNCTION(print), asCALL_CDECL);
	AngelScriptModule *mod = as.newModule("test_module", "test.as");
	AngelScriptFunc *func = mod->getFunc("void main()");
	as.exec(func);

Рассмотрим как работает этот код.

Класс AngelScript содержит метод regCppFunc, которым регистрируем свою С++ функцию для последующего вызова её из AngelScript. Далее создаём модуль "test_module" из файла "test.as" с AngelScript скриптом, с помощью получаем из этого модуля функцию и выполняем её.

Как Вы уже поняли, нужно прописать в С++ коде фукнцию print:

void print(const string &s) {
	cout << s;
}

а также создать в папке проекта файл test.as со следующим кодом:

void main() {
	print("Hello, world!\n");
}

Запускаем - работает!

Мне понравилось использовать AngelScript, но есть и существенные минусы: сложность встраивания в С++ и у AngelScript практически нет сообщества.


Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Наши проекты
Контакты