Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Haladó Fordítóprogramok
2
Követelmények Horváth Gábor xazax.hun@gmail.com xazax.web.elte.hu
3-5 oldalas esszé, téma bemutatása, minimális előismeretet feltételezve Témák előadás közben További témák GCC Summit Proceedings LLVM Dev meetings Open Book ZH Egy A4-es lap segédlet használható
3
+ Cikkek + Konferencia előadások
Tananyag + Cikkek + Konferencia előadások
4
Célkitűzések Gyakorlatias ismeretek
Mai vezető fordítókban használt algoritmusok, architektúrák GCC, Clang Rust Swift Intuíció arról, mire képes a fordító, mire nem Segítség hatékony kód írásához Könnyebb bekapcsolódás fordítók fejlesztésébe Hány fordító/interpreter van egy böngészőben? TensorFlow AXL, Apache Flink, Configs
5
Mit várunk el egy fordítótól?
6
DEMO #include <iostream> int main() { int i = 1; std::cout << ++i << ++i << std::endl; }
7
DEMO #include <iostream> int fact(int i) { if (i < 1) return 1; return i*fact(i-1); } int main() { std::cout << fact(5) << std::endl; }
8
Fordítók Egyik nyelvről a másikra fordítunk
Pl.: C++ → Haswell utasításkészlet Minél távolabbi a forrás és a cél nyelv annál komplexebb a fordító A számítástudomány minden területét igénybe veszik Mohó algoritmusok (regiszter allokáció) Heurisztikus keresés (ütemezés) Gráf algoritmusok (dead code elimination) Véges automaták (lexing, szintaktikus elemzés) Fix-pont algoritmusok (data-flow analysis) Kevés szoftverfajtában található egyszerre ennyi komplex feladat
9
Fordítók Számos elméleti eredmény találta meg a fordítókban a felhasználását Lattice theory (hálók) Számelmélet Mintaillesztés gráfokon, gráfredukció Számos megoldandó probléma NP teljes Hatékony közelítőmegoldásokat alkalmazunk Lehetséges jobb heurisztikákat kitalálni Rengeteg a trade-off Regiszter haszálat vs hatékony ütemezés Kódméret vs sebesség Optimalizálásra vs futásra szánt idő
10
Fordítók felépítése
11
Fordítók felépítése
12
Optimalizáció Valamely szempontból javít a kód minőségén
Futási idő, memória használat, kódméret, biztonság, … Megőrzi a kód jelentését Biztonságos egy transzformáció használata? Statikus analízis! Döntsük el futtatás nélkül! Tényleg javít a kódon? Költségmodellek Architektúra függő Profile guided optimization
13
Fordítók felépítése
14
Fordítók felépítése
15
Swift fordító, Swift Intermediate Language
16
Swift fordító, Swift Intermediate Language
17
Backend Instruction selection Regiszter allokáció
Ugyanazt a hatást több utasítással/utasítás sorozattal is el lehet érni adott architektúrán. Melyiket válasszuk? Regiszter allokáció Mely regiszterekbe mely értékeket tároljuk el? Mikor lehet lecserélni egy regiszter tartalmát? Instruction scheduling Az egyes utasítások végrehajtása eltérő időt vehet igénybe Ugyan az az utasítás végrehajtása eltérő időt vehet igénybe (cache locality) Instruction level parallelism Out of order execution
18
Modern CPU
19
Modern CPU Pipeline Stalls Cache hierarchy Prefetch
Instruction level parallelism Out of order execution Csak az utasítások bufferén belül Van értelme statikus ütemezésnek GPU, mobil processzoroknál néha nincs Branch prediction SIMD instructions
20
Pipeline
21
SIMD Kevesebb utasítás jut egységnyi operandusra Prefetch barát
Nem a hagyományos regisztereket terheli Természetes módon előfordul Grafika, fizika, matek
22
Instruction Scheduling
LoadAI, StoreAI 3 órajel Mult 2 órajel Többi 1
23
Instruction Scheduling
LoadAI, StoreAI 3 órajel Mult 2 órajel Többi 1
24
Engineering Ütemezéskor a load-okat távolabb helyezzük a betöltött érték felhasználásától Tovább maradnak az értékek a regiszterekben, nő a regiszter használat
25
Lexikális elemzés Reguláris nyelvtan Véges automaták
Karakterek számában lineáris futási idő Tokenek, tokenizálás Részletesen: Fordítóprogramok tárgy Néhány esetben parser része
26
Szintaktikus elemzés Környezet független nyelvek
Terminálisok, nem terminálisok, kezdőszimbólum, produkciós szabályok Tokeneken dolgozik Nyelvtan leírása (BNF) Balrekurzív szabály, jobbrekurzív szabály Többértelműség feloldása Asszociativitás, precedenciák Szintaxis fa Elemzés alulról felfelé, felülről lefelé Absztrakt szintaxisfa vs konkrét szintaxisfa
27
Szintaxis fa
28
Rekurzív leszállás (Recursive Descent)
Minden nem-terminálisnak megfeleltehető egy függvény Kézzel írt elemző Az adott függvény a hozzá tartozó nem-terminálist ismeri fel az input streamen A nyelvtan meghatározza mely függvények hívják egymást LL(k) nyelvtanokra jó, balrekurzív nyelvtanok nem működnek Balrekurzív szabály mindig eliminálható! Vigyázat, stack overflow! Legtöbb ipari fordító elemzője ez! Miért!?
29
Rekurzív leszállás (Recursive Descent)
Akadémiai nyelvek Reguláris nyelvtan: lexelés Környezet független nyelvtan: elemzés A nyelvtan egyértelmű Környezet függő nyelvtan a típusellenőrzés C++ Lexelés se reguláris, se nem környezet független (template >>, C++11) Nyelvtan nem egyértelmű, típusinformációk kellenek a feloldáshoz Nem szétválasztható a szemantikus és szintaktikus elemzés Error recovery
30
P * t; // Pointer vagy szorzás?
Többértelmű nyelvtan P * t; // Pointer vagy szorzás?
31
Balrekurzió eliminálása
Expr → Expr + Expr | Integer | String Expr → Integer Expr’ | String Expr’ Expr’ → + Expr Expr’ | Empty Miért van egyáltalán balrekurzív szabályunk? Asszicativitás!
32
Error recovery Csak mert a felhasználó lefelejtett egy pontos vesszőt, a többi függvényt még lehet elemezni, hogy egyszerre több hibaüzenettel szolgálhassunk Az elemző vissza kell tudjon állni egy stabil állapotba a hibás bemenet után és folytatni a munkát Minél jobb hibaüzenetekre van szükségünk Makróknál minden tokennek két pozíciója van: spelling location, expansion location
33
Összefoglalás Könyv első 180 oldala letudva
Architektúrális áttekintések, emlékeztető lexikális és szintaktikus elemzésről Modern CPU gyorstalpaló Továbbiakban optimalizáció, statikus analízis jóval részletesebben, lassabban Főleg táblás gyakorlatokra lehet számítani
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.