Süntaksi- ja semantilised vead

Translaatori ülesandeks on (peale transleerimise) ka vigade avastamine transleeritavas programmis. See on esimene, millega algaja programmeerija kokku puutub – translaator teatab, et tekstis olid vead ja et seda ei saa täita. Need esimestena leitud on süntaksivead - eksimused programmeerimiskeele õigekirjareeglite (süntaksi) suhtes – puuduvad semi­koolonid (C-s, Javas), puuduvad või valesti paigutatud sulud jne. Sageli toob üks viga kaasa palju teisi: kui näiteks C (C++, Java) keeles kirjutatud programmi deklaratsioonis

int x=0;

puudub deklaratsiooni lõpus semikoolon, jääb muutuja x deklareerimata ja translaator leiab vea kõikjal, kus muutuja x esineb – tema jaoks seda muutujat ei ole olemas (nn sekundaarsed vead).

Süntaksivead leiab translaator transleerimise esimestel etappidel (leksika- ja süntaksianalüüs) ja nendest lahtisaamine ei ole eriti suur probleem, kuid probleeme võib tekkida, kui programmi tahetakse kasutada mõne teise translaatoriga või teistsuguses arvutis. Sama programmeerimiskeele translaatorid, mis on tehtud kas erinevate program­meerimisfirmade poolt (Microsoft, IBM, Borland) või erineva operatsiooni­süsteemi ja/või protsessori jaoks, on sageli (veidi) erinevad. Kui (näiteks) Windowsi all töötav Microsofti C-keele translaator on programmi teksti vastu võtnud, ei tarvitse Borlandi C-translaator seda veel korrektseks tunnistada, ja vastupidi. Kuid isegi kui translaator on programmi vastu võtnud ja transleerinud, ei ole veel sugugi kindel, et tulemus on samasugune ja programm on vigadeta, sest kahjuks ei leia mõned translaatorid süntaksivigu, mida nad võiks ja peaks leidma. Sageli esinev näide on C-keeles if-lauses võrdlemisel omistamismärgi kasutamine, s.t programmi tekstis on kirjutatud:

if (x=1) then ...

Paljud translaatorid "hakkavad õiendama", kui if-then vahel oleva avaldise ümber pole sulge (see C, C++, Java keelte nõue on täiesti ülearune – on selge, et pärast if lugemist peab kuni then-ini olema loogiline avaldis), kuid ei märka, kui seal võrdlusmärgi == asemel on kasutatud omistamismärki = (nagu ülal) ja sooritavadki (midagi teatamata) omistamise; loomulikult on pärast seda programmi tulemus täiesti juhuslik.

Peale süntaksivigade võivad programmis olla ka sisulised, semantilised vead, s.t programmis kirja pandud sellised operatsioonid, mida pole võimalik sooritada. Paljude vigade kohta on üldse raske öelda, kas need on süntaksi- või semantilised vead:

Mõned neist vigadest (näiteks esimene, teine ja kolmas) on avastatavad transleerimise ajal; selliseid nimetatakse staatilise semantika vigadeks, kuid näiteks neljas ja viimane viga on transleerimisel avastatavad vaid väga lihtsatel erijuhtudel. Ka vale tüübiga muutuja kasutamine aritmeetilises avaldises või omistamisel on juba transleerimise ajal semantiliste tegevustega avastatav, kuid paljud translaatorid selliseid vigu ei avasta ja mõnedes programmeerimiskeeltes sede ei loetagi veaks, translaator peab tegema automaatselt tüübiteisenduse (kui see on võimalik).


lesandeid:
1. Ylesande tekst

Ksimused, probleemid: ©2004-2013 Jaak Henno