300 likes | 374 Views
ScriptBasic Általános Architektúra. Peter Verh á s Február 2002. Tartalom. Fordítás, értelmezés általában ScriptBasic „fordító” felépítés, modulok Megfontolások, miért?. Hogyan fut le egy program?. Fordítás vagy értelmezés a két véglet Kevert megoldások
E N D
ScriptBasic Általános Architektúra Peter Verhás Február 2002
Tartalom • Fordítás, értelmezés általában • ScriptBasic „fordító” felépítés, modulok • Megfontolások, miért?
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)
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
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
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...
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
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
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
Irodalom http://compilers.iecc.com/crenshaw/ http://accent.compilertools.net/tutorial.html http://www.acm.org/crossroads/xrds7-5/bison.html
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.
XLISP rendszer • Beolvasás • Tokenizálás • Szintaxis? A LISP-et nem kell elemezni!?!?!
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
Mi egy modul? • Egy osztály, függvény csoport • A globális adatok egy typedefstruktúrába gyűjtve • Többszálas
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
Beolvasó struktúra typedef struct _SourceLine { char *line; long lLineNumber; long LineLength; char *szFileName; struct _SourceLine *next; } SourceLine, *pSourceLine;
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
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;
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
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.
„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
BuildercNODE struktúra • Ha ha ha !
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
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)
Miért ez az architektúra? • Fordíthatóság • Gyors futtathatóság • Programozó védelme
Fordíthatóság • Legyen a nyelv fordítható • Ellenpélda: Perl BEGIN { print "almaAAA\n"; } zagyvavvavv "
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?)
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
Hátrányok • Nincs futási időben változó név • Nincs szimbolikus referencia • Nincs eval ”” • Nehezebb debuggert írni