Keel on kommunikatsioonivahend, meetod informatsiooni edastamiseks. Märgisüsteemi (keel) abil millegi edastamiseks on tarvis algul kokku leppida, milliste märkidest moodustatud struktuuridega seda tehakse - on tarvis määrata keele süntaks. Süntaks määrab keele formaalse kuju, vorm. Programmeerimiskeele süntaks määrab näiteks, kuidas kirjutatakse if-lause - kas sõna then on kohustuslik, kas if-lause lõpeb mingi lõpumärgendiga (endif), kas iga käsu lõpus peab olema mingi eraldaja (Javascript - eraldaja pole vajalik, kui järgnev käsk on uuel real; Prolog-is peab iga predikaadi lõpus olema punkt) või peab olema eraldaja käskude vahel (Pascal - viimase käsu järel ei ole eraldajat), kas tingimuslauses tingimuse ümber peavad olema mingid eraldajad (C-s - sulud) või mitte jne. Süntaksi kirjeldamisel kasutatakse programmis esinevaid kõige väiksemaid jagamatuid märgijadasid: arve, identifikaatoreid, keele võtmesõnu (if, then,...) - need on lekseemid (tokens) ja nende õigekirjareeglid moodustavad keele leksika: milliseid märke programmi tekstis üldse võib esineda, kuidas kirjutatakse identifikaatorid, kui pikad nad võivad olla jne), kuidas kirjutatakse arvud (millise kujuga võivad olla reaalarvud) jne.
Edasi peab olema teada, mida süntaksiga lubatud kontruktsioonid tähendavad, milline on keele semantika.
Programmeerimiskeele loojate ja kasutajate jaoks on olulised ka keele praktilise kasutamise aspektid, keele pragmaatika - milliste ülesannete lahendamiseks üks või teine keel on mõeldud, kui mugav keel on kasutajale, kui kiire on keele translaator/interpretaator jne. Näiteks C (C++, C#) on väga kiired, kuid nendes programmeerimine on üsna vaevaline, sest selle pere keeled on kõik väga arvutilähedased ja neid puuduvad paljud kaasaja kõrgkeeltes esinevad konstruktsioonid (C-s puudub isegi stringi tüüp) ja kuna translaator peaaegu midagi ei kontrolli, siis võivad kergesti tekkida vead ja programmidesse turvaaugud; Java on universaalne (selles kirjutatud programmi peaks saama kasutada ükskõik millises operatsioonisüsteemis), kuid kaheastmelise transleerimise tõttu üsna aeglane; Ada translaator kontrollib peaaegu kõike, mida translaator üldse saab kontrollida, sellepärast kasutatakse Adat kriitiliste süsteemide (näiteks raketijuhtimissüsteemid) programmeerimisel; Basic ja Pascal on lihtsa süntaksiga, s.t. sobivad algajatele, kuid neis puuduvad paljud kaasaja kõrgkeeltes kasutatavad andmestruktuurid jne.
Keele süntaksi ja semantika peab esitama väga täpselt, sest programmeerimiskeele süntaksi ja semantika kirjeldus on aluseks translaatori koostajatele - ükskõik millise translaatoriga transleerides ja ükskõik millises operatsioonisüsteemis käivitades peab programm andma sama tulemuse. Süntaksi kirjeldamiseks kasutatakse tavaliselt kontekstivabasid grammatikaid ja nende erikujusid: BNF, EBNF, RBNF. Semantika kirjeldamiseks kasutatakse mitmeid meetodeid: käskude töö kirjeldamist mingis lihtsas formaalses anvutis (nn operatsiooniline semantika); käskude tõlkimist mingisse lihtsasse matemaatilisse formalismi (denotatsiooniline semantika), käskude tähenduse kirjeldamine mingis (lihtsas) aksiomaatilises süsteemis (aksiomaatiline semantika) jne. Keele konstruktsioonidele range matemaatilise kirjelduse andmine võimaldab programme tõestada - näidata, et nad vastavad ülesande kirjeldusele (see kirjeldus peab olema esitatud sama formalismi abil).
Esimese mulje programmeerimiskeelest annab selle süntaks - kui arusaadav keel on, kuivõrd see sarnaneb loomulikule keelele ja kui vähe (või palju) kasutatakse selles nn "süntaktilist suhkrut" (syntactic sugar) - sulge, semikooloneid jne mis on vajalikud vaid translaatorile programmi struktuuri kindlakstegemiseks ja mis (tavaliselt) suurendavad vaid programmeerimisel tekkivate süntaksivigade arvu. Järgnevas on programm, mis väljastab täisarvude 1..10 ruudud, esitatud mitmes erinevas programmeerimiskeeles - milline neist näib arusaadavam ja lihtsam, s.t. kasutajasõbralikum:
A+ - APL-tüüpi vaba programmeerimiskeel, levitatakse GNU GPL (General Public Licence) alusel:
(1 + 10)*2
APL-keele operaator moodustab vektori, s.t. 10 on vektor 1..10;C++
#include <iostream> using namespace std; int main() { int square[100]; int i; /* loop index */; int k; /* the integer */ /* Calculate the squares */ for (i = 0; i < 100; i++) { k = i + 1; /* i runs from 0 to 99 */ /* k runs from 1 to 100 */ square[i] = k*k; cout << "The square of " << k << " is " << square[i] << endl; } return 0; } |
K - unikaalne vaba programmeerimiskeel Windows ja Solaris/Linux operatsioonisüsteemile; ühendab endas APL-i ja funktsionaalsete programmeerimiskeelte jooni; väga kõrgetasemeliste funktsioonide tõttu osutus testprogramm, mis Visual Basic-us oli 200-realine ja Java-s 350-realine, K-s kirjutatuna vaid 9-realiseks ja umbes sada korda kiiremaks
i:1 + !10
`0:5:i*i