Ohjelmointikieli

Historia

Ada Lovelace kirjoitti 1800-luvulla Charles Babbagen analyyttiselle koneelle askeleellisen sarjan käskyjä, ja Lovelacea pidetään ensimmäisenä tietokoneohjelmoijana.
Ensimmäisenä ylemmän tason ohjelmointikielenä pidetään Konrad Zusen 1940-luvulla kehittämää Plankalkülia. Kielen kuvaus julkaistiin kuitenkin vasta 1972, eikä sitä toteutettu hänen elinaikanaan oikeassa tietokoneessa.
Small-Scale Experimental Machine oli ensimmäinen tietokone, jossa ohjelma voitiin tallettaa tietokoneen muistiin. Myöhempien tietokoneiden ominaisuudet lisäsivät tarvetta käsitellä ohjelmointia ylemmällä tasolla ja kehitettiin symboliset konekielet (ks. assembly). Tarve ylemmän tason ohjelmointikielille johti muun muassa ALGOLin, COBOLin ja FORTRANin kehittämiseen.

Yleistä

Ohjelmointikielet ovat monin tavoin luonnollisten kielten kaltaisia. Niillä on oma sanastonsa ja kielioppisäännöstönsä; näistä kahdesta muodostuu kielen syntaksi eli lauseoppi. Niillä on myös looginen merkitys, jota kutsutaan semantiikaksi. Esimerkiksi lause "Koira puri luuta" on sekä syntaktisesti (lauseopillisesti) oikein että semanttisesti (merkitykseltään) mielekäs. Sen sijaan lause "Luu puri koiraa" on syntaktisesti oikein mutta semanttisesti epämielekäs. Vastaavasti ohjelmakoodin syntaktinen oikeellisuus, eli se, että kääntäjä kykenee kääntämään lähdekoodin konekieliseksi ei vielä tarkoita, että ohjelma toimii aiotulla tavalla. 
Ohjelmointikielten kielentutkimus eli lingvistiikka on hyvin samankaltaista kuin luonnollistenkin kielten tutkimus. Toisaalta ohjelmointikielet ovat luonnollista kieltä huomattavasti yksinkertaisempia, muun muassa varattujen sanojen hyvin pienen lukumäärän vuoksi: tyypillisesti ohjelmointikielten sanasto on alle sata sanaa.
Ohjelmointikielten kielioppisäännöt ovat paljon yksinkertaisempia kuin luonnollisten kielten, säännöt ovat yksikäsitteisiä, ja mielekkäitä vaihtoehtoisia ilmaisutapoja on rajallinen määrä. Esimerkiksi luonnollisen kielen ilmaisut "pienennä saldoa kymmenellä", "vähennä 10 saldosta", "ota kymmenen pois saldosta", "aseta saldoksi kymmenen vähemmän" ja niin edelleen tarkoittavat kaikki samaa ja ovat mielekkäitä, kun taas useimmilla ohjelmointikielillä asian voi ilmaista vain yhdellä tai kahdella tavalla, esimerkiksi "saldo -= 10;", tai "saldo = saldo-10;".
C-kielessä vaihtoehtoja on runsaasti, sillä kokonaislukumuuttujan arvoon voi lisätä yhden neljällä eri tavalla:
muuttuja = muuttuja + 1;muuttuja += 1;++muuttuja;muuttuja++;
Erillisinä lauseina näiden merkitys on aivan sama, eli muuttujan arvon kasvattaminen yhdellä, mutta lausekkeen osana viimeisen rivin merkitys poikkeaa aiemmista. Kolme ylintä palauttaa lausekkeen osana ollessaan muuttujan uuden arvon, kun alin palauttaa vanhan, vaikka kasvattaakin itse muuttujan arvoa.
Jos kielessä on monia vaihtoehtoisia toimintoja, kaikki ohjelmoijat eivät välttämättä tunne niistä kaikkia harvinaisempia ja voivat jättää käyttämättä tilanteeseen parhaiten sopivaa piirrettä.
Ohjelmointikieliä on suunniteltu lukuisiin eri tarkoituksiin ja niitä voi arvioida eri tavoilla. Tärkeitä tavoitteita ohjelmointikielen suunnittelussa ovat muun muassa luettavuus, kirjoitettavuus ja yleinen yksinkertaisuus - eli kuinka hyvin kerran kirjoitetusta ohjelmasta saa selvää joku muukin kuin alkuperäinen ohjelmoija. Toisissa kielissä painotetaan lähdekoodin selkeyttä (Java) ja toisissa ilmaisuvoimaa (Perl), jälkimmäisessä selkeyden kustannuksella. Tietokoneiden alkuaikoina ohjelmointikielten ja kääntäjien kehityksessä pääpaino oli tukea mahdollisimman tehokkaasti laiteresursseja hyödyntävän konekielen tuottamista (C), mutta noin 1970-luvulta alkaen ohjelmiston elinkaareen alettiin kiinnittää enemmän huomiota kun toimitettujen ohjelmien ylläpito alkoi nousta merkittäväksi kustannustekijäksi ja liiketoiminnaksi. Samalla kääntäjät kehittyivät niin tehokkaiksi, että lähdekoodin manuaalisen optimoinnin merkitys vähentyi, lukuun ottamatta nopeuskriittisiä reaaliaikasovelluksia, digitaalista signaalinkäsittelyä, laiteajureita ja usein ajettavia algoritmeja.
Eri kielten ominaisuudet eroavat toisistaan muun muassa kontrollirakenteiden, tietotyyppien, ilmaisuvoiman, abstraktiotason ja turvallisuuden suhteen. Turvallisuuteen kuuluvat muun muassa tyyppitarkistukset ja virhetilanteiden hallinta.