Ohjelmointikielten kehityshistoriaa

Samankaltaiset tiedostot
815338A Ohjelmointikielten periaatteet

812341A Olio-ohjelmointi, I Johdanto

1. Olio-ohjelmointi 1.1

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

Johdanto Meta Kielten jaotteluja Historia. Aloitusluento. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho

815338A Ohjelmointikielten periaatteet

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

Olio-ohjelmointi Johdanto olio-ohjelmointiin

4. Lausekielinen ohjelmointi 4.1

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Johdatus ohjelmointiin

Imperatiivisten ohjelmien organisointiparadigmojen. historia

Imperatiivisten ohjelmien organisointiparadigmojen historia

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

Prolog kielenä Periaatteet Yhteenveto. Prolog. Toni ja Laura Fadjukoff. 9. joulukuuta 2010

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

ELM GROUP 04. Teemu Laakso Henrik Talarmo

11/20: Konepelti auki

815338A Ohjelmointikielten periaatteet

4. Lausekielinen ohjelmointi 4.1

Käyttöjärjestelmien historia. Joni Herttuainen Henri Jantunen Markus Maijanen Timo Saksholm Johanna Tjäder Eetu Turunen

Ohjelmoinnista. Ohjelmien toteutukseen tarjolla erilaisia välineitä:

Maarit Harsu. O h j e l m o i n t i k i e l e t Periaatteet, käsitteet, valintaperusteet

Haskell ohjelmointikielen tyyppijärjestelmä

Dart. Ryhmä 38. Ville Tahvanainen. Juha Häkli

.NET ajoympäristö. Juha Järvensivu 2007

Ohjelmoinnin peruskurssien laaja oppimäärä

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

.NET ja C# Virtuaalikone. Common Language Infrastructure (CLI) Periaate. Etuja. Haittoja. Mikä on CLI. CLI standardin merkitys (CLS, Ecma)

Common Lisp Object System

TIE542 Ohjelmointikielten periaatteet, syksy Antti-Juhani Kaijanaho. 6. syyskuuta 2010

Johdantoa ohjelmointikielten periaatteisiin

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Johdanto. 1. Mikä on ohjelmointikieli?

Varhaiset oliokielet Modula, CLU ja Smalltalk. T : Seminar on the History of Programming Languages Kari Koskinen Otaniemi 29.9.

D-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

815338A Ohjelmointikielten periaatteet

Lisää pysähtymisaiheisia ongelmia

Ohjelmistojen mallintaminen, mallintaminen ja UML

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

TIE Principles of Programming Languages CEYLON

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

Soveltuvuustutkimus Lifebelt-ohjelman ideologian käytettävyydestä olioorientoituneeseen

Tietojenkäsittelyn historiaa

Clojure, funktionaalinen Lisp murre

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet

Ohjelmointikielien kehittyminen

ADA. Ohjelmointikieli. Ryhmä 5 Henna Olli, Päivi Hietanen

OHJ-1010 Tietotekniikan perusteet 4 op Syksy 2012

Algoritmit 1. Luento 3 Ti Timo Männikkö

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T

11.4. Context-free kielet 1 / 17

Ohjelmoinnin peruskurssien laaja oppimäärä

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

Tällä kurssilla tarkastellaan ohjelmointikieliä. Lienee tarpeen yrittää rajata, mitä

Luento 1 (verkkoluento 1) Tietokonejärjestelmä

Käännös, linkitys ja lataus

TIEA341 Funktio-ohjelmointi 1, kevät 2008

815338A Ohjelmointikielten periaatteet: Logiikkaohjelmointi. Logiikkaohjelmointi

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Tietorakenteet ja algoritmit

Sisällys. JAVA-OHJELMOINTI Osa 1: Ohjelmoinnin perusteita. Ohjelmoinnin kehityssuuntia. Ohjelmointi luvuilla. Ohjelmointi luvuilla

Ohjelmointikielten periaatteiden taustaa

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus

8. Kieliopit ja kielet

Sisällys. Ratkaisumallien historia. Ratkaisumalli. Ratkaisumalli [2] Esimerkki: Composite [2] Esimerkki: Composite. Jaakko Vuolasto 25.1.

Ohjelmoinnin peruskurssien laaja oppimäärä

Järjestelmäarkkitehtuuri (TK081702)

Luento 1 Tietokonejärjestelmän rakenne

815338A Ohjelmointikielten periaatteet

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

JS-kehitys - yleiskuvaus. TIEA255 - Juho Vepsäläinen

15. Ohjelmoinnin tekniikkaa 15.1

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Kertausluento luennoista 1-3 1

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 19. tammikuuta 2012

Apuja ohjelmointiin» Yleisiä virheitä

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

1. Ohjelmoinnin peruskäsitteet ja -elementit

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Ohjelmoinnin peruskurssien laaja oppimäärä

Tutoriaaliläsnäoloista

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

Ohjelmointi 1 / syksy /20: IDE

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

A TIETORAKENTEET JA ALGORITMIT

Tieto- ja tallennusrakenteet

Transkriptio:

Ohjelmointikielten kehityshistoriaa Tässä osassa tarkastellaan tavallisimpien ja ohjelmointikielten kehityksen kannalta merkittävien kielten kehityshistoriaa. Pääasiallisena lähteenä on käytetty Sebestan kirjan ([Seb]) lukua 2. 1. Ohjelmointikielten sukupolvijako Ohjelmointikielet jaetaan usein viiteen sukupolveen, vaikka onkin epäselvää, mistä jaottelu on saanut alkunsa. Ensimmäiset ohjelmointikielet olivat puhtaita konekieliä, ts. tietokoneen muistiin sijoitettuja binäärimuotoisia konekielisiä komentoja. Näillä kielillä ohjelmoiminen oli äärimmäisen työlästä ja virhealtista, joten jo 1950-luvun alkupuolella kehitettiin symboliset konekielet (assembler languages). Näissä kielissä yhtä konekielistä käskyä vastasi tekstimuotoinen symboli, joka ihmisen oli helpompi muistaa kuin konekielinen luku. Samoin muistipaikoille voitiin antaa symbolinen merkintä. Symbolinen konekieli käännettiin konekieleksi erityisen ohjelman (assembler) avulla. Konekielet muodostavat ohjelmointikielten ensimmäisen ja symboliset konekielet toisen sukupolven. Lähes kaikki sukupolvijaottelut ovat kahden ensimmäisen sukupolven osalta yhtenäisiä; sen sijaan kolmannen, neljännen ja viidennen sukupolven määrittely vaihtelee. Tässä esitetään varsin yleisesti esiintyvä jaottelu, mutta muitakin on olemassa. Ensimmäiset korkean tason ohjelmointikielet syntyivät 1950-luvun loppupuolella; näihin kolmannen sukupolven kieliin kuuluvat kaikki nykyiset valtakielet. Varsin yleisesti kolmannen sukupolven kieliksi kutsutaan korkean tason lausekieliä; useimpien jaottelujen mukaan myös yleisimmät nykyiset olio-ohjelmointikielet kuuluvat kolmanteen sukupolveen. Joittenkin jakojen mukaan ne sijoittuvat kuitenkin jo seuraavaan sukupolveen. Kolmannen sukupolven kielet tarvitsevat joko tulkin tai kääntäjän muodostamaan konekielisen ohjelman lähdekoodista. Neljännen ja viidennen sukupolven määritelmät eivät ole vielä selkiytyneet niinkään hyvin kuin kolmannen. Yleensä neljännen sukupolven kieliin lasketaan 1980-luvulta alkaen yleistyneet kielet, joita käytetään yleisesti verkkoympäristöissä ja tietokantojen kyselykielinä. Neljännen sukupolven kieltä on yleensä helpompi kirjoittaa, mutta kieli ei

myöskään anna ohjelmoijalle niin suurta kontrollia kuin perinteisemmät korkean tason kielet. Tämän sukupolven kielet ovat yleensä tehokkaita kirjoitettaessa lyhyitä ja yksinkertaisia ohjelmia ja niiden syntaksi on lähempänä luonnollista kieltä kuin kolmannen sukupolven kielillä. Viidennen sukupolven kielet ovat pääasiassa vielä kehitteillä; ne on tarkoitettu tyypillisesti jonkinlaista tekoälyä vaativiin sovelluksiin. Viidennen sukupolven kielen syntaksi muistuttaa yleensä luonnollista kieltä. Logiikkaan perustuva Prolog-kieli lasketaan yleensä viidennen sukupolven kieleksi. 2. Pääohjelmointikielten kehitys Seuraavaksi tarkastellaan melko lyhyesti ohjelmointikielten kehityksen pääpiirteitä merkittävimpien kielten osalta. Aihe on erittäin laaja eikä siitä voida tässä yhteydessä antaa kattavaa esitystä. Jatkossa palataan kielten kehityshistoriaan, kun käsitellään tarkemmin ohjelmointikielten piirteitä. 2.1. Kielten esihistoriaa Ensimmäiset tietokoneet, joita voitiin ohjelmoida sanan nykyisessä merkityksessä, rakennettiin John von Neumannin idean perusteella 1940-luvun loppupuolella. Neumann puolestaan perusti ajatuksensa koneen arkkitehtuurista Alan Turingin esittämään abstraktiin koneeseen. Neumannin arkkitehtuuriin perustuvissa koneissa ohjelmat talletettiin muistiin ja keskusyksikkö suoritti ohjelmat. Ensimmäinen askel tällaisen koneen valmistamiseksi otettiin Philadelphian yliopiston sähkötekniikan laitoksella vuonna 1945, kun 18000 elektroniputkea sisältänyt sähköinen digitaalinen laskukone ENIAC valmistui. ENIACia ohjelmoitiin yhdistelemällä johtoja kytkentätaululla. Hankkeeseen liittynyt von Neumann julkaisi kesäkuussa 1945 raportin, jonka esittämän mallin mukaan kaikki nykyiset tietokoneet toimivat (ks. [Dav], ss. 181-188). Kuitenkin jollain tavalla ohjelmoitavia laitteita oli ollut jo aiemmin; Charles Babbage suunnitteli 1830- ja 1840-luvuilla ohjelmoitavan laskukoneen (Analytical Engine), joka valmistettiin vain osittain (ks. [Lou], s. 32). Kreivitär Ada Lovelace ohjelmoi kuitenkin keskeneräiselle laitteelle joitakin esimerkkilaskutoimituksia, joten häntä voidaan pitää historian ensimmäisenä ohjelmoijana. Vuosina 1936-1945 saksalainen tiedemies Konrad Zuse suunnitteli monimutkaisia elektronisia laskukoneita (ks. [Seb], kappale 2.1); sodan jälkeen Zusen tutkimusryhmä hajosi ja hän alkoi suunnitella ohjelmointikieltä laskutoimitusten

suorittamiseen. Zuse nimesi kielensä Plankalküliksi käsikirjoituksessaan vuodelta 1945, mutta kirjoitusta ei julkaistu ennen kuin vuonna 1972 ja Plankalkül jäi implementoimatta. Kieli oli varsin monipuolinen ja Zuse kirjoitti sillä monia algoritmeja, mm. verkon yhtenäisyyden tutkivan algoritmin, liukulukuja käsitteleviä algoritmeja jne. Näin ollen nykytietojen mukaan Zusen Plankalkül oli ensimmäinen suunniteltu ohjelmointikieli. 2.2. 1950- luku: Ensimmäiset ohjelmointikielet Jo 1940- luvun tietokoneissa kehitettiin menetelmiä helpottaa konekielisten ohjelmien kirjoittamista. Tällöin syntyivät ns. pseudokoodit, joissa tietyillä lyhennysmerkinnöillä voitiin antaa hieman monimutkaisempia operaatioita. 1950-luvun alkupuolella kehittyi myös toinen ohjelmointikielten sukupolvi, symboliset konekielet (assembly languages ). Ensimmäinen korkean tason (ja samalla ensimmäinen kolmannen sukupolven) ohjelmointikieli oli FORTRAN (FORmula TRANslator), jonka kehitti IBM:llä John Backuksen johtama työryhmä vuosien 1954 ja 1957 välisenä aikana. (Tosin ensimmäisen kielen asema on hieman kiistanalainen, ks. [Seb] kappale 2.3.1). FORTRANin merkitys ohjelmointikielten kehityksessä on suuri; kielen kehittäminen osoitti korkean tason ohjelmointikielten konstruoinnin mahdolliseksi käytännössä. Lisäksi FORTRANia käytetään edelleen kehittyneenä muunnelmana laajasti sen alkuperäiseen tarkoitukseen, tieteelliseen ja numeeriseen ohjelmointiin. Alkuperäisen FORTRANin ominaisuuksia olivat mm.: tulostuksen ja syötön muotoilu, looginen IF -lause, johon voitiin antaa algebrallisia vertailuoperaatioita, toistorakenne laskurimuuttujan suhteen DO -lausekkeella. Alkuperäisestä kielestä puuttui tietotyypin määrittely: Kirjaimilla I,J,K,L,M ja N alkavat muuttujat olivat automaattisesti kokonaislukuja ja muilla kirjaimilla alkavat liukulukuja. FORTRAN- kääntäjä kykeni tuottamaan ohjelmakoodista lähes yhtä tehokasta konekielistä koodia kuin kokenut ohjelmoija suoraan, mikä oli merkittävä saavutus. Kääntäjän optimointi veikin kielen suunnitteluajasta suurimman osan. 1950- luvulla syntyi myös kieli, jota on luultavasti käytetty enemmän kuin mitään muuta ohjelmointikieltä (ks. [Seb] kappale 2.6) - COBOL (COmmon Business Oriented Language). Huolimatta laajasta käytöstä, COBOL ei ole juurikaan vaikuttanut

myöhempien kielten kehitykseen. Nimensä mukaisesti sitä käytetään pääasiassa liiketaloudellisiin sovelluksiin; kielellä on hyvin hankala kirjoittaa monimutkaisia algoritmeja, mutta erilaisten raporttien tuottamiseen se on omiaan. COBOLin syntaksi muistuttaa hyvin paljon englannin kieltä. ALGOL 60 kehitettiin 1950 -luvun loppupuolella ja sekin on vaikuttanut suuresti myöhempien ohjelmointikielten kehitykseen. ALGOL 60 syntyi yrityksistä suunnitella yleisohjelmointikieli vastareaktiona sille, että useimmat tuohon aikaan käytetyt kielet oli suunniteltu erityisesti jollekin konetyypille. Kieltä suunnittelemaan ryhtyivät yhdessä Saksan soveltavien matemaatikkojen yhdistyksen GAMMin ja amerikkalaisen ACM:n (Association for Computing Machinery) perustama komitea. Komitean tavoitteena oli suunnitella kieli, joka toteuttaisi seuraavat ehdot: 1. Kielen syntaksin tulisi olla mahdollisimman lähellä standardia matemaattista merkintätapaa. 2. Kielen avulla pitäisi voida esittää laskentamenetelmiä julkaisuissa. 3. Kielellä kirjoitetut ohjelmat pitää voida kääntää mekaanisesti konekielelle. Tuloksena oli ALGOL 58, joka oli monessa suhteessa FORTRANin perillinen. ALGOL 58 yleisti FORTRANin merkintöjä ja toi kieleen uusia rakenteita ja käsitteitä. ALGOL 58:aa ei ollut tarkoitettu lopulliseksi versioksi, mutta ALGOL 58 -raporttia käytettiin silti joidenkin toteutuksien pohjana. Käydyn keskustelun ja kritiikin perusteella päätettiin järjestää tammikuussa 1960 kokous, jossa tehtiin merkittäviä muutoksia ALGOL 58:aan, vaikka kokous kestikin ainoastaan kuusi päivää. Merkittävimmät muutokset olivat: 1. Kieleen lisättiin lohkorakenne, mikä toi ohjelmoijien käyttöön näkyvyysalueen (scope). 2. Parametrien välitys aliohjelmille uudistettiin: sallittiin kaksi eri mekanismia, arvovälitys (pass by value) ja nimivälitys (pass by name). 3. Aliohjelmien rekursiivisuus sallittiin. 4. Pinodynaamisten taulukoiden käyttö sallittiin. Näin syntyi ALGOL 60, josta kehittyi nopeasti standardi tapa esittää algoritmeja tietojenkäsittelytieteen julkaisuissa. Esimerkiksi ACM vaati lähes kolmenkymmenen vuoden ajan sen julkaisuissa ilmestyvien algoritmien esittämisen ALGOLilla. Jokainen sittemmin kehitetty imperatiivinen ohjelmointikieli on saanut vaikutteita ALGOL 60:sta.

ALGOL 60 oli varsin laajassa käytössä Euroopassa, vaikka ei saavuttanutkaan valtakielen asemaa. Yhdysvalloissa kieltä käytettiin vain vähän. Tähän saattoi osaltaan vaikuttaa se, että ALGOL 60 oli liian moderni ohjelmointikieli. Hoaren mukaan "Here is a language so far ahead of its time that it was not only an improvement on its predecessors but also on nearly all its succeccors." ([Hoa], Appendix). ALGOL-kieltä kehitettäessä syntyi myös BNF (Backus-Naur Form)-merkintätapa, jota käytetään yleisesti kuvaamaan ohjelmointikielten ja muiden formaalien kielten syntaksia. Ensimmäiset funktionaaliset ohjelmointikielet luotiin myös 1950 -luvulla, jolloin tekoälytutkimus alkoi heräillä. John McCarthy tutki 1958 symbolisen laskennan toteuttamista tietokoneella, yhdessä Marvin Minskyn kanssa he muodostivat tekoälyprojektin, jonka tuloksena syntyi lopulta LISP (List Processing language). LISPohjelmointi poikkeaa suuresti yleisemmästä imperatiivisesta ohjelmoinnista, joka pohjautuu muuttujiin ja sijoituslauseisiin. Puhdas LISP käsittelee vain kahdenlaisia tietorakenteita: atomeja ja listoja. Atomit ovat joko symboleita tai numeerisia literaaleja. Listat voivat sisältää atomeja ja toisia listoja. LISP on ALGOLin tapaan vaikuttanut ratkaisevasti myöhempiin ohjelmointikieliin: esimerkiksi roskien keruu oli ensimmäistä kertaa mukana juuri LISPissä. 2.3. 1960-luku: Räjähdysmäinen kehitys Tultaessa 1960 -luvulle, ohjelmointikielten valtaa pitivät FORTRAN, COBOL ja ALGOL. Näistä FORTRAN ja ALGOL soveltuivat parhaiten tieteelliseen laskentaan ja COBOL kaupallisiin sovelluksiin. Vuosikymmenellä suunniteltiin satoja uusia ohjelmointikieliä, joista monet oli tarkoitettu erikoiskäyttöön; näistä useimmat ovat hävinneet. Kuka muistaa esimerkiksi seuraavia kieliä: AESOP, BASEBALL, COGO, DEACON, FLAP, GRAF, ICES, JOSS, LOLITA, MADCAP, NELIAC, OPS, PAT, QUIKTRAN, STRESS, TREET ja UNICODE? Kaikkia 1960-luvun kieliä ei suinkaan suunniteltu erikoistarkoituksiin, vaan jotkut haaveilivat todellisesta yleiskielestä, jota voitaisiin käyttää kaikkeen ohjelmointiin. Tällainen kieli oli IBM:llä vuosikymmenen puolivälissä kehitetty PL/I, jolla oli ensimmäisenä kielenä formaalisti määritelty semantiikka (merkitysoppi). Kieleen kerättiin suuri määrä piirteitä, joista osa oli joissakin olemassa olevista kielistä sekä paljon sellaista, jota ei vielä ollut toteutettu missään kielessä. Tällaisia piirteitä olivat esimerkiksi

1. Ohjelmat saattoivat sisältää rinnakkaisesti suoritettavia toimintoja 2. Poikkeusten käsittely 3. Aliohjelmat saattoivat olla rekursiivisia, mutta valinnan mukaan rekursio voitiin kytkeä pois 4. Osoitintietotyypin ottaminen käyttöön 5. Useampiulotteisen taulukon alitaulukoihin voitiin viitata suoraan (esimerkiksi matriisin riviin vektorina). Kielen suunnittelutavoitteet olivat liian kunnianhimoiset ja kielestä tuli erittäin laaja ja vaikeasti hallittava. Kuitenkin kieltä käytettiin 1960- ja 1970- luvuilla varsin laajasti ja se on käytössä IBM-ympäristössä edelleen, vaikka ei yleinen olekaan. Myös ALGOL-kieltä kehitettiin 1960-luvulla; näin syntyi ALGOL 68, jonka kohtalo oli samantapainen kuin PL/I:n: Laajana ja monimutkaisena se jäi lähes käyttämättä. ALGOL 68:aa rasitti vielä vaikealukuinen määrittely. Kielen tärkeimpänä suunnitteluperiaatteena oli ortogonaalisuus, ts. piirteiden maksimaalinen riippumattomuus muista piirteistä ja niiden mahdollisimman suuri yhdisteltävyys. Tämä koski erityisesti tietotyyppejä. Vaikka ALGOL 68 ei saavuttanutkaan suosiota, sen ideoita, esimerkiksi operaattoreiden ylikuormitusta, on käytetty muissa ohjelmointikielissä. ALGOLista kehitettiin rinnakkain myös toinen, yksinkertaisempi versio ALGOL W. Sekään ei tullut yleiseen käyttöön, mutta toimi myöhemmin pohjana erittäin suositulle Pascal-kielelle. BASIC (Beginner's All-purpose Symbolic Instruction Code) on ollut yksi yleisimpiä mikrotietokoneiden ohjelmointikieliä. Se kehitettiin Dartmouthin Collegessa 1963-1964 työkaluksi humanististen alojen opiskelijoille. Tämän vuoksi kielestä tehtiin varsin yksinkertainen ja esimerkiksi lohkorakenne jätettiin pois, mikä teki ohjelmista hankalasti strukturoitavia. Kielten kehityksen kannalta BASICin merkittävin piirre on, että se oli ensimmäinen yleisesti käytetty menetelmä hoitaa etäpääteyhteys keskustietokoneeseen (reikäkorttien ja paperinauhojen sijaan). Myös BASICin kehitys on jatkunut ja siitä on useita versioita, joista yleisimmin käytetään VisualBASICiä. Olio-ohjelmointikin syntyi jo 1960 -luvulla. Jo 1962 norjalaiset Kristen Nygaard ja Ole- Johan Dahl suunnittelivat ensimmäisen version simulointiin tarkoitetusta Simula - kielestä. Olioparadigma tuleekin luonnollisesti mukaan reaalimaailman mallintamisessa. Yleisimmin tunnettu on vuonna 1967 valmistunut Simula 67, joka sai

suuresti vaikutteita ALGOL 60:stä. Oliomalli kieleen tuli itse asiassa rinnakkaisten tapahtumien toteuttamistarpeesta: Simulassa oli mahdollista suorittaa aliohjelmia (näennäisesti) rinnakkain käyttämällä ns. vuorottaisaliohjelmia (coroutines); näin sai alkunsa datan abstrahointi ja johti myöhemmin moderniin olio-ohjelmointiin. Jo Simulassa oli luokkakäsite; luokka yhdisti datan ja niitä käsittelevät funktiot. Myös periytyminen (Simulassa prefixing) oli jo mahdollinen. Simulan roskienkerääjä vapautti myös ohjelmoijan itse tuhoamasta luomiaan olioita. Simulasta ei koskaan tullut suosittua kieltä, vaikka se epäilemättä olisi ansainnut laajempaa huomiota. 2.4. 1970-luku: Rakenteinen ohjelmointi 1960-luvun kielellisen sekamelskan jälkeen, uudelle vuosikymmenelle siirryttäessä, jouduttiin tekemään uudelleenarviointeja kielten suunnittelussa. Nyt avainsanoiksi tulivat yksinkertaisuus, johdonmukaisuus ja rakenteellisuus. Muotikäsitteitä oli rakenteinen ohjelmointi (structured programming). Useat 1970-luvun kielet suunniteltiin nimenomaan rakenteiseen ohjelmointiin. Niklaus Wirth oli ollut mukana jo ALGOL W:n suunnittelussa; tämän kielen pohjalta hän kehitti aivan vuosikymmenen alussa (1971) Pascal -kielen nimenomaan vastareaktiona 1960-luvun monimutkaisille kielille. Hänen tarkoituksensa oli osoittaa, että yksinkertainenkin kieli voi olla ilmaisuvoimainen. Pascalin tietotyyppijärjestelmä perustui muutamiin alkeistietotyyppeihin ja mahdollisuuteen määritellä uusia, rakenteisia tietotyyppejä. Pascal suunniteltiin heijastamaan Wirthin ajatusta ohjelmistokehityksestä askeleittain tarkentamisella; tämä näkyykin Pascalin rakenteesta selvästi. Kielen pääasiallinen tarkoitus oli toimia ohjelmoinnin opetuksessa, missä se menestyikin hyvin: aina 1970-luvun puolivälistä 1990-luvun puoliväliin Pascal oli yleisin ohjelmoinnin opetuskieli. Kieli oli kuitenkin liian yksinkertainen saavuttaakseen laajaa suosiota sovelluskehityksessä; siitä puuttui monia olennaisia piirteitä tätä varten. Pascalista on kehittynyt kuitenkin murteita, joita on käytetty myös sovellusten kehittämiseen. Lisäksi Pascal on vaikuttanut merkittävästi uudempiin ohjelmointikieliin, vaikka ei tuonutkaan merkittäviä uutuuksia silloisiin ohjelmointikieliin. Myös kaikkien ohjelmoijien tuntema C-kieli kehitettiin 1970-luvulla. Sen loi Dennis Ritchie järjestelmäohjelmointitarkoituksiin. C-kielen nykyinen suosio perustuukin ainakin osaksi siihen, että UNIX -käyttöjärjestelmä uudelleenohjelmoitiin sillä. Näin

UNIXin suosio johti myös C-kielen yleistymiseen. Sinänsä C ei tuonut juurikaan uutta ohjelmointikieliin, se on kuitenkin erittäin joustava ja sopii siten monenlaiseen ohjelmointiin. Kieli perustuu pieneen joukkoon alkeiskäsitteitä, esimerkiksi merkkijonoja käsitellään merkkitaulukkoina ja niiden manipulointi perustuu osoitinaritmetiikkaan. Yksinkertaisuutensa vuoksi C:tä voidaan kääntää helposti ja tehokkaasti konekielelle, mikä onkin ollut kielen tärkeimpiä suunnittelukriteerejä. Huolimatta siitä, että C ei voi ylpeillä omaperäisyydellä, se on suosionsa ansiosta vaikuttanut erittäin vahvasti muihin ohjelmointikieliin. Vuosikymmenen alkupuolella sai myös alkunsa uusi ohjelmointiparadigma, kun ensimmäinen logiikkaohjelmointikieli Prolog näki päivänvalon. Samoin kuin funktionaalinen ohjelmointi, myös logiikkaohjelmointi syntyi tekoälytutkimuksen piirissä. Prologin perusrakenteen suunnittelivat Colmerauer, Roussel ja Kowalski ja ensimmäinen Prolog-tulkki implementoitiin Marseillessa vuonna 1972. Nykyiset logiikkaohjelmointikielet käyttävät Prologin tapaan predikaattikalkyyliä (rajoitetussa muodossa) esitystapanaan. Toistaiseksi logiikkakieliä vaivaa tehottomuus, eikä niille ole löydetty juuri tarkoituksenmukaisia sovelluskohteita tekoälysovellusten ulkopuolelta. Olio-ohjelmointi yleistyi vasta 1980-luvulla, mutta jo 1970-luvulla syntyi Smalltalk - ehkä kaikkein puhtain oliokieli, ja joidenkin mielestä edelleen yksi parhaista. Kielen kehitys sai alkunsa Alan Kayn ideoista ja hänen kehitystyöstään Xeroxin Palo Alton tutkimuskeskuksessa, jossa suunniteltiin tietokoneen graafista käyttöliittymää. Alan Kay oli saanut vaikutteita sekä LISPistä että Simulasta. Dan Ingalls teki kielen ensimmäisen implementoinnin BASICillä vuonna 1972. Simula on vaikuttanut Smalltalkiin merkittävästi, mutta Smalltalk vei oliomallin huomattavasti pidemmälle. Smalltalkissa kaikki asiat ovat olioita ja oliot kommunikoivat keskenään lähettämällä ja vastaanottamalla viestejä. Luokkien perusluokkana on Object-luokka (vertaa Javaan), joten kaikki luokat perivät suoraan tai epäsuorasti tämän luokan. Voidaan sanoa, että Smalltalk on ensimmäinen oliokieli, jossa on kaikki modernin oliokielen piirteet. Smalltalk ei myöskään ole pelkkä ohjelmointikieli, vaan täydellinen ohjelmointiympäristö. Ikkunoihin pohjautuva käyttöliittymä on myös Smalltalkin peruja; näin ollen Smalltalk ei ole ainoastaan vallitsevan ohjelmointiparadigman, vaan myös vallitsevan käyttöliittymäparadigman, uranuurtaja.

2.5. 1980-luku: Olio-ohjelmointi yleistyy 1980 -luvulla olio-ohjelmointi nousi ohjelmointimenetelmien vallitsevaksi metodiksi ja on sellaisena toistaiseksi säilynytkin. Vuosikymmenen alussa Bjarne Stroustrup alkoi suunnitella Bellin laboratoriossa C-kielen laajentamista oliokieleksi työnimenä C with classes. Hän sai vaikutteita sekä Simula 67:stä että Smalltalkista. Pääasiallinen suunnittelutavoite oli luoda C-kieleen pohjautuva ohjelmointikieli, jossa toteutettaisiin ohjelman organisointi luokkiin ja niiden periytymiseen samaan tapaan kuin Simula 67:ssä. Lisäksi kielen tuli säilyttää C-kielen tehokkuus. Siksi esimerkiksi taulukoiden rajojen tarkastaminen hylättiin heti suunnitteluvaiheessa. Kieleen lisättiin vielä joitakin kehittyneempiä olio-ohjelmoinnin piirteitä ja vuonna 1985 ensimmäinen toteutus valmistui. Kieli kehittyi kuitenkin koko 1980-luvun ajan ja merkittäviä uudistuksia on tehty nykypäivään saakka. C++-kielestä tuli erittäin suosittu monestakin syystä. Ensinnäkin kieli pohjautui yleisesti käytettyyn C-kieleen ja oli lähes täysin yhteensopiva C -kielen kanssa, joten C-kieliset ohjelmat saatettiin helposti muuttaa C++ -ohjelmiksi. Lisäksi kieltä varten on saatavissa tehokkaita ja edullisia kääntäjiä. Ennen Javan läpimurtoa C++ oli yleisimmin käytetty olio-ohjelmointikieli maailmassa; se olikin suunniteltu nimenomaan ohjelmoinnin ammattilaisten työkaluksi ([Strou], preface). Vaikka kieli peri C-kielen turvattomia piirteitä ja on lisäksi laaja ja monimutkainen, sen suosio on pysynyt suurena. C++ myös kehittyy koko ajan; vuonna 2011 julkaistiin laaja uudistus, jossa kieleen on liitetty mm. rinnakkaisen ohjelmoinnin tuki ja säännöllisten ilmausten tuki. Muita 1980 -luvulla kehitettyjä oliokieliä ovat Eiffel ja Delphi. Eiffel on puhdas ohjelmointikieli, jonka on suunnitellut ranskalainen Bertrand Meyer. Eiffel on suppeampi ja yksinkertaisempi kuin C++, mistä huolimatta sen ilmaisuvoima on lähes sama. Kuitenkaan Eiffel ei ole saavuttanut läheskään samaa suosiota kuin C++, osittain varmasti siitä syystä, että C-kielisten ohjelmoijien oli helpompi siirtyä olio-ohjelmointiin C++ -kielellä. Delphi on puolestaan Pascal -kielestä kehitetty olio-ohjelmointikieli. Myös se on yksinkertaisempi kuin C++, mutta sitäkään ei ole samassa mitassa käytetty ohjelmistosuunnittelussa. Yhdysvaltain puolustusministeriön yrityksestä yhtenäistää sen sulautetuissa järjestelmissä käytetyt ohjelmistot syntyi Ada-kieli. Kielen suunnittelu on ollut ohjelmointikielten historian laajin ja kallein suunnitteluprojekti. Hanke pantiin alkuun jo

1970 -luvun puolivälissä, mutta ensimmäinen kielen manuaali ilmestyi 1980. Suunnittelu eteni kilpailuttamalla eri vaihtoehtoja toisiaan vastaan; Ada onkin ensimmäinen ohjelmointikieli joka suunniteltu tällä tavoin. Kieli nimettiin historian ensimmäisen ohjelmoijan Augusta Ada Byronin, Lovelacen kreivittären, mukaan. Adan syntaksi perustuu Pascal-kieleen. Yksi kielen merkittävistä piirteistä olivat pakkaukset, joiden avulla voitiin kapseloida datatyyppejä ja aliohjelmia. Kielessä voitiin siten käyttää data-abstraktiota, vaikka Ada ei olekaan oliokieli. Kieli salli myös monipuolisen poikkeusten käsittelyn. Edelleen Ada-kielellä voitiin kirjoittaa geneerisiä (eli tyyppiriippumattomia) ohjelmia, esimerkiksi kirjoittaa lajittelualgoritmi etukäteen määrittelemättömälle tietotyypille. Lopulta Ada salli ns. tehtävien (tasks) rinnakkaisen suorittamisen. Vakiintuneesta kielen versiosta käytetään yleisesti nimitystä Ada 83. Vuonna 1995 julkaistiin Adasta parannettu versio Ada 95, joka oli jo olioohjelmointikieli. Adaa on laajennettu vielä vuonna 2005. Vuosikymmenellä syntyi myös monia skriptikieliä (juontokieli, scripting language), esimerkkinä mainittakoon Larry Wallin kehittämä Perl, joka on yleistynyt 1990-luvulla WWW:n ansiosta. Perl sopii nimittäin erinomaisen hyvin CGI (Common Gateway Interway)-ohjelmointiin. CGI oli ensimmäinen menetelmä, jolla HTML-sivuja voitiin luoda dynaamisesti palvelimella asiakkaan pyynnöstä riippuen. 2.6. 1990-luku: WWW-ohjelmointi Java suunniteltiin alun perin sulautettujen järjestelmien ohjelmointikieleksi, mutta siitä tuli tunnettu vasta 1990-luvun puolivälissä Internetin käytön yleistyessä. Tällöin havaittiin, että Java soveltuu hyvin juuri WWW-ohjelmointiin. Javan pääsuunnittelijana toimi James Gosling; suunnittelussa pidettiin luotettavuutta pääkriteerinä. Tämän vuoksi alkujaan harkitut kielet C ja C++ hylättiin ja päätettiin kehittää kokonaan uusi kieli. Syntaksiltaan ja monilta ominaisuuksiltaan Java pohjaa C++-kieleen, mutta on suunniteltu yksinkertaisemmaksi ja luotettavammaksi. Osoittimista tietotyyppinä on kokonaan luovuttu; myös moniperiytyminen on jätetty pois. Javaan toteutettiin kuitenkin tuki rinnakkaiselle ohjelmoinnille, mikä tuolloin puuttui C++ -kielestä. Edelleen automaattinen roskien keruu on osa Javaa, näin ohjelmoijan ei tarvitse vapauttaa varaamaansa muistia. Sinänsä Java ei sisällä juurikaan sellaisia piirteitä, joita

ei joissakin muissa kielissä esiintyisi. Sen suuri ja alati kasvava suosio tekee kuitenkin kielestä merkittävän. WWW:n kehittyminen on myös edesauttanut skriptikielien yleistymistä, koska niiden avulla voidaan luoda WWW-sivuille dynaamista sisältöä. 1990-luvulla kehitettiin mm. PHP ja JavaScript. Näistä PHP:tä käytetään palvelinpuolella; JavaScriptiä ajetaan yleisimmin selaimessa. PHP:n suunnitteli Rasmus Lerdorff vuonna 1994. Alkuperäinen tarkoitus oli seurata sen avulla WWW-sivun vierailijoita. JavaScriptin kehitti puolestaan Brendan Eich Netscapella; tällöin sen nimi oli vielä Mocha. Myöhemmin nimi muuttui LiveScriptin kautta JavaScriptiksi. JavaScript on käynyt läpi huomattavia muutoksia olemassaolonsa aikana. Nimestään huolimatta JavaScriptillä ei ole Javan kanssa syntaksin lisäksi paljonkaan yhteistä. 1990-luvulla julkaistiin myös monen tyyppiseen ohjelmointiin soveltuva Python, joka on nykyisin yksi yleisimmistä skriptikielistä. Kieli tukee monia ohjelmointiparadigmoja, mm. olio-ohjelmointia. Sen ulkoasu on sikäli omaperäinen, että kielen näkymäalueet määräytyvät koodirivin sisennyksen perusteella. Pythonin suunnitteli hollantilainen Guido van Rossum, mutta nykyisin sen kehityksestä vastaa Python Software Foundation. Uusimpia tulokkaita suosittujen skriptikielien joukossa on Ruby, jonka suunnitteli Yukihiro Matsumoto 1990-luvun alkupuoliskolla. Ruby on puhdas oliokieli; kaikki ohjelmissa esiintyvät entiteetit ovat olioita. Vuosikymmenellä kehitettiin myös funktionaalisia kieliä. Yksi nykyisin suosituimmista funktionaalisista kielistä on Haskell, joka julkaistiin vuonna 1990. Haskell nimettiin amerikkalaisen matemaatikon ja loogikon Haskell Curryn (1900-1982) mukaan. Haskell on puhtaasti funktionaalinen kieli, jonka perusrakenne on lista. Kielessä voidaan esittää periaatteessa äärettömiä rakenteita sen käyttämän laiskan laskennan (lazy evaluation) ansiosta. Rakennetta konstruoidaan ainoastaan kulloisenkin tarpeen mukaan. Tällä vuosituhannella on saatettu julkisuuteen ainakin yksi merkittävä ohjelmointikieli. Microsoftin kehittämä C# muistuttaa monessa suhteessa Javaa ja on osa Microsoftin.NET -arkkitehtuuria. C# on hieman Javaa puhtaampi oliokieli ja sisältää joitakin Javaan kuulumattomia C++:n ominaisuuksia, kuten operaattoreiden ylikuormittamisen. C# on saanut jonkin verran vaikutteita myös Delphistä, mikä voi johtua siitä, että kielen pääsuunnittelija Anders Hejlsberg suunnitteli myös Turbo Pascalin ja Delphin. Myös D -

kieli on julkaistu aivan 2000-luvun alussa. D on tarkoitettu vaihtoehdoksi C++ -kielelle käytännön olio-ohjelmointityöhön. (Ks. [D]) Lähteet [D] D Programming Language, URL: http://dlang.org/. Viitattu 5.1.2016. [Dav] Davis, M. Tietokoneen esihistoria Leibnizista Turingiin, Art House, 2003 [Hoa] Hoare, C.A.R. Hints on Programming Language Design, in C.A.R: Hoare and C.B. Jones, Essays in Computer Science, Prentice Hall 1989 [Lou] Louden, Kenneth C. Programming Languages, Principles and Practice, PWS-KENT 1993. [Seb] Sebesta, Robert W. Concepts of Programming Languages 10th edition, Pearson 2013. [Strou] Stroustrup, Bjarne. The C++ Programming Language, 3rd edition, Murray Hill 1997.