Ohjelmointia Java-ohjelmointikielellä 
**Ohjelmointi** tarkoittaa tietokoneelle tai vastaavalle ohjelmoitavalle laitteelle jollakin tavalla, tyypillisesti kirjoittamalla, annettavia toimintaohjeita formaalilla kielellä eli ohjelmointikielellä.

Perusteet
---------

Tietokoneen suoritin ymmärtää suoraan vain ohjelmia, jotka on kirjoitettu konekielellä. Konekieli koostuu yksinkertaisista operaatioista, esimerkiksi "vähennä rekisterin 3 arvosta rekisterin 5 arvo". Ohjelmointi suoraan konekielellä on mahdollista, mutta hyvin hidasta ja virhealtista johtuen laitteiden eroavaisuuksista. Konekielellä ohjelmia kirjoitetaan usein vain poikkeustapauksissa. Useammin käytetään symbolista konekieltä (ks. assembly). On huomattavaa, että myös symbolinen konekieli kääntyy viime kädessä ykkösiksi ja nolliksi, jotka vastaavat prosessorin transistoreiden päälle/pois tilaa.

Tavallisesti tietokonetta ohjelmoidaan käyttämällä jotakin ohjelmointikieltä. Ohjelmointikielissä käytetään luettavia symboleja ja sovittuja koodeja. Esimerkiksi Pascal-kielisen ohjelman rivi `palkka := palkka-vero;` voisi kääntyä edellä mainituksi konekielen operaatioksi. Ohjelmointikielellä kirjoitettu lähdekoodi joko käännetään konekielelle tai tulkataan kieltä suorittavalla ohjelmalla. Käännettäessä koko ohjelma muutetaan kerralla konekieleksi, jonka tuloksena saatu ohjelma voidaan suorittaa ilman kääntäjää. Tulkattaessa tyypillisesti käännetään osa kerrallaan ja suoritetaan se, jonka jälkeen käännetään seuraava osa. Tulkattavan ohjelman suoritus vaatii siis joka kerta tulkin. Molemmissa tavoissa on mahdollista käyttää välikieltä apuna.

Ohjelmointiparadigmat ovat ohjelmointikielien taustalla olevia tapoja ajatella ja mallintaa ratkaisu. Eri kielet tukevat eri paradigmoja eri tavoin: osa kielistä on *moniparadigmaisia*, jolloin niillä voi ohjelmoida useilla eri tavoilla. Eräs merkittävä paradigma on olio-ohjelmointi.

Historia
--------

*Pääartikkelit: Tietokonetekniikan historia ja Ohjelmointikieli*
Ennen tallennetun ohjelman tietokonetta muutokset ohjelmassa tarkoittivat muutoksia johdoissa ja kytkimissä (ks. Colossus).
Ennen vuotta 1954 lähes kaikki ohjelmointi tehtiin matalan tason ohjelmointikielillä kuten konekielellä tai assemblyllä. Suuri osa ohjelmoijien työstä liittyi tuon ajan tietokoneiden rajoitteisiin. Vuonna 1954 tietokonekeskukseen liittyvien ohjelmoijien kustannukset olivat tavallisesti lähes yhtä suuret kuin itse tietokoneen kustannukset, joka oli yksi motivaatio FORTRANin kehittämiselle.

Margaret Hamiltonin työ Apollo Guidance Computerin ohjelmoinnissa ja kehitetyt konseptit olivat edelläkävijänä huippuluotettavien ohjelmistojen suunnittelulle. 
Nykyisin ohjelmistoja käytetään myös turvakriittisissä järjestelmissä osana koko järjestelmää, jossa henkilöstön turvallisuus (engl. *safety*, koneturvallisuus) on mukana (erona muunlaisesta turvatekniikasta (engl. *security*)).

Laitteistoabstraktion kannalta neljännen sukupolven ohjelmointikielet saavuttivat täyden riippumattomuuden laitteistoalustasta. Neljännen sukupolven kieliä on myös kritisoitu laitteistoresurssien tuhlaavasta käytöstä, etenkin suoritusajan.

1980-luvulla Japanissa aloitettiin projekti viidennen sukupolven tietokonejärjestelmän kehittämiseen, jonka merkittävin vaikutus oli mahdollisesti lukuisien ihmisten kouluttaminen tietotekniikkaan.

Ohjelmiston laatu
-----------------

Ohjelmoinnissa tuotetun ohjelmakoodin laatua voidaan arvioida useilla eri mittapuilla:

* luotettavuus
* suoritustehokkuus
* turvallisuus
* ylläpidettävyys

Näihin pyrkiessä voidaan käyttää apuna erilaisia ohjelmointikäytäntöjä. Käytännöt liittyvät muun muassa koodin helppoon luettavuuteen, yhdenmukaisuuteen nimeämisessä ja ymmärrettävyyteen myös pitkän ajan jälkeen. Käytännöillä parannetaan ohjelmoinnin tehokkuutta, vähennetään projektin riskejä ja helpotetaan ylläpitoa.

Suoritustehokkuus
-----------------

Suoritustehokkuus vaikuttaa muun muassa virran käyttöön ja suoritusaikaan: huono suorituskyky aiheuttaa muita haittavaikutuksia.

*Katso myös: Asymptoottinen suoritusaika*

Ohjelmiston testaaminen
-----------------------

Osana ohjelmiston laaduvarmistusta on ohjelmiston testaaminen, johon voi kuulua yksikkötestaaminen ja koodin kirjoittaminen testejä varten.
Yrityskäyttöön suunnatuissa sovelluksissa riittävän testikattavuuden saamiseksi voi tarvita 1–3 riviä testikoodia jokaista tuotantoon menevää koodiriviä kohden ja suhde voi olla suurempikin.

Tietoturvallinen ohjelmointi
----------------------------

Tietoturvan kannalta merkittävissä järjestelmissä (pankkijärjestelmät, henkilötietojärjestelmät) käytetään periaatteita, joilla pyritään estämään tietoturva-aukkoja. Periaatteina ovat pääsyn valvonnasta huolehtiminen, vahvan salauksen käyttö ja salaisuuksien hallinta. Käytäntöjä ovat muun muassa koodin minimointi, koodin katselmointi ja auditointi.

Mahdollisia tulevaisuuden ohjelmointimenetelmiä
-----------------------------------------------

Ohjelmointikielet voivat perustua eri paradigmoihin kuten rinnakkaiseen käsittelyyn (CSP, Occam, LOTOS), logiikkaan (Prolog) ja niin edelleen. 

Kvanttitietokoneiden ohjelmointiperiaatteet ovat merkittävästi erilaisia aiemmin käytetyistä: kvanttiohjelmoinnissa todennäköisyyksillä on suurempi merkitys.

Tekoälyn koulutuksessa käytettävät periaatteet poikkeavat muun muassa järjestelmäohjelmoinnissa käytetyistä.

Laitteistokuvauskielet kuten VHDL ja SystemC ovat kehittyneet, jolloin myös ne muistuttavat enemmän ohjelmointikieliä. Muun muassa ASIC ja FPGA kehitys ovat muuttuneet logiikkasynteesin avulla.

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

* Ohjelmistokehitys
* Ohjelmistotuotanto
* Ketterä ohjelmistokehitys

Lähteet
-------

1. ↑  B. Jack Copeland: The Modern History of Computing *plato.stanford.edu*.  2006. Viitattu 7.10.2021. (englanniksi)
2. 1 2 3  John Backus: FORTRAN Session (PDF) Computer History Musem. Viitattu 10.2.2020. (englanniksi)
3. ↑  Margaret Hamilton NASA. Viitattu 8.9.2017.
4. ↑  Firesmith, Donald: Engineering Safety- and Security-Related Requirements for Software-Intensive Systems (PDF) Carnegie Mellon University. Viitattu 29.9.2017. (englanniksi)
5. ↑  Safety Critical Systems Design *omg.org*. Viitattu 27.9.2017.
6. 1 2  Roger Clarke: A Contingency Approach to the Application Software Generations *rogerclarke.com*.  1991. Viitattu 4.2.2020. (englanniksi)
7. ↑  Andrew Pollack: 'Fifth Generation' Became Japan's Lost Generation  5.6.1992. New York Times. Viitattu 10.2.2020. (englanniksi)
8. ↑  Software Quality Standards – ISO 5055 *it-cisq.org*. Viitattu 20.10.2021. (englanniksi)
9. 1 2 3  Importance of Code Quality and Coding Standard in Software Development *multidots.com*.  21.1.2020. Viitattu 20.10.2021. (englanniksi)
10. ↑  The Impact of Source Code in Software on Power Consumption (PDF) *hal.archives-ouvertes.fr*. Viitattu 20.10.2021. (englanniksi)
11. ↑  Consequences of Poorly Performing Software Systems (PDF) *immagic.com*. Viitattu 20.10.2021. (englanniksi)
12. ↑  The current state of unit testing *livebook.manning.com*. Viitattu 20.10.2021. (englanniksi)
13. ↑  Secure coding practices every developer should know *snyk.io*. Viitattu 20.10.2021. (englanniksi)
14. ↑  'Quantum computer algorithms are linear algebra, probabilities. This is not something that we do a good job of teaching our kids' *theregister.com*.  1.10.2021. Viitattu 7.10.2021. (englanniksi)

Kirjallisuutta
--------------

* Erich Gamma & Richard Helm & Ralph Johnson & John Vlissides: *Design Patterns - Olio-ohjelmointi, Suunnittelumallit*. IT Press, 2000. ISBN 951-826-428-7.
* Steve McConnell: *Code Complete*. Second Edition. Microsoft Press, 2004. ISBN 0-7356-1967-0.
* Jouni Smed & Harri Hakonen & Timo Raita: *Sopimuspohjainen olio-ohjelmointi Java-kielellä*. Elektroninen kirja, 2007. ISBN 978-952-92-1776-2

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

CommonsCommons
Wikimedia Commonsissa on kuvia tai muita tiedostoja aiheesta **Ohjelmointi**.
* Koodi on kaikkialla – lyhyt johdatus ohjelmoinnin maailmaan - yle.fi