Loomulikud keeled ja programmeerimiskeeled

Loomuliku keele lausest ja programmeerimiskeeles kirjutatud programmist saame me aru sellepärast, et me tunneme ära nende struktuuri, süntaksi. Süntaksi abil saame me aru, kes/mis on lauses tegija (alus) ja mida see/ta teeb, s.t. kus on öeldis, kuidas tegijat on iseloomustatud (milline on täiend) ja kuidas tegevus toimus (määrus). Täpselt samuti määrab programmi süntaks, milliseid operatsioone tuleb sooritada ja millisele muutujale tulemus tulemus omistada. Nii loomuliku keele teksti kui ka programmeerimiskeeles kirjutatud programmist "arusaamine" põhineb vaid süntaksil.

Loomuliku keele teksti süntaksit võib kirjeldada nii:

Tekst Lause | Lause Tekst
-- s.t. tekst koosneb ühest või enamast lausest
Lause Aluserühm Öeldiserühm
-- s.t. lause koosneb aluserühmast ja sellele järgnevast öeldiserühmast
Aluserühm Alus | Täiend Alus
-- s.t. aluserühm on kas lihtsalt alus või alus koos eelneva täiendiga
Alus Nimisõna
Täiend Omadussõna
Öeldiserühm Öeldis | Öeldis Määrus
Öeldis Tegusõna
Määrus Määrsõna
Nimisõna "auto" | "poiss" | "päike" | "elevant" | "kurk" | "idee" | "ideed" ...
Omadussõna "roheline" | "värvitu" | "värvitud" | "suur" | "ilus" | "piklik" | ...
Tegusõna "sõidab" | "jookseb" | "laulab" | "magavad" | "loeb" | "sajab" | ...
Määrsõna "kiiresti" | "ruttu" | "kaua" | "rõõmsalt" | "raevukalt" | "ilusasti" | ...

Sellise "ülalt-alla" kirjelduse (grammatika) reegleid rahuldavad näiteks laused :

Suur poiss jookseb kiiresti
Sinine auto sõidab ilusasti

aga ka laused

Piklik päike sajab kiiresti
Värvitud rohelised ideed magavad raevukalt

Viimane lause on vaba tõlge Chomsky kuulsast näitest Colorless green ideas sleep furiously - lause, millega ta illustreeris oma meetodi piiratust ja mis hiljem on olnud arvukate arutluste, paroodiate, poeemide jne lähtekohaks. Sellise süntaktiliselt korrektse, kuid semantiliselt (tähenduslikult) mõttetu lause esitas juba paarkümmend aastat varem eesti kirjanik Eduard Vilde : "Jänesed jooksevad vihmaveetorusid mööda igaviku poole, murumunad suus".- vorm (süntaks) on korrektne, kuid tähendust (semantikat) pole üldse.

On selge, et ülaltoodud reeglid kirjeldavad vaid lausete süntaksit, vormilist korrektsust, mitte nende sisulist (semantilist) korrektsust. Semantika, s.t. lause sisust aru saamine on osutunud nii suureks probleemiks, et peale ulmefilmi arvuti HAL ei tule ükski arvuti sellega veel toime.

Analoogiliselt võib kirjeldada programmeerimiskeele süntaksit. Järgnevas on esitatud väga lihtsa programmeerimiskeele Pisi-Algoli süntaksi kirjeldus.

Programm Käsk;
Programm Käsk; Programm
-- programm on kas üksainus käsk või käsk ja sellele järgnev samasuguse süntaksiga jada, s.t. käskude jada
Käsk Omistamine |Tingimuskäsk |Tsükkel | Kirjutamine | Lugemine
Omistamine Identifikaator := Avaldis
Identifikaator Täht | Indentifikaator Täht | Identifikaator Number
-- identifikaator algab tähega ja selle järel võib olla ükskõik kui palju tähti või numbreid
Avaldis Identifikaator | Konstant| Identifikaator Operand Avaldis | (Avaldis)
-- avaldis on kas üksainus identifikaator või arvkonstant või identifikaator ja sellele järgnev (binaarne) operand ja (alam)avaldis; avaldis võib olla ka sulgudesse võetud (teine) avaldis
Konstant Number | Number Konstant
Number 0| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Täht A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
--Konstandid on vaid täisarvud ja lubatud on vaid suurtähed!
Operand + | - | * | /
--Operandid on vaid neli aritmeetilist tehet!
Tingimuskäsk IF tingimus THEN programm ENDIF
Tingimus Avaldis Tingimusop Avaldis
Tsükkel WHILE tingimus DO Programm ENDLOOP
Tingimusop = | > | <
Kirjutamine PRINT Identifikaator
Lugemine READ Identifikaator

Lihtne on kontrollida, et järgnev programm (see arvutab N-da Fibonacci arvu F2) rahuldab selle keele süntaksireegleid:

READ N;
F0 := 0;
F1 := 1;
WHILE I < N DO
F2 := F0 + F1;
F0 := F1;
F1 := F2;
ENDLOOP;
PRINT F2;


Ülesandeid:
1. Laienda ülaltoodud kirjeldust nii, et programmis oleks lubatud kasutada ka reaalarve (lubatud kirjaviisid: 3.14, .5, -2., 3.67e-12)
2. Laienda eespooltoodud kirjeldust nii, et IF-lauses võiks kasutada ka ELSE-osa (kuid tingimuslauset võiks kasutada ka ilma ELSE-osata ).
3. Laienda ülaltoodud kirjeldust nii, et programmis oleks lubatud kasutada ka DO ... UNTIL ... ENDDO, WHILE ... DO ... ENDWHILE konstruktsioone.
4. Miks ülaltoodud näidetes kasutatakse kõigis liitkonstruktsioonides (IF..., STEP..., DO..., WHILE ...) igal konstruktsiooni lõpumärgendit (ENDIF, ENDSTEP, ENDDO, ENDWHILE), millised eelised see annab ?
5. Kui IF-lause (ELSE-osaga ) oleks ilma lõpumärgendita ENDIF, kas järgmine programmilõik oleks siis üheselt mõistetav (eespool on reavahetust kasutatud vaid lugemise lihtsustamiseks, reavahetus ei ole programmilausete eraldaja!):

IF X > 0 THEN IF Y > X THEN Z = X + Y ELSE Z = Y / 2

6. Kas kõigis liitkonstruktsioonides võiks kasutada ühesugust lõpumärgendit?
7. Ülalesitatud eesti keele grammatika ei luba alusele mitut täiendit (s.t. "värvitud rohelised ideed" ei ole ülaltoodud reeglite järgi korrektne süntaks). Muuda kirjeldust nii, et
- alusel võiks olla mitu täiendit ja öeldisel mitu määrust (ükskõik kui palju: 0,1,2, ... ); - tee eelmise punkti jaoks reeglid nii, et täiendite vahel oleks lubatud ka koma või sõna "ja" (näit "suur kuldne päike", "pisike, räpane ja karjuv poiss").

Küsimused, probleemid: ©2004 Jaak Henno