330 likes | 568 Views
Kompilatori. 2cr M.mat. Mārtiņš Opmanis askola@latnet.lv 7224689 LU MII 210.ist. http://melnais.mii.lu.lv/kompilatori. Pieci(?) mājas darbi (9-12 p.) (jāiesūta elektroniski uz askola@latnet.lv nedēļas laikā)
E N D
Kompilatori 2cr M.mat. Mārtiņš Opmanis askola@latnet.lv 7224689 LU MII 210.ist. http://melnais.mii.lu.lv/kompilatori
Pieci(?) mājas darbi (9-12 p.)(jāiesūta elektroniski uz askola@latnet.lv nedēļas laikā) Divi praktiskie darbi (32 p.)(jāiesūta elektroniski uz askola@latnet.lv noteiktā laikā un jāatrāda klātienē) Kavēšanās: -1 punkts par katru nedēļu
Punktu summas teorētiskais maksimums pārsniedz 100. Tiek piedāvāta atzīme [punkti/10]. Eksāmens (parasti) nav nepieciešams. Pirmā praktiskā darba vietā var nolasīt referātu.
Pirmie kompilatori 1950-gadu sākums. Uzskats, ka kompilatori ir no izstrādes viedokļa ārkārtīgi sarežģītas programmas. Pirmajam valodas “FORTRAN” kompilatoram tika iztērēti 18 cilvēkgadi.
Pūķa grāmata Izmantotie resursi internetā: Costas Busch “Models of computation” http://www.cs.rpi.edu/~buschc/courses/modcomp/fall2002/index.html P.D.Terry “Compilers and compiler generators” http://www.scifac.ru.ac.za/compilers/ un citi
Kompilators Izejas programma Mērķa programma Kompilators Kļūdu ziņojumi, brīdinājumi, padomi
Fortran I Nesauc par programmēšanas valodu. Rokasgrāmata (1956.gada oktobris) “The FORTRAN Automatic Coding System for the IBM 704 EDPM.”
Kompilācijas fāzes • Analīze sākotnējās programmas teksta sadalīšana sastāvdaļās un starpkoda izveidošana • Sintēze mērķprogrammas veidošana no starpkoda
Analīze Izpildāmās operācijas tiek noteiktas un ierakstītas hierarhiskā kokveida struktūrā - sintakseskokā (precīzāk – sintaktiskās analīzes kokā). Katra virsotne atbilst izpildāmai operācijai, bet bērnu virsotnes – operācijas argumentiem.
Sintakses koka piemērs sek := ((st * 60) + min) * 60;
Raksturīga programmēšanas valodas apstrādes sistēma Izejas programmas skelets Preprocesors Izejas programmas teksts Kompilators Mērķprogramma assemblerā Assemblers Pārvietojams mašīnkods Bibliotēkas, objektfaili Ielādētājs/saišu redaktors Absolūtais mašīnkods
Analīzes fāzes • Lineārā analīze • Hierarhiskā analīze • Semantiskā analīze
Lineārā analīze Kompilatoru kontekstā lineāro analīzi sauc par leksiskoanalīzi jeb skenēšanu. Skenēšanas procesā notiek programmas teksta ielasīšana un simbolu grupēšana vienumos (token).
Lineārā analīze - piemērs sek := min * 60; Tiks izdalīti sekojoši vienumi: • Identifikators “sek” • Piešķiršanas operators “:=“ • Identifikators “min” • Reizināšanas zīme • Konstante “60” • Semikolons Kā ar tukšumsimboliem?
Hierarhiskā analīze Kompilatoru kontekstā hierarhisko analīzi sauc par sintaksesanalīzi. Angliski – parsing. Sintakses analīzes procesā notiek vienumu grupēšana gramatiskās frāzēs, ko kompilators tālāk izmantos sintēzes procesā. Parasti izejas programmas gramatiskās frāzes tiek attēlotas koka formā.
Hierarhiskā analīze - piemērs pozicija := sakums + atrums * 17 Piešķiršana := Izteiksme Identifikators + Izteiksme Izteiksme pozicija Identifikators * Izteiksme Izteiksme sakums Identifikators vesels skaitlis atrums 17
Hierarhiskās struktūras likumi • Katrs identifikators ir izteiksme • Katrs skaitlis ir izteiksme • Ja izt1 ir izteiksme, tad (izt1) arī ir izteiksme • Ja izt1 un izt2 ir izteiksmes, tad izt1+izt2 un izt1*izt2 ir izteiksmes • ...
Instrukcijas programmēšanas valodās • Ja id1 ir identifikators un izt2 ir izteiksme, tad id1 := izt2; ir instrukcija. • Ja izt1 ir izteiksme, bet instr2 ir instrukcija, tad while izt1 do instr2 ir instrukcija. • ...
Semantiskā analīze • Tiek uzkrāta informācija par datu tipiem • Tiek izmantots sintakses analīzes rezultāts • Var “pielabot” programmas tekstu ... + atrums * 17 Izteiksme * Var paredzēt tipu pārveidošanu Izteiksme Izteiksme int_to_real Identifikators vesels skaitlis vesels skaitlis atrums 17
Kompilācijas fāzes izejas programma Leksikas analizētājs Sintakses analizētājs Simbolu tabulas dispečers Semantikas analizētājs Kļūdu apstrādātājs Starpkoda ģenerētājs Koda optimizētājs Koda ģenerētājs mērķa programma
Simbolu tabula Glabājas informācija par identifikatoriem un to atribūtiem (atvēlētais atmiņas apgabals, tips, redzamība; funkciju gadījumā informācija par argumentu skaitu un tipu, to nodošanas veidu). Saistīta ar visām fāzēm – leksiskās un sintaktiskās analīzes laikā aizpilda, semantiskās analīzes laikā izmanto, lai pārbaudītu tipu atbilstību.
Kļūdu apstrāde Kļūdas var būt katrā no kompilēšanas fāzēm var a : integer; b : boolean; Unknown identifier 2*a := 66; Error in expression a := *33; OK a := 3+-+-+-+33; Type mismatch a := 3/33; b := (b = false) = true; OK
Instrukciju iekšējā reprezentācija pozicija := sakums + atrums * 17; Leksikas analizētājs id1 := id2 + id3 * 17 Sintakses analizētājs := id1 + id2 * id3 17 Semantikas analizētājs := id1 + id2 * id3 inttoreal 17
Instrukciju iekšējā reprezentācija(turp.) Starpkoda ģenerētājs temp1 := inttoreal(17) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 Koda optimizētājs temp1 := id3 * 17.0 id1 := id2 + temp1 Koda ģenerētājs MOVF id3, R2 MULF #17.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1
Kompilatoru “radinieki” (“apkārtne”) • Preprocesori • makrosu (define, ...) apstrāde • failu iekļaušana (include,...) • “intelektuālie” preprocesori (jaunu konstrukciju definēšanai) • valodas paplašinājumi • Asembleri • Ielādētāji un saišu redaktori
Kompilēšanas fāzu grupēšana • sākuma stadija (front end) • atkarīga tikai no izejas valodas • ietver leksikas un sintakses analīzi, simbolu tabulas izveidošanu, semantikas analīzi, starpkoda ģenerēšanu. Iespējama arī zināma koda optimizēšana. • beigu stadija (back end) • daļas, kas atkarīgas no mērķa vides, kur izpildīsies programma. Ir atkarīga tikai no starpkoda, nevis izejas valodas.
Caurlūkošanas (pass) Jo mazāk caurlūkošanu, jo labāk – ideāli viena (sākumā ielasa tekstu, beigās ieraksta rezultātu). Var prasīt lielu atmiņas apjomu, jo nākošai fāzei var būt vajadzība pēc citādāk izkārtotas informācijas nekā iepriekšējā fāze atdod. Grūti ģenerēt mērķa programmu līdz starpkoda izveides beigām.
Piemērs : “goto” ar iezīmi tālāk tekstā ..... goto iezime1; ..... ..... iezime1: a:=b; .....
Piemērs : procedūru “krustveida” izsaukumi procedure A(i : integer); forward; procedure B(i : integer); begin … A(i); … end; procedure A(i : integer); begin … B(i); … end;