Upload
soleil
View
51
Download
3
Embed Size (px)
DESCRIPTION
Kompilatori. 2cr M.mat. Mārtiņš Opmanis [email protected] 7224689 LU MII 210.ist. http://melnais.mii.lu.lv/kompilatori. Pieci(?) mājas darbi (9-12 p.) (jāiesūta elektroniski uz [email protected] nedēļas laikā) - PowerPoint PPT Presentation
Citation preview
2cr
M.mat. Mārtiņš Opmanis
7224689
LU MII 210.ist.
http://melnais.mii.lu.lv/kompilatori
Kompilatori
Pieci(?) mājas darbi (9-12 p.)(jāiesūta elektroniski uz [email protected] nedēļas laikā)
Divi praktiskie darbi (32 p.)
(jāiesūta elektroniski uz [email protected]
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
Kompilators
Kompilators
Izejas programma
Kļūdu ziņojumi,brīdinājumi,padomi
Mērķaprogramma
Fortran INesauc par programmēšanas valodu.
Rokasgrāmata (1956.gada oktobris)
“The FORTRAN Automatic Coding System for the IBM 704 EDPM.”
Fortran programmas teksts
Kompilācijas fāzes
Analīze sākotnējās programmas teksta sadalīšana sastāvdaļās un starpkoda izveidošana
Sintēzemērķprogrammas veidošana no starpkoda
Analīze
Izpildāmās operācijas tiek noteiktas un ierakstītas hierarhiskā kokveida struktūrā - sintakses kokā (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ērssek := ((st * 60) + min) * 60;
Raksturīga programmēšanas valodas apstrādes sistēma
Izejas programmas skelets
Izejas programmas teksts
Mērķprogramma assemblerā
Pārvietojams mašīnkods
Absolūtais mašīnkods
Preprocesors
Kompilators
Assemblers
Ielādētājs/saišu redaktorsBibliotēkas,objektfaili
Analīzes fāzes
1. Lineārā analīze
2. Hierarhiskā analīze
3. Semantiskā analīze
Lineārā analīze
Kompilatoru kontekstā lineāro analīzi sauc par leksisko analīzi jeb skenēšanu.
Skenēšanas procesā notiek programmas teksta ielasīšana un simbolu grupēšana vienumos (token).
Lineārā analīze - piemērs
1. Identifikators “sek”2. Piešķiršanas operators “:=“3. Identifikators “min”4. Reizināšanas zīme5. Konstante “60”6. Semikolons
sek := min * 60;
Tiks izdalīti sekojoši vienumi:
Kā ar tukšumsimboliem?
Hierarhiskā analīze
Kompilatoru kontekstā hierarhisko analīzi sauc par sintakses analī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ērspozicija := sakums + atrums * 17
Piešķiršana
Identifikators
pozicija
vesels skaitlis
Identifikators
Identifikators
Izteiksme
IzteiksmeIzteiksme
IzteiksmeIzteiksme
sakums
atrums 17
:=
+
*
Hierarhiskās struktūras likumi
1. Katrs identifikators ir izteiksme
2. Katrs skaitlis ir izteiksme
3. Ja izt1 ir izteiksme, tad (izt1) arī ir izteiksme
4. Ja izt1 un izt2 ir izteiksmes, tad izt1+izt2 un izt1*izt2 ir izteiksmes
5. ...
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.
• ...
vesels skaitlis
Semantiskā analīze• Tiek uzkrāta informācija par datu tipiem
• Tiek izmantots sintakses analīzes rezultāts
• Var “pielabot” programmas tekstu
... + atrums * 17
Identifikators
Izteiksme
IzteiksmeIzteiksme
atrums 17
*Var paredzēt tipu pārveidošanu
vesels skaitlis
int_to_real
Kompilācijas fāzes
Leksikas analizētājs
Simbolu tabulas
dispečers
Kļūdu apstrādātājs
Sintakses analizētājs
Semantikas analizētājs
Starpkoda ģenerētājs
Koda optimizētājs
Koda ģenerētājs
izejas programma
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
2*a := 66; Unknown identifier
a := *33; Error in expression
a := 3+-+-+-+33; OK
a := 3/33; Type mismatch
b := (b = false) = true; OK
var a : integer; b : boolean;
Instrukciju iekšējā reprezentācija
pozicija := sakums + atrums * 17;Leksikas analizētājs
Sintakses analizētājs
id1 := id2 + id3 * 17
id1
17
:=
+
*id2
id3
Semantikas analizētājs
id1
17
:=
+
*
inttoreal
id2
id3
Instrukciju iekšējā reprezentācija(turp.)
Starpkoda ģenerētājs
temp1 := inttoreal(17)temp2 := id3 * temp1temp3 := id2 + temp2id1 := temp3
Koda optimizētājs
Koda ģenerētājs
temp1 := id3 * 17.0id1 := id2 + temp1
MOVF id3, R2MULF #17.0, R2MOVF id2, R1ADDF R2, R1MOVF R1, id1
Sintakses koka iekšējā reprezentācija
:=
+
*
id 3 num 17
id 1
id 2
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;