Kompilatorteknik Görel Hedin Datavetenskap Lunds Tekniska Högskola Temaföreläsning, Datorer i system, 2010
Vad är en kompilator? programkod while (a >= 0) { kompilator maskinkod 0024 6050 2530 0000 0000 0010 Kompilatorn översätter från ett högnivåspråk (lämpligt för människor att programmera i) till ett lågnivåspråk (lämpligt för maskiner att exekvera).
Typiska steg i en kompilator kompilator while (a >= 0) { scanning parsing namnanalys typanalys kodgenerering kodoptimering instruktionsval registerallokering 0024 6050 2530 0000 0000 0010
Run=me- system while (a >= 0) { kompilator 0024 6050 2530 0000 0000 0010 standardbibliotek stack heap garbage collector virtuell maskin interpretator runtime-system
Kompilatorteknik while (a >= 0) { kompilator 0024 6050 2530 0000 0000 0010 runtime-system Kompilatorteknik handlar om design, teori och algoritmer som används i kompilatorer och runtime-system.
Kompilatorer använder kompilatorteknik. Många andra verktyg också! compilers integrated editors debuggers source-to-source translators source code analyzers bug finders reverse engineering tools testing tools
högnivåspråk while (a >= 0) { kompilator lågnivåspråk 0024 6050 2530 0000 0000 0010 Några exempel på högnivåspråk
// The classic Hello World program public class HelloWorld { public static void main(string[] args) { System.out.println("Hello, World!");
// The classic Hello World program object HelloWorld { def main(args: Array[String]) { println("hello, world!") Scala
"The classic Hello World program" Transcript show: 'Hello, world!'. Smalltalk
// The classic Hello World program #include <stdio.h> main() { printf ("Hello World!\n");
Kompilatorteknik används för programmeringsspråk. Men för många andra formella språk också!
model HelloWorld "A differential equation Real x(start=1); equation der(x) = - x; end HelloWorld; Modelica A language for modeling and simulating physical systems.
<?xml version="1.0"?> <hello- world> <greeter>a Programmer</greeter> <greeting>hello, World!</greeting> </hello- world> XML extensible Markup Language
Formella språk Designa eg formellt språk mycket vanligt i datavetenskap OJa för ag automa=sera eg systema=skt beteende Svårt ag implementera kompilatorer för hand Rimligt läg med kompilatorteknikverktyg (compiler- compilers)
Typiska steg i en kompilator kompilator while (a >= 0) { scanning parsing namnanalys typanalys kodgenerering kodoptimering instruktionsval registerallokering 0024 6050 2530 0000 0000 0010
Programrepresenta=oner while (a1 >= 0) { text scanning while ( a1 >= tokens parsing While Ge Stmt a1 0 syntaxträd Ge a1 0 While Stmt programmodell kodgenerering L1: LD a1 R1 LD 0 R2 BLT L2 BR L1 L2: mellankod optimering 0024 6050 2530 0000 0000 0010 maskinkod
Scanning while WHILE while (a1 >= 0) { scanning ( a1 >= tokens LPAREN ID GE Tillståndsmaskiner w h i l e WHILE A-Z, a-z A-Z, a-z, 0-9 ID
Scanner- generering WHILE = [ w ] [ h ] [ i ] [ l ] [ e ] LPAREN = [ ( ] ID = [ A-Z, a-z ] [ A-Z, a-z, 0-9 ]* scannerspecifikation (reguljära uttryck) scannergenerator while (a1 >= 0) { program scanner while ( a1 >= tokens
Parsing while ( a1 >= tokens parsing While Ge Stmt a1 0 syntaxträd Stmt ::= While Assign While ::= WHILE LPAREN Expr RPAREN Stmt Expr ::= Eq Ge ID INT Ge ::= Expr GE Expr parserspecifikation (kontext-fri grammatik)
Parsergenerering Stmt ::= While Assign While ::= WHILE LPAREN Expr RPAREN Stmt Expr ::= Eq Ge ID INT Ge ::= Expr GE Expr parserspecifikation (kontext-fri grammatik) while ( a1 >= tokens parsergenerator parser While Ge Stmt a1 0 syntaxträd
Scanner och parser- generatorer De klassiska UNIX- verktygen från Bell Labs (70- talet) Lex: a Lexical Analyzer Generator Yacc: Yet Another Compiler Compiler Några andra populära: Flex & Bison (GNU s version av Lex och Yacc) ANTLR, CUP, JavaCC,
Programrepresenta=oner while (a1 >= 0) { text scanning while ( a1 >= tokens parsing While Ge Stmt a1 0 syntaxträd Ge a1 0 While Stmt programmodell kodgenerering L1: LD a1 R1 LD 0 R2 BLT L2 BR L1 L2: mellankod optimering 0024 6050 2530 0000 0000 0010 maskinkod
Programanalys Beräkna egenskaper hos programelement Decl While Ge bool Stmt int a1 0 int Namnanalys: Vilken användning hör ihop med vilken deklaration? Typanalys: Vilken typ har varje uttryck? Är typerna korrekta? Kontrollflödesanalys: I vilken ordning kan satserna exekveras? Dataflödesanalys: Hur beror variabler och tilldelningar på varandra?
Generera hela kompilatorn (forskningsprojekt JastAdd) Scanner-spec scannergenerator scanner Parser-spec parsergenerator parser Namnanalys Kompilator Typanalys JastAdd analysator Kodgenerering
Programrepresenta=oner while (a1 >= 0) { text scanning while ( a1 >= tokens parsing While Ge Stmt a1 0 syntaxträd Ge a1 0 While Stmt programmodell kodgenerering L1: LD a1 R1 LD 0 R2 BLT L2 BR L1 L2: mellankod optimering 0024 6050 2530 0000 0000 0010 maskinkod
Kodgenerering Decl While bool Ge Stmt int int a1 0 L1: LD a1 R1 LD 0 R2 BLT L2 BR L1 L2:... Access av variabler: LOAD Tilldelning: STORE Räkna: ADD, SUB, Kontrollstrukturer: LABELS, BRANCHES Men hur skall minnet hanteras? Och objekt, klasser, metoder,?
Run=me- system Primärminnet PC Info om klasser Kod för metoder PC Program counter Sta=sk informa=on SP Dynamisk informa=on Stack av ak=veringsposter (metodinstanser) SP Stack Pointer. Första lediga platsen i stacken. HP Heap av objekt (klassinstanser) HP Heap pointer. Första lediga platsen i heapen. Garbage collec=on
Programrepresenta=oner while (a1 >= 0) { text scanning while ( a1 >= tokens parsing While Ge Stmt a1 0 syntaxträd Ge a1 0 While Stmt programmodell kodgenerering L1: LD a1 R1 LD 0 R2 BLT L2 BR L1 L2: mellankod optimering 0024 6050 2530 0000 0000 0010 maskinkod
Op=mering, exempel while () { a = 1; a = 1; while () { Loop invariant code motion a = (b*c)+(b*c)/2 t = b*c a = t+t/2 Common subexpression elimination a = min(x, y); Inlining if (x < y) t = x; else t = y; a = t;
Programrepresenta=oner while (a1 >= 0) { text scanning while ( a1 >= tokens parsing While Ge Stmt a1 0 syntaxträd Ge a1 0 While Stmt programmodell kodgenerering L1: LD a1 R1 LD 0 R2 BLT L2 BR L1 L2: mellankod optimering 0024 6050 2530 0000 0000 0010 maskinkod
EDA180, Kompilatorteknik FortsäGningskurser Scanning, Parsing, Analys, Kodgenerering. Implementera eget språk, egen kompilator. EDA230, Optimerande kompilatorer Förstå möjligheter och begränsningar hos moderna optimerande kompilatorer. EDA145, Programspråksteori Förstå olika typer av formell semantik. Exekveringsmodeller för funktionella och logikbaserade språk. EDAF10, Objektorienterad modellering och diskreta strukturer (oblig) EDA040, Realtidsprogrammering (oblig) EDA095, Nätverksprogrammering EDA270, Constraintprogrammering EDA120, Funktionsprogrammering EDA171, Språkbehandling och datalingvistik
Kompilatorteknik högnivåspråk while (a1 >= 0) { kompilator scanning parsing namnanalys typanalys kodgenerering kodoptimering instruktionsval registerallokering Mycket användbar teknik! Använd compiler- compilers! lågnivåspråk 0024 6050 2530 0000 0000 0010 standardbibliotek stack heap garbage collector virtuell maskin interpretator runtime-system