Przyczyny dwustopniowego tłumaczenia

Podobne dokumenty
Gramatyki atrybutywne

Analiza semantyczna. Gramatyka atrybutywna

Plan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk

Metody Kompilacji Wykład 1 Wstęp

Metody Kompilacji Wykład 3

TRANSLACJA I TRANSLATORY

Zadanie analizy leksykalnej

Dynamiczny przydział pamięci w języku C. Dynamiczne struktury danych. dr inż. Jarosław Forenc. Metoda 1 (wektor N M-elementowy)

Translacja wprowadzenie

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

Generacja kodu docelowego

10. Translacja sterowana składnią i YACC

Odwrotna Notacja Polska

Wykład 11. Konstrukcja drzew składniowych

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Język programowania: Lista instrukcji (IL Instruction List) Wykład w ramach przedmiotu: Sterowniki programowalne Opracował dr inż. Jarosław Tarnawski

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Podstawy Informatyki Języki programowania c.d.

Wstęp do programowania

Wprowadzenie: języki, symbole, alfabety, łańcuchy Języki formalne i automaty. Literatura

Gramatyka operatorowa

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

KONSTRUKCJA KOMPILATORÓW

Automat ze stosem. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

11. Wzmianka o metodach definiowania semantyki przypomnijmy definicję matematyczną języka formalnego: L = <Σ, Syn, DSem, Sem>

Programowanie obiektowe

Analiza semantyczna. Kompilator musi sprawdzić, czy w programie zachowane są zarówno

Parsery LL(1) Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Indukowane Reguły Decyzyjne I. Wykład 3

Język programowania: Lista instrukcji (IL Instruction List)

Odczyt danych z klawiatury Operatory w Javie

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

Struktura i działanie jednostki centralnej

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Podstawy programowania

Model semistrukturalny

ForPascal Interpreter języka Pascal

Wykład 14. Środowisko przetwarzania

Programowanie Niskopoziomowe

Architektura komputerów

Wprowadzenie. Organizacja pracy i środowisko programistyczne. Mirosław Ochodek

Semantyka i Weryfikacja Programów - Laboratorium 3

Instrukcja warunkowa i złoŝona.

Programowanie komputerów

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

Księgarnia PWN: Włodzimierz Stanisławski, Damian Raczyński - Programowanie systemowe mikroprocesorów rodziny x86

Programowanie w elektronice: Podstawy C

Język ludzki kod maszynowy

Maszyna Turinga języki

Programowanie obiektowe

Składnia rachunku predykatów pierwszego rzędu

Wstęp. do języka C na procesor (kompilator RC51)

Języki i paradygmaty programowania

Algorytmy i Struktury Danych.

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

Lista Rozkazów: Język komputera

Algorytmika i Programowanie VBA 1 - podstawy

PyPy's Approach to Virtual Machine Construction

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 2. Programowanie komputerowe

Paradygmaty programowania

INFORMATYKA DANE.

PROLOG WSTĘP DO INFORMATYKI. Akademia Górniczo-Hutnicza. Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej.

Algorytmy i Struktury Danych.

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie Niskopoziomowe

Wstęp do informatyki- wykład 5 Instrukcja selekcji if-else Operatory arytmetyczne i logiczne

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Wykład 10. Translacja sterowana składnią

Formalna weryfikacja oprogramowania w lotnictwie

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Podstawy Informatyki Gramatyki formalne

Podstawy Kompilatorów

Przykładowe B+ drzewo

Uproszczony schemat działania kompilatora

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

Algorytmy i Struktury Danych.

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Fazy przetwarzania zapytania zapytanie SQL. Optymalizacja zapytań. Klasyfikacja technik optymalizacji zapytań. Proces optymalizacji zapytań.

Pakiety i interfejsy. Tomasz Borzyszkowski

PLC1: Programowanie sterowników logicznych SIEMENS SIMATIC S7-300/400 - kurs podstawowy

Spis treści. Wprowadzenie 15

Wieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

Programowanie. Projektowanie funkcje programu tworzenie algorytmu i struktur danych. Programowanie implementacja algorytmu kompilacja programu

Języki i operacje na językach. Teoria automatów i języków formalnych. Definicja języka

1. Liczby i w zapisie zmiennoprzecinkowym przedstawia się następująco

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

Program We Kompilator Wy Źródłowy

Języki programowania zasady ich tworzenia

Języki i techniki programowania Ćwiczenia 2

Python wstęp do programowania dla użytkowników WCSS

Warsztaty dla nauczycieli

Transkrypt:

Generacja kodu pośredniego Teoria kompilacji Dr inŝ. Janusz Majewski Katedra Informatyki Przyczyny dwustopniowego tłumaczenia Łatwość generowania kompilatorów tego samego języka dla róŝnych platform systemowo-sprzętowych

Przyczyny dwustopniowego tłumaczenia Łatwość przeprowadzania optymalizacji na bazie kodu pośredniego niezaleŝnie od sprzętu Języki kodu pośredniego Języki kodu pośredniego są językami dla pewnej maszyny abstrakcyjnej : Odwrotna notacja polska (notacja postfiksowa) maszyna stosowa Drzewa syntaktyczne lub grafy skierowane acykliczne Kod trójadresowy

Przykład translacja wyraŝeń do odwrotnej notacji polskiej (ONP) + T E.t E 1.t T.t + E T E.t T.t T T 1 * F T.t T 1.t F.t * T F T.t F.t F (E) F.t E.t F F.t name(.lexptr) gdzie: - operator konkatenacji tekstów RozwaŜane słowo źródłowe: a+(b+c)*d Po analizie leksykalnej: 1 +( 2 + 3 )* 4.lexptr 1 2 3 4 name(.lexptr) a b c d Maszyna wirtualna działająca w oparciu o ONP Przykład: maszyna wirtualna = maszyna stosowa źródło: day := (1461 * y) div 4 + (153 * m + 2) div 5 + d ONP: day 1461 y * 4 div 153 m * 2 + 5 div + d + := Instrukcje maszyny stosowej: push v - złoŝenie stałej na stos rvalue l - złoŝenie zawartości l na stos lvalue l - złoŝenie adresu l na stos (operacja, np:+) - wykonanie operacji na dwóch argumentach na wierzchołku stosu i bezpośrednio pod wierzchołkiem, zdjęcie obu argumentów ze stosu złoŝenie tam wyniku. := - r-wartość z wierzchołka stosu przesyłana jest do pamięci pod adres ( l wartość) znajdujący się bezpośrednio pod wierzchołkiem. Obie wartości są zdejmowane ze stosu

Program dla maszyny stosowej źródło: day := (1461 * y) div 4 + (153 * m + 2) div 5 + d ONP: day 1461 y * 4 div 153 m * 2 + 5 div + d + := Tłumaczenie dla maszyny stosowej: lvalue day push 1461 rvalue y * push 4 div push 153 rvalue m * push 2 + push 5 div + rvalue d + := S := E + E 2 * E 2 E (E 1 ) E.lexptr 1 2 3 4 Przykład translacja instrukcji przypisania do kodu trójadresowego S.zm name(.lexptr) gen(s.zm := E.zm + E 2.zm * E 2 E.zm E 1.zm E.zm name(.lexptr) gdzie: - operator konkatenacji tekstów RozwaŜane słowo źródłowe: d:=a+(b+c)*d Po analizie leksykalnej: 4 := 1 +( 2 + 3 )* 4 name(.lexptr) a b c d S := E.lexptr=1 E * E ( E ) S.zm=d E.zm=a E.zm=b.lexptr=2 E.zm=t 3 E.zm=t 2 E.zm=c.lexptr=3 E.zm=d

Przykład translacja instrukcji przypisania do kodu trójadresowego S := E + E 2 * E 2 E (E 1 ) E S.zm name(.lexptr) gen(s.zm := E.zm + E 2.zm * E 2 E.zm E 1.zm E.zm name(.lexptr) słowo źródłowe: d:=a+(b+c)*d Tłumaczenie: t 1 := b + c S := E.lexptr=1 S.zm=d E.zm=a E * E ( E ) E.zm=b E.zm=t 3 E.zm=t 2 E.zm=c E.zm=d.lexptr=2.lexptr=3 Przykład translacja instrukcji przypisania do kodu trójadresowego S := E + E 2 * E 2 E (E 1 ) E S.zm name(.lexptr) gen(s.zm := E.zm + E 2.zm * E 2 E.zm E 1.zm E.zm name(.lexptr) słowo źródłowe: d:=a+(b+c)*d Tłumaczenie: t 1 := b + c t 2 := t 1 * d S := E.lexptr=1 E * E ( E ) S.zm=d E.zm=a E.zm=b.lexptr=2 E.zm=t 3 E.zm=t 2 E.zm=c.lexptr=3 E.zm=d

Przykład translacja instrukcji przypisania do kodu trójadresowego S := E + E 2 * E 2 E (E 1 ) E S.zm name(.lexptr) gen(s.zm := E.zm + E 2.zm * E 2 E.zm E 1.zm E.zm name(.lexptr) słowo źródłowe: d:=a+(b+c)*d Tłumaczenie: t 1 := b + c t 2 := t 1 * d t 3 := a + t 2 S := E.lexptr=1 E * E ( E ) S.zm=d E.zm=a E.zm=b.lexptr=2 E.zm=t 3 E.zm=t 2 E.zm=c.lexptr=3 E.zm=d Przykład translacja instrukcji przypisania do kodu trójadresowego S := E + E 2 * E 2 E (E 1 ) E S.zm name(.lexptr) gen(s.zm := E.zm + E 2.zm * E 2 E.zm E 1.zm E.zm name(.lexptr) słowo źródłowe: d:=a+(b+c)*d Tłumaczenie: t 1 := b + c t 2 := t 1 * d t 3 := a + t 2 d := t 3 S := E.lexptr=1 E * E ( E ) S.zm=d E.zm=a E.zm=b.lexptr=2 E.zm=t 3 E.zm=t 2 E.zm=c.lexptr=3 E.zm=d

Przykład translacja instrukcji przypisania do kodu trójadresowego Drzewo syntaktyczne Słowo źródłowe: d:=a+(b+c)*d Tłumaczenie: t 1 := b + c t 2 := t 1 * d t 3 := a + t 2 d := t 3 Przypomnienie: drzewa rozbioru E E+ T E T T T T * F T / F F F ( E) num

Drzewa syntaktyczne i dagi a + a * (b - 5)+ (b - 5) / c Drzewa syntaktyczne i dagi a kod trójadresowy a + a * (b - 5)+ (b - 5) / c t 1 := b - 5 t 2 := a * t 1 t 3 := a + t 2 t 4 := b 5 t 5 := t 4 / c t 6 := t 3 + t 5 t 1 := b - 5 t 2 := a * t 1 t 3 := a + t 2 t 4 := t 1 / c t 5 := t 3 + t 4

Drzewa syntaktyczne i dagi a kod trójadresowy Kod trójadresowy jest zlinearyzowaną reprezentacją drzew syntaktycznych lub skierowanych grafów cyklicznych. Kod trójadresowy implementacja Czwórki: Trójki: oper. arg 1 arg 2 wyn instr oper arg 1 arg 2 (0) (1) (2) (3) (4) (5) uminus * uminus * + := c b c b t 2 t 5 t 1 t 3 t 4 t 1 t 2 t 3 t 4 t 5 a Zmienne tymczasowe muszą być w tablicy symboli Reprezentacja pośrednia umoŝliwiająca przestawianie instrukcji (0) (1) (2) (3) (4) (5) (14) (15) (16) (17) (18) (19) (14) (15) (16) (17) (18) (19) uminus * uminus * + := c b c b (15) a (14) (16) (17) (18) pointery do tabl. symboli

Zestaw instrukcji trójadresowych (a) x := y op z dla operacji dwuargumentowych (b) x := op y dla operacji jednoargumentowych (c) x := y kopiowanie (d) goto L skok bezwarunkowy (e) if x relop y goto L skok warunkowy (f) param x call p, n do obsługi procedur return y (g) x := y[i] do obsługi tablic x[i] := y i odległość elementu od początku tablicy liczona w jednostkach pamięci, np. w bajtach (h) x := &y x := *y do obsługi wskaźników *x := y Konstruowanie drzew syntaktycznych lub skierowanych grafów acyklicznych dla wyraŝeń + T - T E T T T 1 * F T T 1 / F T F F (E) F F num {E.nptr mknode( +,E 1.nptr,T.nptr)} {E.nptr mknode( -,E 1.nptr,T.nptr)} {E.nptr T.nptr} {T.nptr mknode( *,T 1.nptr, F.nptr)} {T.nptr mknode( /,T 1.nptr,F.nptr)} {T.nptr F.nptr} {F.nptr E.nptr} {F.nptr mkleaf(,.lexptr)} {F.nptr mkleaf(num,num.val)}

Konstruowanie drzew syntaktycznych lub skierowanych grafów acyklicznych dla wyraŝeń (i) (ii) (iii) mknode(op, left, right) (a) sprawdza, czy istnieje wierzchołek (op, left, right), jeśli tak zwraca wskaźnik do tego wierzchołka (b) konstruuje wierzchołek (op, left, right) i zwraca wskaźnik do tego wierzchołka mkleaf(,.lexptr) (a) sprawdza, czy istnieje liść (,.lexptr), jeśli tak zwraca wskaźnik do tego liścia (b) konstruuje liść (,.lexptr) i zwraca wskaźnik do tego liścia mkleaf(num,num.val) (a) sprawdza, czy istnieje liść (num, num.val), jeśli tak zwraca wskaźnik do tego liścia (b) konstruuje liść (num, num.val) i zwraca wskaźnik do tego liścia Konstruowanie drzew syntaktycznych lub skierowanych grafów acyklicznych dla wyraŝeń

or E 2 and E 2 E not E 1 E 1 relop 2 E true E false E (E 1 ) do końca E.place newtemp gen(e.place := E 1.place or E 2.place) E.place newtemp gen(e.place := E 1.place and E 2.place) E.place newtemp gen(e.place := not E 1.place) E.place newtemp gen( if 1.place relop.op 2.place goto nexstat + 3) gen(e.place := 0 ) gen( goto nextstat + 2) gen(e.place := 1 ) E.place newtemp; gen(e.place := 1 ) E.place newtemp; gen(e.place := 0 ) E.place E 1.place do końca Przykład: a < b or c < d and e < f

do końca Przykład: a < b or c < d and e < f 100 : if a < b goto 103 107 : t 2 :=1 101 : t 1 := 0 108 : if e < f goto 111 102 : goto 104 109 : t 3 := 0 103 : t 1 := 1 110 : goto 112 104 : if c < d goto 107 111 : t 3 := 1 105 : t 2 := 0 112 : t 4 := t 2 and t 3 106 : goto 108 113 : t 5 := t 1 or t 4 Przykład: a < b or c < d and e < f

Przykład: a < b or c < d and e < f Przykład: a < b or c < d and e < f

LTrue: LFalse: Jeśli E ma postać a < b, to moŝna wygenerować if a < b goto E.true goto E.false atrybut dziedziczony symbolu E = etykieta, do której przechodzi sterowanie, gdy a < b jest true Jeśli E jest postaci E 1 or E 2, to jeśli E 1 jest true wówczas juŝ wiemy Ŝe E jest true czyli E 1.true E.true Jeśli nie, to musimy obliczyć E 2, więc E 1.false newlabel JeŜeli obliczamy E 2 i E 2 jest true to E takŝe jest true, w przeciwnym przypadku E jest false E 2.true E.true E 2.false E.false

or M E 2 and M E 2 E not E 1 E (E 1 ) E 1 relop 2 E true E false M ε backpatch(e 1.falselist, M.quad); E.truelist merge(e 1.truelist,E 2.truelist); E.falselist E 2.falselist; backpatch(e 1.truelist, M.quad); E.truelist E 2.truelist; E.falselist merge(e 1.falselist,E 2.falselist); E.truelist E 1.falselist; E.falselist E 1.truelist; E.truelist E 1.truelist; E.falselist E 1.falselist; E.truelist makelist(nextquad()) E.falselist makelist(nextquad() + 1) gen( if 1.place relop.op 2.place goto _ ); gen( goto _ ); E.truelist makelist(nextquad()); gen( goto _ ); E.falselist makelist (nextquad()); gen ( goto _ ); M.quad nextquad()

Po redukcji I Przed redukcją I Przed redukcją II Po redukcji II 100: if a < b goto _ 100: if a < b goto _ 100: if a < b goto _ 101: goto _ 101: goto _ 101: goto 102 102: if c < d goto _ 102: if c < d goto 104 102: if c < d goto 104 103: goto _ 103: goto _ 103: goto_ 104: if e < f goto _ 104: if e < f goto _ 104: if e < f goto _ 105: goto _ 105: goto _ 105: goto _ 100: if a < b goto _ 101: goto 102 102: if c < d goto 104 103: goto_ 104: if e < f goto _ 105: goto _ Nie zostały wypełnione jedynie miejsca etykiet L.true i L.false z poprzedniego przykładu. Adresy docelowe skoków z linii 100 i 104 (E jest true ) oraz z linii 103 i 105 (E jest false ) będą znane po przeanalizowaniu zapisu, w skład którego wchodzi badane w przykładzie wyraŝenie boolowskie.

Przykład: a < b or c < d and e < f if a < b goto L.true goto L1 L1: if c < d goto L2 goto: L.false L2: if e < f goto L.true goto L.false Po optymalizacji if a < b goto L.true if c >= d goto L.false if e < f goto L.true goto L.false