AngelScript (kurz AS) ist eine Skriptsprache, die sich stark an C++ orientiert. Sie wurde speziell als Erweiterung für C- und C++-Programme entworfen und wird hauptsächlich in Computerspielen bzw. deren zugrundeliegenden Engines verwendet. Über die Programmierschnittstelle (API) von AngelScript lassen sich AngelScript-Programme in C++-Programme einbinden. AngelScript ist Open Source, wird unter der freien zlib-Lizenz verteilt und ist zu vielen Betriebssystemen und Compilern kompatibel.
Da AngelScript speziell zur Verwendung mit C++ ausgelegt ist, orientiert es sich stark daran. So unterstützt AngelScript die gleichen elementaren Datentypen (int, bool, …), ist objektorientiert und verwendet eine fast identische Syntax wie C++. Es existieren jedoch auch einige Unterschiede zu C++:
AngelScript-Quelltext wird üblicherweise in .as-Dateien gespeichert. Ein Beispiel für eine einfache .as-Datei zeigt folgender Beispiel-Quelltext.
//Datei "beispiel.as" void main() { //Variablendeklarationen, -initialisationen und -operationen wie in C++ int a = 5; ++a; int b = a + 3; if(b == 9) { /* wurde die Funktion print(string) vorher im C++-Quelltext registriert, * so wird sie jetzt aus AS heraus aufgerufen */ print("Hello world\n"); } }
Eingesetzt wird AngelScript in vielen Computerspielen, unter anderem Amnesia: The Dark Descent, der Penumbra-Reihe, Warsow, Warhammer: Mark of Chaos, SuperTuxKart und vielen weiteren großen und kleinen Projekten.[3]
Die Einbindung in vorhandenen C++-Quelltext geschieht durch „Registrierung“ der C++-Funktionen und -Klassen an der AngelScript-Engine. Folgender Beispielquelltext gibt ein Beispiel zur Registrierung einer Klasse Auto mit seinen Methoden starten() und bremsen().
//Datei beispiel.cpp #include "angelscript.h" class Auto { public: void starten(){}; void bremsen(){}; }; int main() { asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); engine->RegisterObjectType("Auto", 0, asOBJ_REF); engine->RegisterObjectMethod("Auto", "void starten()", asMETHOD(Auto,starten), asCALL_THISCALL); engine->RegisterObjectMethod("Auto", "void bremsen()", asMETHOD(Auto,bremsen), asCALL_THISCALL); return 0; }
Auf ähnliche Weise lassen sich auch globale Funktionen registrieren.
Im unregelmäßigen Abständen erscheinen neue Versionen mit Fehlerbeseitigungen und neuen Funktionen.[4] Da der Quelltext frei zugänglich ist, umfasst die Liste der Entwickler neben dem Hauptprogrammierer viele Freiwillige, die sich an der Entwicklung und Verbesserung der Sprache und der API beteiligt haben.