A sastādītājs ir programma kas tulko cilvēkiem lasāmu avota kods datorā izpildāmā mašīnas kodā. Lai to izdarītu veiksmīgi, cilvēkam lasāmajam kodam ir jāatbilst sintakse jebkuras programmēšanas valodas noteikumi. Kompilators ir tikai programma, un tas nevar jums noteikt jūsu kodu. Ja esat pieļāvis kļūdu, jums ir jāizlabo sintakse, pretējā gadījumā tā netiks apkopota.
Kas notiek, sastādot kodu?
Kompilatora sarežģītība ir atkarīga no valodas sintakse un no tā, cik daudz abstrakcijas šī programmēšanas valoda nodrošina. C kompilators ir daudz vienkāršāks nekā C ++ vai C # kompilators.
Leksiskā analīze
Apkopojot, kompilators vispirms nolasa rakstzīmju straumi no avota koda faila un ģenerē leksisko marķieru straumi. Piemēram, C ++ kods:
int C = (A * B) +10;
varētu analizēt, jo šie marķieri:
- ierakstiet “int”
- mainīgais "C"
- vienāds
- kreisā kronšteina
- mainīgais "A"
- reizes
- mainīgais "B"
- labais kronšteins
- plus
- burtiski "10"
Sintaktiskā analīze
Leksiskā izvade nonāk kompilatora sintaktiskā analizatora daļā, kas, izmantojot gramatikas noteikumus, izlemj, vai ievadīšana ir derīga vai nē. Ja vien
mainīgie A un B iepriekš tika deklarēti un bija spēkā, kompilators varētu teikt:- “A”: nedeklarēts identifikators.
Ja tie tiktu deklarēti, bet netiktu inicializēti. kompilators izdod brīdinājumu:
- vietējais mainīgais “A” tiek izmantots bez inicializācijas.
Nekad nevajadzētu ignorēt kompilatoru brīdinājumus. Viņi var salauzt jūsu kodu dīvainā un negaidītā veidā. Vienmēr labojiet kompilatoru brīdinājumus.
Viena caurlaide vai divas?
Dažas programmēšanas valodas ir rakstītas, lai kompilators varētu tikai vienu reizi nolasīt avota kodu un ģenerēt mašīnas kodu. Paskāls ir viena no šādām valodām. Daudzi sastādītāji pieprasīt vismaz divas piespēles. Dažreiz tas ir saistīts ar iepriekšējām deklarācijām funkcijas vai nodarbības.
C ++ klasē klasi var deklarēt, bet ne vēlāk kā vēlāk. Kompilators nespēj noskaidrot, cik daudz atmiņas nepieciešams klasei, kamēr tas nav apkopojis klases korpusu. Pirms pareiza mašīnas koda ģenerēšanas tam ir atkārtoti jāizlasa avota kods.
Mašīnas koda ģenerēšana
Pieņemot, ka kompilators veiksmīgi pabeidz leksisko un sintaktisko analīzi, pēdējā posmā tiek ģenerēts mašīnas kods. Tas ir sarežģīts process, īpaši ar moderniem CPU.
Apkopotā ātrums izpildāms kodam vajadzētu būt pēc iespējas ātram, un tas var ievērojami atšķirties atkarībā no ģenerētā koda kvalitātes un tā, cik liela tika pieprasīta optimizācija.
Lielākā daļa kompilatoru ļauj norādīt optimizācijas apjomu - parasti tas ir pazīstams ar ātro atkļūdošanas kompilāciju un pilnīgu atbrīvotā koda optimizāciju.
Kodu ģenerēšana ir izaicinoša
Rakstot kodu ģeneratoru, kompilatoru rakstītājs saskaras ar izaicinājumiem. Daudzi procesori paātrina apstrādi, izmantojot
- Instrukcija cauruļvadi
- Iekšējais kešatmiņas.
Ja visas instrukcijas ar kodu cilpa var turēt Procesors kešatmiņu, šī cilpa darbojas daudz ātrāk nekā tad, kad CPU ir jāielādē instrukcijas no galvenās operatīvās atmiņas. CPU kešatmiņa ir CPU mikroshēmā iebūvēts atmiņas bloks, kuram piekļūst daudz ātrāk nekā galvenajā operatīvajā atmiņā esošie dati.
Kešatmiņas un rindas
Lielākajai daļai CPU ir iepriekšielādes rinda, kurā CPU pirms izpildīšanas nolasa instrukcijas kešatmiņā. Ja notiek nosacīta filiāle, centrālajam procesoram ir atkārtoti jāielādē rinda. Kods jāģenerē, lai to samazinātu.
Daudziem CPU ir atsevišķas daļas:
- Vesels skaitlis aritmētiskais (veseli skaitļi)
- Aritmētiskais peldošā komata (frakcionētie skaitļi)
Šīs darbības bieži var veikt paralēli, lai palielinātu ātrumu.
Kompilatori parasti ģenerē mašīnas kodu objektu failos, kas ir tad saistīts kopā ar Linker programmu.