SB ScriptBasic Általános Architektúra Peter Verhás Február 2002
SB Tartalom Fordítás, értelmezés általában ScriptBasic „fordító” felépítés, modulok Megfontolások, miért?
SB Hogyan fut le egy program? Fordítás vagy értelmezés a két véglet Kevert megoldások –Közbülső kódra fordít és értelmez (PASCAL p-code) –JIT fordítók közbülső kódról (Java,.NET)
SB A fordítás lépései Beolvasás Lexikális elemzés Szintaxis elemzés Közbülső kód generálás Optimalizálás Kód generálás Szerkesztés (link) –Szerkesztési optimalizálás Futtatás Futtatási modulok betöltése
SB Az értelmező lehetséges lépései Beolvasás –Értelmezés (benne tokenizálás, szintaxis elemzés) vagy Tokenizálás –Értelmezés (benne szintaxis elemzés) vagy Szintaxis elemzés és kódépítés Értelmezés
SB A három fő lépés Beolvasás Lexikális elemzés Szintaxis elemzés / kód építés Egybeintegráltan, pipe-line, „egyszerre” futnak, vagy Külön modul mindegyik Történelmi okok, memória ára, mérete, program források mérete...
SB Beolvasó Honnan olvas –Fájl –Adatbázis –Szabványos bemenet –TCP/IP socket –Másik szál által generált bájt sor Eredménye a beolvasott szöveg
SB Lexikális elemző Lehet reguláris kifejezés alapú, vagy Speciálisan adott célnak megfelelően megírt –előnyök, hátrányok Eredménye egy token sor Token: token ID attribútumokkal
SB Szintaxis elemző Táblázat vezérelt, vagy Speciálisan megírt –Előnyök hátrányok Milyen típusú nyelvet valósít meg? –LL(1), LR(1) –Compilers: principles, techniques and tools Aho, Setti, Ullman –Lex & Yacc Levine, Mason, Brown. O'Reilly, 1994 Eredménye szintaxis struktúra
SB Irodalom
SB Perl felépítés Beolvasás Tokenizálás, szintaxis elemzés, kód építés, közben futtatás (BEGIN blokk) Futtatás és ebben esetleg Újabb beolvasás stb.
SB XLISP rendszer Beolvasás Tokenizálás Szintaxis? A LISP-et nem kell elemezni!?!?!
SB ScriptBasic felépítés Beolvasó Tokenizáló Szintaxis elemző Építő Végrehajtó egymás után, külön modulokban, memóriában felépítve minden közbülső eredményt
SB Mi egy modul? Egy osztály, függvény csoport A globális adatok egy typedef struktúrába gyűjtve Többszálas
SB READER Beolvassa a teljes forrás programot a memóriába Láncolt listát hoz belőle létre Kezeli az include és import direktívákat reader.c
SB Beolvasó struktúra typedef struct _SourceLine { char *line; long lLineNumber; long LineLength; char *szFileName; struct _SourceLine *next; } SourceLine, *pSourceLine;
SB LEXER Speciálisan C-ben megírt (nem Lex) Eredmény: token lista Tábla definiálja a –szimbólumokat –Operátorokat, beépített függvényeket, kulcsszavakat Folytató sorok kezelése is itt történik lexer.c
SB Lexer struktúra typedef struct _Lexeme { enum LexemeType type; // type of the lexeme union { double dValue; // double value long lValue; // long value char *sValue; // string or symbol value } value; long sLen; //length of string or symbol char *szFileName; // where the lexeme is long lLineNumber; // where the lexeme is struct _Lexeme *next; // link to the next lexeme }Lexeme, *pLexeme;
SB Szintaxis analízis A token listából dolgozik Összetett, darabokból álló memória struktúrát készít (eNODE) Tábla definiálja –Parancsok szintaxisát –Unáris és bináris operátorokat –Beépített függvényeket –A kifejezések szintaktikájka a szokásos, „hard-coded” expression.c
SB Szintaxis eNODE struktúra typedef struct _eNODE { long OpCode; // the code of operation unsigned long NodeId; // the id of the node char *szFileName;// where the lexeme is long lLineNumber;// from which this syntax node is made union { // when the node is a command struct { union { struct _SymbolLABEL *pLabel; struct _eNODE *pNode; struct _eNODE_l *pNodeList; long lLongValue; double dDoubleValue; char *szStringValue; }Argument; long sLen; struct _eNODE *next; }CommandArgument; // when the node is an operation struct { struct _eNODE_l *Argument; }Arguments; // when the node is a constant struct { union { double dValue; long lValue; char *sValue; }Value; long sLen; //the length of the string constant }Constant; // when the node is a variable struct { unsigned long Serial; // the serial number of the variable }Variable; // when node is a user functions struct { pSymbolUF pFunction; // pointer to the function struct _eNODE_l *Argument; }UserFunction; }Parameter; } eNODE,*peNODE; Egy kicsit bonyolult, később részletesen megnézzük.
SB „Kód generátor” Feldolgozza az összepointerezett memória struktúrát Egy egyszerűsített, egybefüggő memóriaterületen levő, relatív pointereket használó kód. Ez a végső futtatható kód. Függvény SAVE és LOAD. builder.c
SB Builder cNODE struktúra Ha ha ha !
SB Végrehajtás A felépített kódot kapja meg, és végrehajtja Memóriát allokál a változóknak Kezeli a lokális változókat Kezeli a hiba helyzeteket,... execute.c
SB Segéd Modulok Memória kezelő modul ( myalloc.c ) Változó kezelő modul ( memory.c ) Külső modulokat kezelő modul ( modumana.c ) Szimbólum tábla kezelő modul ( sym.c )
SB Miért ez az architektúra? Fordíthatóság Gyors futtathatóság Programozó védelme
SB Fordíthatóság Legyen a nyelv fordítható –Ellenpélda: Perl BEGIN { print "almaAAA\n"; } zagyvavvavv "
SB Gyors futtathatóság A kód legyen újrafelhasználható –Nagyon fontos CGI scripteknél Szimbolikus információ nincs futási időben –Sebesség (n-edik változó elérése, vagy mindig keressük meg név szerint?)
SB Programozó védelme Szimbolikus információ nincs futási időben –Intellectual property protection –A felhasználó megvédése önmagától esetenként
SB Hátrányok Nincs futási időben változó név Nincs szimbolikus referencia Nincs eval ”” Nehezebb debuggert írni
SB Köszönöm a figyelmet.