Pamācības

Squirrel skriptu valodas integrācija C++

Squirrel skriptu valodas integrācija C++

Elviss Strazdiņš, 06.02.2010

Lejupielādēt: šeit

Šoreiz uzrakstīju pamācību par skriptu valodu Squirrel. Kāpēc nerakstīju par tādām populārām valodām kā LUA vai Python? Tāpēc, ka, pirmkārt, Squirrel sintakse ir vislīdzīgākā C++, un, otrkārt, ir vairākas tehnsikas lietas, kas man neļauj tos izmantot savos projektos.

Bet nu nedaudz pastāstīšu, kas vispār ir skriptu valodas. Skriptu valoda ir programmēšanas valoda, kas ļauj no "ārpuses" kontrolēt kādu aplikāciju. Parasti skripti tiek atdalīti no aplikācija un netiek kompilēti tajā. Tādā veidā, lai izmainītu aplikācijas funkcionalitāti, jums pietiek tikai pamainīt skriptu un nevajag pārkompilēt aplikāciju. Skriptu aplikācija "ielasa" vai nu kā izejas kodu (source code), vai arī kā baitu kodu (bytecode). Pati Squirrel valoda ir objektorientēta un tās sintakse ir stipri līdzīga C++. Squirrel ir iespējams sakompilēt uz visiem populārākajiem kompilatoriem, tādēļ ceru, ka jums ar šo pamācību nebūs problēmu.

Lai sāktu strādāt ar Squirrel valodu, jums ir jālejupielādē Squirrel bibliotēka, tā jāsakompilē un jāievieto savā programmā. Kad viss ir izdarīts, var sākt programmēt.

Pašā sākumā ievietojam (#include) vajadzīgos failus ir izveidojam Squirrel virtuālo mašīnu.

#include 
#include 
#include 
#include 

#include 
#include 
#include  

using namespace std;

HSQUIRRELVM vm;
vm = sq_open(1024);

Nākošo programmēšanas ērtībai būtu jāizveido kļumju funkcija. Ja notikusi kļūme skripta kompilācijas laikā (parasti tā ir sintakses kļūda), ši funkcija izvadīs paziņojumu, kurā rindiņā un kāda kļume notikusi.

void compilerErrorHandler( HSQUIRRELVM v, const SQChar* err, const SQChar* source, SQInteger line, SQInteger column )
{
	cout<

Kad tas ir izdarīts, lai redzētu rezultātu, mums vajadzētu izveidot print funkciju. Šī funkcija ļaus skriptam uz ekrāna izvadīt tekstu ar print funkciju.

void printFunc(HSQUIRRELVM v,const SQChar *s,...)
{
	va_list arglist; 
	va_start(arglist, s); 
	vprintf(s, arglist); 
	va_end(arglist);
}

Lai abas funkcija darbotos, tās ir jāpiereģistrē. To dara sekojoši:

sq_setprintfunc(vm, printFunc);
sq_setcompilererrorhandler(vm, compilerErrorHandler);

Pēdēja lieta, kas jāizdara, lai redzētu kaut kādu darbību ir izveidot funkciju, kas sakompilē un palaiž lietotāja rakstītu skriptu.

void executeString(HSQUIRRELVM v, string script)
{
	sq_compilebuffer(v, (SQChar*)script.c_str(), (SQInteger)script.length(), "", SQTrue);
	sq_pushroottable(v);
	sq_call(v, 1, SQFalse, SQTrue);
	sq_pop(v, 1);
}

Šī funkcija jau izskatās nedaudz sarežģītāka un prasa nelielus paskaidrojumus. Tātad, sq_compilebuffer funkcija sakompilē doto skriptu un rezultātu saglabā kā funkciju stekā. Lai saprastu, kas ir steks, varat izlasīt piemēram šo. Nākošo mēs stekā ieliekam virtuālās mašīnas adresi un tad izsaucam sq_call, kas palaiž sakompilēto skriptu. sq_pop no steka noņem izsaukuma rezultātu, kas šajā gadījumā mūs neinteresē.

Un visbeidzot, lai notestētu programmu mēs rakstam sekojošu rindiņu.

executeString(vm, "print(\"test\");");

Šajā vietā mēs uz virtuālās māšīnas izsaucam sekojošu rindiņu: print("test");. Jums uz ekrāna būtu jāparādās rindiņai: test.

Programmas beigās jums būtu jāaizver virtuālā mašīna.

sq_close(vm);

Šī bija pirmā daļa pamācībai par Squirrel valodu, nākošajā daļā pastāstīšu sīkāk, kā darbojas Squirrel steks, kā palaist skriptus no ārējiem failiem, kā piedefinēt savas funkcijas un kā tās izsaukt gan no C++, gan no skripta.

Paldies par veltīto uzmanību, uz redzēšanos!

Līdzīgi raksti:

Autorizācija

Lietotājs

Parole


Reģistrēties Aizmirsu paroli