Pūķa grāmata

Download Report

Transcript Pūķa grāmata

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ā)
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
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.”
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ēze
mē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ē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
Ielādētājs/saišu redaktors
Absolūtais mašīnkods
Bibliotē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
sek :=
min * 60;
Tiks izdalīti sekojoši vienumi:
1.
2.
3.
4.
5.
6.
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 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ērs
pozicija := sakums + atrums * 17
Piešķiršana
:=
Identifikators
Izteiksme
pozicija
Izteiksme
+
Izteiksme
Identifikators
Izteiksme
*
Izteiksme
sakums
Identifikators
atrums
vesels skaitlis
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.
• ...
Semantiskā analīze
• Tiek uzkrāta informācija par datu tipiem
• Tiek izmantots sintakses analīzes rezultāts
• Var “pielabot” programmas tekstu
... + atrums * 17
Var paredzēt tipu
pārveidošanu
Izteiksme
Izteiksme
*
Izteiksme
Identifikators
int_to_real
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
Starpkoda ģenerētājs
Koda optimizētājs
Koda ģenerētājs
mērķa programma
Kļūdu
apstrādātājs
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;
a := 3+-+-+-+33;
Unknown identifier
Error in expression
OK
a := 3/33;
Type mismatch
b := (b = false) = true;
OK
2*a := 66;
a := *33;
Instrukciju iekšējā reprezentācija
pozicija := sakums + atrums * 17;
Leksikas analizētājs
id1 := id2 + id3 * 17
Sintakses analizētājs
:=
id1
+
id2
*
id3
Semantikas analizētājs
17
:=
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
MULF
MOVF
ADDF
MOVF
id3, R2
#17.0, R2
id2, R1
R2, R1
R1, id1
Sintakses koka iekšējā reprezentācija
:=
id 1
+
id 2
*
id 3
num
17
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;