Ohjelmointi

Ohjelmointi tarkoittaa tietokoneelle tai vastaavalle ohjelmoitavalle laitteelle jollakin tavalla, tyypillisesti kirjoittamalla, annettavia toimintaohjeita formaalilla kielellä eli ohjelmointikielellä. Tietokoneet ymmärtävät niille annettavia käskyjä, joista muodostuu tietokoneelle suoritettavaksi annettu toimintaohje eli tietokoneohjelma.
Ohjelmoimalla saadaan aikaiseksi tietokoneohjelman konekielinen koodi, symbolista konekieltä oleva koodi tai korkeamman tason käännettävä lähdekoodi. Ohjelmointi kehittyi 1950-luvulta 1970-luvulle matalan tason ohjelmointikielistä käännettävien ohjelmointikielten suuntaan, sillä niiden symbolinen logiikka, loogiset rakenteet ja avainsanat ovat ihmisen helpommin ymmärrettävissä ja ohjelmointivirheet silmämääräisesti korjattavissa.
Korkeamman tason kieltä käyttämällä on lähdekoodi käännettävissä useammille kohdesuorittimille, kun taas konekieli ja symbolinen konekieli ovat sidoksissa tiettyyn suoritinarkkitehtuuriin ja siirrettävyys toiselle arkkitehtuurille on siksi heikko.
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 codice_1 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.
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 (, koneturvallisuus) on mukana (erona muunlaisesta turvatekniikasta ()).
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:
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.
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.