PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

Podobné dokumenty
PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE PŘEKLADY TYPICKÝCH JAZYKOVÝCH KONSTRUKCÍ PROGRAMOVACÍCH JAZYKŮ.

GENEROVÁNÍ KÓDU 9. SHRNUTÍ - PŘÍKLAD POSTUPU PŘEKLADU VSTUPNÍHO PROGRAMU (ZA POUŽITÍ DOSUD ZNÁMÝCH TECHNIK)

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

DTP Základy programování Úvod do předmětu

Překladač a jeho struktura

Konstruktory překladačů

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Automaty a gramatiky(bi-aag) Motivace. 1. Základní pojmy. 2 domácí úkoly po 6 bodech 3 testy za bodů celkem 40 bodů

Úvod z historie. Kompilátory. Kompilace / Kompilátor Compile / Compiler. Pojem kompilátoru. Úvod z historie

2011 Jan Janoušek BI-PJP. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

PROGRAMOVÁNÍ V C++ CVIČENÍ

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

Lexikální analýza Teorie programovacích jazyků

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Generování vnitřní reprezentace programu

Programování v C++ David Bednárek.

11. Přehled prog. jazyků

GENEROVÁNI KÓDU jazyk Mila

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ /14

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

Formální jazyky a překladače

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

TÉMATICKÝ OKRUH TZD, DIS a TIS

Knihovny pro CUDA J. Sloup a I. Šimeček

Abstraktní třídy, polymorfní struktury

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE FORMALISMY PRO SYNTAXÍ ŘÍZENÝ PŘEKLAD: PŘEKLADOVÉ A ATRIBUTOVÉ GRAMATIKY.

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Algoritmizace a programování

Úvod do programovacích jazyků (Java)

Dotazování nad stromem abstraktní syntaxe

Objektově orientované programování

RMI Remote Method Invocation

Programovací jazyky Přehled a vývoj

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

Problém, jehož různé instance je třeba často řešit Tyto instance lze vyjádřit větami v jednoduchém jazyce

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Cílem kapitoly je seznámit studenta se strukturou programu a jeho překladem.

Podmínky na zápočet. Java, zimní semestr

dostat zdroják Petr Zemek Fakulta informačních technologií VUT v Brně izemek

Jednoznačné a nejednoznačné gramatiky

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

A Tutorial. George J. Klir State University of New York (SUNY) Binghamton, New York 13902, USA

Interpret jazyka IFJ2011

IB111 Úvod do programování skrze Python Přednáška 13

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Západočeská univerzita v Plzni Dokumentace překladače PL/0 v PHP Předmět KIV/FJP

1 Nejkratší cesta grafem

Poslední aktualizace: 14. října 2011

Výpočetní modely pro rozpoznávání bezkontextových jazyků zásobníkové automaty LL(k) a LR(k) analyzátory

Jazyk C++, některá rozšíření oproti C

Struktura programu v době běhu

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

Syntaktická analýza založená na multigenerativních systémech Závěrečná práce z předmětu TJD. Jakub Martiško

ÚVOD DO OPERAČNÍCH SYSTÉMŮ. Vývoj SW aplikací. Unix, POSIX, WinAPI, programování komunikace s periferními zařízeními, ovladače zařízení

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

ANT. Aplikační programování v Javě (BI-APJ) - 1 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Vector datový kontejner v C++.

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Algoritmizace. Cíle předmětu

Škola: Střední škola obchodní, České Budějovice, Husova 9. Inovace a zkvalitnění výuky prostřednictvím ICT

Abstraktní datové typy

Úvod do programování - Java. Cvičení č.4

1. Téma 12 - Textové soubory a výjimky

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

C2110 Operační systém UNIX a základy programování

Rekurzivní algoritmy

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat

1. Úvod. Podmínky absolvování

7. Popis konečného automatu

Uplatnění metod na zvolený jazyk

Java Cvičení 05. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

Programovací jazyky. Obsah. Proč používáme programovací jazyky? Programovací jazyk

Příkazové skripty Procedurální jazyky Lua a ostatní

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

Textové soubory. alg9 1

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

IB111 Programování a algoritmizace. Programovací jazyky

1 Úvod do kompilátorů

Datové struktury. alg12 1

1. Programování proti rozhraní

Úvod do programování

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

Základy programování (IZP)

Náznak ukázky syntaxe a sémantiky pro projekt. 1 Syntaktické prvky. Poslední aktualizace: 8.

KTE / ZPE Informační technologie

OSTRAVSKÁ UNIVERZITA V OSTRAVĚ

Základy algoritmizace a programování

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 10

PB161 Programování v jazyce C++ Přednáška 7

Základy digitální techniky

PB161 Programování v jazyce C++ Přednáška 1

5. Dynamické programování

PB161 Programování v jazyce C++ Přednáška 1

Lexikální analýza. Rozhraní lexikálního analyzátoru. Miroslav Beneš Dušan Kolář. M. Beneš, D. Kolář: Lexikální analýza 1. Lexikální analýza 2

Mělká a hluboká kopie

Transkript:

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE 2011 Jan Janoušek BI-PJP Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Základní informace Přednášky: doc. Ing. Jan Janoušek, Ph.D. Office: MK 226 Email: Jan.Janousek@fit.cvut.cz Stránka předmětu: http://edux.fit.cvut.cz/courses/bi-pjp/start Cvičení: Ing. Martin Plicka

Doporučená literatura Muller, K.: Programovací jazyky a překladače. Skripta ČVUT. Další, pokročilejší knihy (pro zájemce): Aho, Lam, Sethi, Ullman: Compiler: Principles, Techniques and Tools (2nd ed.), 2010. Melichar, Češka, Ježek, Richta: Konstrukce překladačů, ČVUT, 2006. Allen, Kennedy: Optimizing Compilers for Modern Architectures, 2002. Fischer, LeBlanc: Crafting a Compiler, 1995. Grune, Bal, Jacobs, Langendoen: Modern Compiler Design, 2000. Muchnick: Advanced compiler design and implementation, Morgan Kaufman Publishers, 2009.

Hodnocení Podmínky zápočtu a zkoušky Semestrální práce max. 20 b. Dva zápočtové testy max. 30 b. Zkouška 50 b. (povinná ústní zkouška s právem veta +/- 5 b.) Výsledná známka se řídí Klasifikačním řádem ČVUT.

Souvislosti s ostatními předměty Návaznost předmětů na FIT ČVUT: BI-AAG: obecná teorie formálních jazyků, gramatik a automatů BI-PJP: úvodní kurs do teorie syntaktické analýzy, překladu a tvorby překladačů (jednoduchý frontend řízený LL analyzátorem, jednoduchý backend (přímé generování cílového kódu průchodem AST)) MI-SYP: pokročilé techniky syntaktické analýzy a překladu (LR syntaktická analýza, paralelní syntaktická analýza) MI-GEN: pokročilejší techniky tvorby překladačů (vnitřní formy, frontend: generování vnitřních forem, backend: optimalizace, generování kódu, run-time prostředí)

Použití překladače USE CASE

CPU rozumí pouze binárním kódu 01010000 01110100 11010111 10010110 00100010 10110001

1940... programování ve strojovém kódu 01010000 01110100 11010111 10010110 00100010 10110001

1940... programování ve strojovém kódu 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 01010000 01110100 11010111 10010110 00100010 10110001

1940... programování ve strojovém kódu 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 01010000 01110100 11010111 10010110 00100010 10110001

1950... assembler 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 01010000 01110100 11010111 10010110 00100010 10110001 PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC '40202120' DBL DC D'0' END BEGIN assembler

1950... operační systém 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 01010000 01110100 11010111 10010110 00100010 10110001 operační systém loader PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC '40202120' DBL DC D'0' END BEGIN assembler

1950... operační systém 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 01010000 01110100 11010111 10010110 00100010 10110001 operační systém loader PRINT NOGEN BEGIN BEGIN REGS SR R2,R2 SR R3,R3 LOOP AR R2,R3 LA R3,1(R0,R3) C R3,=F'10' BNE LOOP CVD R2,DBL ED RESULT,DBL+6 WTO RESULT RETURN LTORG RESULT DC '40202120' DBL DC D'0' END BEGIN assembler myprog.exe

1950... překladač 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 01010000 01110100 11010111 10010110 00100010 10110001 operační systém loader READ INPUT TAPE 5, 501, IA, IB, IC 501 FORMAT (3I5) IF (IA) 777, 777, 701 701 IF (IB) 777, 777, 702 702 IF (IC) 777, 777, 703 703 IF (IA+IB-IC) 777,777,704 704 IF (IA+IC-IB) 777,777,705 705 IF (IB+IC-IA) 777,777,799 777 STOP 1 799 S = FLOATF (IA + IB + IC) / 2.0 AREA = SQRT( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) * + (S - FLOATF(IC))) WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA STOP END překladač Fortran myprog.exe

1970... překladač C 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 01010000 01110100 11010111 10010110 00100010 10110001 operační systém loader Hello, world! #include <stdio.h> int main(int,char**) { printf( "Hello, world!\n"); } překladač C myprog.exe

1980... překladač C++ 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 01010000 01110100 11010111 10010110 00100010 10110001 operační systém loader Hello, world! #include <iostream> int main(int,char**) { std::cout << "Hello, world!\n"; } překladač C++ myprog.exe

1960... interpret(er) 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 10 INPUT "What is your name: ", U$ 20 PRINT "Hello "; U$ 30 INPUT "How do you want: ", N 40 S$ = "" 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NET I 80 PRINT S$ 90 INPUT "Do you want? ", A$ 100 IF LEN(A$) = 0 THEN 90 110 A$ = LEFT$(A$, 1) 120 IF A$ = "Y" THEN 30 130 PRINT "Goodbye ";U$ 140 END interpret operační systém

Interpretace s mezikódem 10 INPUT "What is your name: ", U$ 20 PRINT "Hello "; U$ 30 INPUT "How do you want: ", N 40 S$ = "" 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NET I 80 PRINT S$ 90 INPUT "Do you want? ", A$ 100 IF LEN(A$) = 0 THEN 90 110 A$ = LEFT$(A$, 1) 120 IF A$ = "Y" THEN 30 130 PRINT "Goodbye ";U$ 140 END 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 překladač 04FBC41E 77AB2000 1AE04E33 operační systém interpret

interpretovaný mezikód (bytecode) public class HelloWorld { public static void main(string[] args) { System.out.println( "Hello, world!"); } } překladač myprog.class 13 0 1 0 10 0 8 0 9 0 13 0 8 0 16 0 7 0 2 0 0 0 0 12 0 15 0 6 0 2 0 7 0 9 0 6 0 2 0 8 0 8 0 10 0 4 0 0 2 0 7 0 7 0 1 0 2 0 0 5 0 1 0 8 0 0 8 0 7 0 10 0 1 0 0 0 2 0 8 0 11 0 4 0 9 0 13 0 0 2 0 0 0 0 6 0 7 0 0 0 0 8 0 5 0 0 3 0 17 0 0 0 5 0 20 10 0 04FBC41E 77AB2000 1AE04E33 interpret operační systém Hello, world!

Srovnání Just-In-Time/non-JIT public class HelloWorld { public static void main(string[] args) { System.out.println( "Hello, world!"); } } překladač myprog.class JIT překladač 01010000 01110100 11010111 10010110 00100010 10110001 operační systém #include <iostream> int main(int,char**) { std::cout << "Hello, world!\n"; } překladač myprog.exe 01010000 01110100 11010111 10010110 00100010 10110001 operační systém loader

21 Struktura překladače Jednoduchý překladač: Vstupní kód Lexikální analyzátor Posloupnost tokenů Syntaktický analyzátor Derivační strom Sémantický analyzátor, generátor kódu Cílový kód

Složitější překladač front-end závislý na vstupním jazyku back-end závislý na cílovém jazyku Lexikální analyzátor Posloupnost tokenů Parser Derivační strom Mezikód Generátor kódu Sémantický analyzátor Derivační strom Cílový kód Generátor mezikódu 22

Ještě více složitější překladač Lexikální analyzátor front-end závislý na vstupním jazyku back-end závislý na cílovém jazyku Posloupnost tokenů Optimalizace Parser Mezikód Sémantický analyzátor Optimalizace Derivační strom Derivační strom Derivační strom Mezikód Strojově závislé optimalizace Generátor kódu Mezikód střední úrovně Mezikód nízké úrovně Strojově závislé optimalizace 23 Generátor mezikódu Cílový kód

Překladač pro m vstupních a n výstupních jazyků Frontend 1 Backend 1 Frontend 2 Backend 2 Mezikód (vnitřní reprezentace) Frontend m Backend n

Poznámky Jednotlivé fáze se často spojují dohromady do jednoho průchodu: např. syntaktická + sémantická analýza Formalismy pro popis syntaktické a sémantické analýzy, včetně generování mezikódu: bezkontextová gramatika, atributová překladová bezkontextová gramatika. (viz první seznámení v předmětu BI-AAG)