Java-ohjelmointikieli
**Ohjelmointikielet** ovat formaaleja kieliä, joita ohjelmoijat käyttävät tietokoneen ohjelmointiin algoritmin toteuttamiseksi. Ohjelmointikielellä tehdystä lähdekoodista tuotetaan tietokoneen ymmärtämää konekielistä *binääriä* kääntäjällä tai tulkilla. Tietokoneen ymmärtämä binääri voidaan tehdä välikielen kautta.

Historia
--------

Valikoima ohjelmointikieliin liittyviä kirjoja.
Ohjelmien kaltaisia ratkaisuja on käytetty muun muassa kutomakoneille ja automaattipianoille ennen digitaalisen tietokoneen kehittämistä.

Ada Lovelace kirjoitti 1800-luvulla Charles Babbagen analyyttiselle koneelle algoritmin Bernoullin lukujen laskemiseen, jonka johdosta Lovelacea pidetään ensimmäisenä ohjelmoijana. Tärkeimpänä havaintona pidetään sitä, että Lovelace hahmotti ohjelman ja algoritmin abstraktin ilmaisun, jolloin kone voi tehdä lähes mitä vain.

Ensimmäisenä ylemmän tason ohjelmointikielenä pidetään Konrad Zusen 1940-luvulla kehittämää Plankalkülia. Kielen kuvaus julkaistiin kuitenkin vasta 1972 ja ensimmäinen kääntäjä kielelle toteutettiin vasta 1998. Kieli oli korkean tason imperatiivinen kieli.

Small-Scale Experimental Machine (SSEM) oli ensimmäinen tietokone, jossa ohjelma voitiin tallettaa tietokoneen muistiin ja ohjelmaa voitiin vaihtaa ilman fyysisiä muutoksia tietokoneeseen (tallennetun ohjelman tietokone).

Ennen vuotta 1954 lähes kaikki ohjelmointi tehtiin matalan tason ohjelmointikielillä kuten konekielellä tai assemblyllä. 1950-luvun lopulla syntyneitä ohjelmointikieliä olivat ALGOL, COBOL ja Fortran.
Suuri osa ohjelmoijien työstä liittyi tuon ajan tietokoneiden rajoitteisiin. Varhaiset *automaattisen ohjelmoinnin* menetelmät olivat kalliita käyttää koska ne hidastivat tietokonetta 5-10-kertaisesti. FORTRANin kehitykseen vaikutti myös, että myös ohjelmoijien kustannukset olivat suuret ja merkittävä osa ajasta kului debuggaukseen. Taloudelliset syyt olivat merkittävä tekijä FORTRAN-projektin rahoittamiseen.

Yleisesti tunnustetaan että ohjelmointikielet ovat kehittyneet kolmen selkeästi tunnistettavan sukupolven kautta: konekieli, assembly ja ylemmän tason proseduraaliset kielet kuten COBOL ja FORTRAN. Kielten sukupolvia ovat määrittäneet kasvava siirrettävyys, riippumattomuus laitteistoarkkitehtuurista ja käytön helppous.

Ohjelmointikielet voidaan jakaa sukupolviin seuraavasti:

|  |  |  |  |
| --- | --- | --- | --- |
| 1 | Ensimmäinen sukupolvi | konekieli |  |
| 2 | Toinen sukupolvi | assembly | isomorfinen muunnos, symbolinen konekieli |
| 3 | Kolmas sukupolvi | algoritminen ja proseduraalinen | ei-isomorfinen muunnos, käännettävät ja tulkittavat kielet |
| 4 | Neljäs sukupolvi |  | neljännen sukupolven kielen käsitettä käytetään väljästi ja käytännöllisesti |

Neljännen sukupolven kielistä on keskusteltu 1970-luvulta alkaen. Niin kutsuttujen "ei-proseduraalisten" kielten on sanottu olevan neljännen sukupolven kieliä, mutta myös assemblya voi sanoa "ei-proseduraaliseksi". Neljännen sukupolven kielien ilmestyminen on hyvin dokumentoitu, mutta ohjelmien monimuotoisuus on tehnyt vaikeaksi tarkan määrittelyn. Neljännen sukupolven kielet on kehitetty pragmaattisemmin kuin akateemiseen työhön perustuen.

1960- ja 1970-luvuilla Simula oli merkittävä kieli, jonka ajatuksia Smalltalkissa kehitettiin edelleen. Tämä vaikutti olio-ohjelmointikielien kehitykseen.

Viidennen sukupolven kieliä on toisinaan mainostettu, mutta laitteistoabstraktion kannalta neljäs sukupolvi on jo korkeimmalla tasolla. Eräät tahot esittävät että viides sukupolvi perustuu enemmän ohjelmalle annetun rajoitteiden määrittelyyn kuin ongelmanratkaisualgoritmin kehittämiseen: käyttökohteena pääasiassa tekoälytutkimus.

Yleistä
-------

Ohjelmointikielet ovat formaaleja kieliä, joita käytetään äärellisellä automaatilla (nykyään usein tietokone tai ohjelmoitava logiikka). Ohjelmointikielissä on rajallinen määrä sanoja ja sääntöjä, joita ohjelmoinnissa voi käyttää. Sääntöjen mukaisesti tulos on aina deterministinen. Sanojen ja sääntöjen ulkopuolella tulos on epädeterministinen (määrittelemätön) ja yleensä virhe.

Ohjelmointikielet poikkeavat luonnollisista kielistä säännönmukaisuuden ja rajatun kieliopin suhteen.

Ohjelmointikielet noudattavat abstraktioperiaatetta siinä suhteessa, että käyttäjän ei tarvitse tietää miten asia on toteutettu vaan ainoastaan sen rajapinta: komponentin toteutusta voidaan muuttaa ilman sen vaikuttamista tai ilmoittamista sen käyttäjälle. Periaatetta käytetään yleisesti ohjelmoinnissa toistuvien kaavojen vähentämiseen.

Laskettavuusteorian mukaan Turing-täydelliset kielet ovat korvattavissa toisella.

Yleensä ohjelmointikielen sanotaan olevan Turing-täydellinen jos sitä voi käyttää simuloimaan Turingin konetta. Yleiskäyttöiset ohjelmointikielet ovat Turing-täydellisiä. Ensimmäisenä yleiskäyttöisenä ylemmän tason kielenä pidetään FORTRAN:ia.

Tietylle sovellusalueelle erikoistuneet täsmäkielet eivät yleensä ole Turing-täydellisiä.

Ohjelmointikielissä sallittu syntaksi on usein esitetty konteksivapaalla Backus–Naur-muodolla (BNF). Kontekstivapaata kielioppia kuten BNF voidaan käyttää *kääntäjän kääntäjän* kuten YACC-ohjelman kanssa.
Lähdekoodin kääntäminen ohjelmatiedostoksi ei vielä tarkoita että ohjelman suoritus toimii oikein.
Muun muassa nollalla jakaminen on useissa kielissä syntaksin mukaan mahdollista, mutta tulosta ei voida määrittää.

Verratessa ohjelmointikieliä kuten FORTRAN, LISP, APL ja SNOBOL ne eroavat ilmaisumuodossa, kontrollirakenteiden valinnassa ja käytössä, sekä tiedon esityksen tyypissä ja hallinnassa. Ohjelmointikielen semantiikka määrittää sen *abstraktin konemallin* ja kun algoritmi vastaa kielen mallia ohjelmointi on kätevää ja toteutus on tehokas; kun algoritmin vaatima prosessointi ei vastaa kielen mallia ohjelmointi on vaikeaa ja ohjelma on tehoton.

Muita eroja ovat muun muassa tyyppijärjestelmän toteutus ja poikkeuksien käsittely. Muistikäsittely voi olla ohjelmoijan vastuulla tai kieli voi tukea automaattista roskienkeruuta.

Käyttö
------

Ohjelmointikielillä asian voi ilmaista vain rajallisella määrällä toimintoja, esimerkiksi muuttujan *saldo* arvon vähentäminen 10:llä ilmaistaan: `saldo -= 10;` tai `saldo = saldo-10;`.

Esimerkiksi C-kielessä vaihtoehtoja on runsaasti, sillä kokonaislukumuuttujan arvoon voi lisätä yhden useammalla 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ä tapaa palauttavat lausekkeen osana ollessaan muuttujan uuden arvon, kun alin palauttaa vanhan, vaikka kasvattaakin itse muuttujan arvoa. Arvon lisäykseen oikotienä käytettävät käytettävät operaattorit kuten `+=` ja `++` ovat peräisin tilanteesta, jossa jokainen ominaisuuden lisäys kasvatti kääntäjän tarvitsemaa muistimäärää mutta uusien ominaisuuksien käyttäminen pienensi sen tarvitsemaa muistia. B-kielen ja C-kielen kehityksen yhteydessä käytettävissä olevan tietokoneen rajallinen muistimäärä oli usein ongelma.

Ohjelmointikielten jaottelu
---------------------------

*Pääartikkeli: Ohjelmointiparadigma*
Ohjelmointikielet voidaan jaotella eri ryhmiin kielen paradigman mukaan:

* Paradigma
	+ proseduraalinen ohjelmointi
	+ oliopohjainen ohjelmointi
	+ funktionaalinen ohjelmointi
	+ logiikkapohjainen ohjelmointi

Ohjelmointikielet voivat toteuttaa useaa paradigmaa eli ovat *moniparadigmaisia*. Esimerkiksi C++ tukee eri paradigmoja (proseduraalinen-, olio- ja geneerinen ohjelmointi) ja on siten moniparadigmainen kieli.

Ohjelmointikielet voidaan jakaa muun muassa algoritmisiin (FORTRAN, ALGOL), liiketoimintaan orientoituneisiin (COBOL) ja koulutukseen orientoituneisiin (BASIC, Logo).

Ohjelmointikielet sanotaan voitavan jakaa deklaratiivisiin ja imperatiivisiin, joiden alalajeja ovat funktionaaliset, logiikkapohjaiset ja proseduraaliset ohjelmointikielet.

Ohjelmointikieliä
-----------------

*Pääartikkeli: Luettelo ohjelmointikielistä*

Eräitä tunnetuimpia, yleisimpiä tai merkittävimpiä ohjelmointikieliä:

* ActionScript
* Ada
* ALGOL
* Assembly
* BASIC
* C
* C++
* C#
* COBOL
* Delphi
* Forth
* Fortran
* Go
* Haskell
* IDL
* Java
* JavaScript
* Lisp
* Logo
* Modula-2
* Object Pascal
* Objective-C
* Objective Caml
* Pascal
* Perl
* PHP
* PL/1
* Prolog
* Python
* R
* Ruby
* Rust
* Scheme
* Smalltalk
* Swift
* TCL
* Visual Basic

Katso myös
----------

* Konekieli
* Laitteistokuvauskieli
* Merkintäkieli
* Tietokonetekniikan historia
* Chomskyn hierarkia

Lähteet
-------

1. ↑  What are Computer Programming Languages? *computerscience.org*. Viitattu 12.7.2018.
2. ↑  1801: Punched cards control Jacquard loom *computerhistory.org*. Viitattu 4.3.2020. (englanniksi)
3. ↑  Ada Lovelace Computer History Museum. Viitattu 12.7.2018. (englanniksi)
4. ↑  John Markoff: It Started Digital Wheels Turning  7.11.2011. The New York Times. Viitattu 9.1.2020. (englanniksi)
5. 1 2  Harry Fairhead: History of Computer Languages - The Classical Decade, 1950s *i-programmer.info*. Viitattu 13.9.2020. (englanniksi)
6. ↑  F.L. Bauer & H. Wössner: The "Plankalkül" of Konrad Zuse: A Forerunner of Today's Programming Languages (PDF) *Communications of the ACM*.  heinäkuu 1972.  Arkistoitu .doi:10.1145/361454.361515.  Viitattu 10.7.2018. (englanniksi)
7. 1 2  Plankalkül *history-computer.com*. Viitattu 5.2.2020. (englanniksi)
8. ↑  The Manchester Small Scale Experimental Machine -- "The Baby" *curation.cs.manchester.ac.uk*. Viitattu 25.8.2017.
9. ↑  Guy Fedorkow: About the Computer History Museum’s IBM 1401 Machines *computerhistory.org*.  19.2.2015. Viitattu 28.1.2020. (englanniksi)
10. 1 2 3 4 5  John Backus: FORTRAN Session (PDF) Computer History Musem. Viitattu 10.2.2020. (englanniksi)
11. 1 2 3  David Benyon: SECTION ONE FOURTH GENERATION LANGUAGES (PDF) (Automating Systems Development)  1988. Plenum Press. doi:10.1007/978-1-4613-1033-4\_13.  Viitattu 5.2.2020. (englanniksi)
12. 1 2 3 4 5 6 7  Roger Clarke: A Contingency Approach to the Application Software Generations *rogerclarke.com*.  1991. Viitattu 4.2.2020. (englanniksi)
13. ↑  Programming languages on the mainframe IBM. Viitattu 4.2.2020. (englanniksi)
14. ↑  Philip Howard: What makes a 5GL?  17.1.2007. The Register. Viitattu 10.2.2020. (englanniksi)
15. ↑  Sébastien Miellet: Matlab: Introduction (PDF) *moodle.unifr.ch*. Viitattu 11.2.2020. (englanniksi)[vanhentunut linkki]
16. ↑  Noah Chomsky: Syntactic Structures (PDF) *linguist.univ-paris-diderot.fr*.  Arkistoitu 31.3.2020. Viitattu 10.2.2020. (englanniksi)
17. ↑  Three Models for the Description of Language – Internet Archive
18. ↑  The Abstraction Principle *cs.sjsu.edu*. Viitattu 10.2.2020. (englanniksi)
19. ↑  The Abstraction Principle *cs.cornell.edu*. Viitattu 10.2.2020. (englanniksi)
20. ↑  Turing Machines *plato.stanford.edu*. Viitattu 7.2.2020. (englanniksi)
21. 1 2  Turing Completeness *cs.odu.edu*. Viitattu 10.2.2020. (englanniksi)
22. ↑  Turing Complete *wiki.c2.com*. Viitattu 6.2.2020. (englanniksi)
23. ↑  Paul E. Ceruzzi: *A History of Modern Computing*, s. 79. Second edition. MIT Press, 1998. ISBN 0-262-53203-4. (englanniksi)
24. ↑  Adam Vartanian: It doesn’t have to be Turing complete to be useful *increment.com*. Viitattu 7.2.2020. (englanniksi)
25. ↑  An Approach for the Systematic Development of Domain-Specific Languages (PDF) *eprints.cs.univie.ac.at*. Viitattu 7.2.2020. (englanniksi)
26. ↑  The language of languages *matt.might.net*. Viitattu 10.2.2020. (englanniksi)
27. 1 2  Yacc/Bison *cs.ccu.edu.tw*. Viitattu 10.2.2020. (englanniksi)
28. 1 2  Lawrence Snyder: Type Architectures, Shared Memmory, and the Corollary of Modest Potential (PDF) *homes.cs.washington.edu*.  1986.  (englanniksi)
29. 1 2 3 4  Oualline, Steve: *Practical C Programming*. Third edition. O'Reilly, 1997. ISBN 1-56592-306-5. (englanniksi)
30. 1 2  Ritchie, Dennis M.: The Development of the C Language *bell-labs.com*. Viitattu 24.7.2017.
31. ↑  Ohjelmointiparadigmat, Turun yliopisto, Ohjelmoinnin jatkokurssi (Kevät 2006), luentokalvot
32. ↑  Stroustrup, Bjarne: *The C++ Programming Language, 4th ed.*. Addison-Wesley, 2015. ISBN 0-321-56384-0. (englanniksi)
33. ↑  David Hemmendinger: Computer programming language *britannica.com*. Viitattu 6.2.2020. (englanniksi)
34. ↑  A simple taxonomy of programming languages *keanw.com*.  17.3.2008. Viitattu 23.3.2020. (englanniksi)
35. ↑  TIOBE Index for November 2020 *tiobe.com*. Viitattu 22.11.2020. (englanniksi)

Aiheesta muualla
----------------

CommonsCommons
Wikimedia Commonsissa on kuvia tai muita tiedostoja aiheesta **Ohjelmointikieli**.
* Aikajana muutamista ohjelmointikielistä (englanniksi)
* What is Programming? (englanniksi)
* Koodikirja.fi