Mikä on kääntäjäsuunnittelu? Tyypit, rakennustyökalut, esimerkki

⚡ Älykäs yhteenveto

Kääntäjän vaiheet kuvaavat kuutta vaihetta, jotka muuttavat lähdekoodin konekieliseksi koodiksi: leksikaalinen analyysi, syntaksianalyysi, semanttinen analyysi, välivaiheen koodin generointi, koodin optimointi ja koodin generointi, joita tukevat symbolitaulukon hallinta ja virheenkäsittely.

  • 🔤 Leksikaalinen analyysi: Skanneri ryhmittelee merkit tokeneiksi ja tallentaa ne symbolitaulukkoon.
  • 🌳 Syntaksianalyysi: Jäsennysohjelma tarkistaa kieliopin ja rakentaa tokeneista hierarkkisen jäsennyspuun.
  • ✔️ Semanttinen analyysi: Tässä vaiheessa varmistetaan tyyppien yhteensopivuus ja merkitys syntaksipuun avulla.
  • ⚙️ Code Sukupolvi: Välivaiheen koodi luodaan, optimoidaan ja lopulta käännetään kohdekonekoodiksi.
  • 📋 Tukirutiinit: Symbolitaulukko ja virheenkäsittelyrutiini ovat vuorovaikutuksessa jokaisen käännösvaiheen kanssa.

Kääntäjän vaiheet esimerkin kanssa: Käännösprosessi ja vaiheet

Mitkä ovat kääntäjän suunnittelun vaiheet?

A kääntäjä toimii eri vaiheissa, ja jokainen vaihe muuttaa lähdekoodiohjelman esitystavasta toiseen. Jokainen vaihe ottaa syötteitä edellisestä vaiheestaan ​​ja syöttää tulosteensa kääntäjän seuraavaan vaiheeseen. Kääntäjässä on kuusi vaihetta. Jokainen näistä vaiheista auttaa muuntamaan korkean tason kielen konekieleksi. Kääntäjän vaiheet ovat:

  1. Leksinen analyysi
  2. Syntaksianalyysi
  3. Semanttinen analyysi
  4. Keskitason koodigeneraattori
  5. Code Optimizer
  6. Code generaattori

Kääntäjän vaiheet

Kääntäjän vaiheet

Kaikki nämä vaiheet muuntavat lähdekoodia jakamalla sen tokeneihin, luomalla jäsennyspuita ja optimoimalla lähdekoodia eri vaiheiden kautta.

Vaihe 1: Leksinen analyysi

Leksikaalinen analyysi on ensimmäinen vaihe, jossa kääntäjä skannaa lähdekoodia. Tämä prosessi voi edetä vasemmalta oikealle, merkki merkiltä, ​​ja ryhmitellä nämä merkit tokeneiksi.

Tässä lähdekoodiohjelman merkkijono ryhmitellään mielekkäisiin sarjoihin tunnistamalla tunnukset. Se tekee vastaavat tunnukset syötteen symbolitaulukkoon ja siirtää tunnuksen seuraavaan vaiheeseen.

Tämän vaiheen päätehtävät ovat:

  • Tunnista lähdekoodin leksikaaliset yksiköt.
  • Luokittele leksikaaliset yksiköt luokkiin, kuten vakiot ja varatut sanat, ja syötä ne eri taulukoihin. Tämä jättää kommentit huomiotta lähdekoodiohjelmassa.
  • Tunnista merkki, joka ei ole osa kieltä.

Esimerkiksi: x = y + 10

Merkki Tyyppi
X tunniste
= Tehtäväoperaattori
Y tunniste
+ Lisäysoperaattori
10 numero

Vaihe 2: Syntaksianalyysi

Syntaksianalyysissä on kyse koodin rakenteen löytämisestä. Se määrittää, noudattaako teksti odotettua muotoa. Tämän vaiheen päätavoitteena on varmistaa, että ohjelmoijan kirjoittama lähdekoodi on oikein vai ei.

Syntaksianalyysi perustuu tietyn ohjelmointikielen sääntöihin rakentamalla jäsennyspuu tokeneiden avulla. Se määrittää myös lähdekielen rakenteen sekä kielen kieliopin tai syntaksin.

Tässä on luettelo tässä vaiheessa suoritettavista tehtävistä:

  • Hanki tokeneita leksikaaliselta analysaattorilta.
  • Tarkista, onko lauseke syntaktisesti oikein vai ei.
  • Ilmoita kaikista syntaksivirheistä.
  • Luo hierarkkinen rakenne, jota kutsutaan jäsennyspuuksi.

esimerkki

Mikä tahansa tunniste/numero on lauseke. Jos x on tunniste ja y+10 on lauseke, niin x = y+10 on lauseke. Tarkastellaan seuraavan esimerkin jäsennyspuuta:

(a+b)*c

Esimerkki syntaksianalyysistä

Jäsennyspuussa:

  • Sisäsolmu: tietue, jossa on operaattorikenttä ja kaksi kenttää lapsille.
  • Lehti: tietueet, joissa on vähintään kaksi kenttää; yksi tokenille ja muita tokenin tietoja varten.
  • Varmista, että ohjelman osat sopivat mielekkäästi yhteen.
  • Kerää tyyppitiedot ja tarkistaa tyyppien yhteensopivuuden.
  • Tarkistukset, ovatko lähdekielen sallimat operandit.

Vaihe 3: Semanttinen analyysi

Semanttinen analyysi tarkistaa koodin semanttisen johdonmukaisuuden. Se käyttää edellisen vaiheen syntaksipuuta symbolitaulukon kanssa varmistaakseen, että annettu lähdekoodi on semanttisesti johdonmukainen. Se myös tarkistaa, välittääkö koodi asianmukaista merkitystä.

Semanttinen analysaattori tarkistaa tyyppien yhteensopimattomuudet, yhteensopimattomat operandit, virheellisillä argumenteilla kutsutut funktiot, määrittämättömät muuttujat jne.

Semanttisen analyysin vaiheen toiminnot ovat:

  • Auttaa tallentamaan kerätyt tyyppitiedot ja tallentamaan ne symbolitaulukkoon tai syntaksipuuhun.
  • Mahdollistaa tyyppitarkistuksen suorittamisen.
  • Tyyppiristiriidan tapauksessa, jossa ei ole tarkkoja tyypinkorjaussääntöjä, jotka täyttäisivät halutun operaation, näytetään semanttinen virhe.
  • Kerää tyyppitietoja ja tarkistaa tyyppien yhteensopivuuden.
  • Tarkistaa, salliiko lähdekieli operandit vai ei.

esimerkki

float x = 20.2;
float y = x*30;

Yllä olevassa koodissa semanttinen analysaattori tyypittää kokonaisluvun 30 liukulukuksi 30.0 ennen kertolaskua.

Vaihe 4: Keskitaso Code Sukupolvi

Kun semanttinen analyysivaihe on ohi, kääntäjä luo kohdekoneelle välivaiheen koodin. Se edustaa ohjelmaa joillekin abs-tiedostoille.tract-kone.

Välivaiheen koodi on korkean tason ja konekielen välissä. Tämä välivaiheen koodi on luotava siten, että se on helppo kääntää kohdekonekielelle.

Välitason toiminnot Code sukupolvi:

  • Se tulisi luoda lähdekoodiohjelman semanttisesta esityksestä.
  • Säilyttää muunnosprosessin aikana lasketut arvot.
  • Auttaa kääntämään välivaiheen koodin kohdekielelle.
  • Antaa sinun säilyttää lähdekielen tärkeysjärjestyksen.
  • Se sisältää käskyn oikean määrän operandeja.

esimerkki

Esimerkiksi:

total = count + rate * 5

Osoitekoodimenetelmän avulla luotu välikoodi on:

t1 := int_to_float(5)
t2 := rate * t1
t3 := count + t2
total := t3

Vaihe 5: Code Optimointi

Seuraava vaihe on välivaiheen koodin optimointi. Tässä vaiheessa poistetaan tarpeettomat koodirivit ja järjestetään lausekkeiden järjestys ohjelman suorituksen nopeuttamiseksi resurssien tuhlaamatta. Tämän vaiheen päätavoitteena on parantaa välivaiheen koodia, jotta se toimii nopeammin ja vie vähemmän tilaa.

Tämän vaiheen päätehtävät ovat:

  • Se auttaa sinua löytämään kompromissin suorituksen ja käännösnopeuden välillä.
  • Parantaa kohdeohjelman suoritusaikaa.
  • Luo virtaviivaistetun koodin, joka on edelleen välimuotoisessa esitystavassa.
  • Saavuttamattoman koodin poistaminen ja käyttämättömien muuttujien hävittäminen.
  • Muuttumattomien lauseiden poistaminen silmukasta.

Esimerkiksi: Harkitse seuraavaa koodia:

a = intofloat(10)
b = c * a
d = e + b
f = d

Voi tulla:

b = c * 10.0
f = e + b

Vaihe 6: Code Sukupolvi

Code Suorittaminen on kääntäjän viimeinen ja päätösvaihe. Se saa syötteitä koodin optimointivaiheesta ja tuottaa tuloksena sivukoodin tai objektikoodin. Tämän vaiheen tavoitteena on varata tallennustilaa ja luoda siirrettävää konekoodia.

Se myös varaa muistipaikkoja muuttujille. Välivaiheen koodin käskyt muunnetaan konekäskyiksi. Tämä vaihe muuntaa optimoidun tai välivaiheen koodin kohdekielelle.

Kohdekieli on konekieli. Siksi kaikki muistipaikat ja rekisterit valitaan ja varataan myös tässä vaiheessa. Tässä vaiheessa luotu koodi suoritetaan ottamaan vastaan ​​syötteitä ja tuottamaan odotettuja tuloksia.

esimerkki

a = b + 60.0 voitaisiin mahdollisesti muuntaa rekistereiksi seuraavasti:

MOVF a, R1
MULF #60.0, R2
ADDF R1, R2

Symbolitaulukon hallinta

Symbolitaulukko sisältää tietueen jokaista tunnistetta varten sekä kenttiä tunnisteen attribuuteille. Tämä komponentti helpottaa kääntäjän hakua tunnistetietueesta ja sen nopeaa noutoa. Symbolitaulukko auttaa myös laajuuden hallinnassa. Symbolitaulukko ja virheenkäsittelijä ovat vuorovaikutuksessa kaikkien vaiheiden kanssa, ja symbolitaulukkoa päivitetään vastaavasti.

Virheenkäsittelyrutiini

Kääntäjän suunnitteluprosessissa virheitä voi esiintyä kaikissa alla annetuissa vaiheissa:

  • Leksikaalinen analysaattori: Väärin kirjoitetut tunnukset.
  • Syntaksianalysaattori: Puuttuva sulke.
  • Välivaiheen koodigeneraattori: Operaattorin operandit eivät täsmää.
  • Code Optimoija: Kun lause ei ole tavoitettavissa.
  • Code Generator: Kun muisti on täynnä tai oikeita rekistereitä ei ole allokoitu.
  • Symbolitaulukot: Useiden ilmoitettujen tunnisteiden virhe.

Yleisimmät virheet ovat virheelliset merkkijonot skannauksessa, virheelliset token-jonot tyypissä, laajuusvirhe ja jäsennys semanttisessa analyysissä.

Virhe voi ilmetä missä tahansa yllä mainituista vaiheista. Virheiden löytämisen jälkeen vaiheen on käsiteltävä virheet voidakseen jatkaa käännösprosessia. Nämä virheet on ilmoitettava virheenkäsittelijälle, joka käsittelee virheen ja suorittaa käännösprosessin. Yleensä virheet raportoidaan viestin muodossa.

UKK

Kyllä. Tekoälyavustajat voivat selittää jokaisen vaiheen, tracmiten esimerkkikoodista tulee tokeneja ja jäsentää puita, ja osoittaa, missä syntaksi- tai semanttinen virhe syntyy. Ne ovat hyödyllisiä opiskelun apuvälineitä, mutta tarkistavat selitykset kurssimateriaalia vasten.

Koneoppiminen pystyy ennustamaan, mitkä optimointivaiheet tuottavat nopeimman koodin tietylle ohjelmalle ja koneelle, hienosäätämällä valintoja, jotka aiemmin olivat käsintehtyjä heuristiikkoja. Kääntäjän on silti taattava, että optimoitu ohjelma toimii täsmälleen samalla tavalla kuin alkuperäinen.

Käyttöliittymä käsittelee leksikaalisen, syntaksiaalisen ja semanttisen analyysin sekä välivaiheen koodin, ja se on riippuvainen lähdekielestä. Taustajärjestelmä käsittelee optimoinnin ja koodin luomisen, ja se on riippuvainen kohdekoneesta. Tämä jako yksinkertaistaa uudelleenkohdistamista.

Ei. Leksikaalinen analyysi (skannaus) ryhmittelee merkit tokeneiksi, kun taas jäsennys (syntaksianalyysi) järjestää nämä tokenit jäsennyspuuksi kielioppisääntöjen mukaisesti. Leksikaalinen analyysi suoritetaan ensin ja syöttää tokenit jäsentimelle.

Tiivistä tämä viesti seuraavasti: