Ohjelmisto

**Ohjelmisto** tai **tietokoneohjelmisto** () on joukko käskyjä tietokoneen ja siihen liittyvän laitteiston eli tietokonejärjestelmän käyttämiseen: ohjelmisto on vastakohta laitteistolle. 

Ohjelmisto on immateriaalista (ilman fyysistä olomuotoa) ja nimenomaisesti jotain, mikä ei ole konkreettista (laitteistoa). Ohjelmisto on myös tarpeen yleiskäyttöisen tietokoneen käyttämiseen, jota ilman laitteisto ei ratkaise ongelmaa.
Termi "ohjelmisto" viittaa yksittäiseen entiteettiin, mutta mitään yksittäistä ei ole: tietokonejärjestelmä koostuu sipulimaisista kerroksista, jossa on useita ohjelmakerroksia laitteistoytimen päällä. Myös laitteiston sisällä on kerroksia kuten mikro-ohjelma ja firmware.

Ohjelmisto koostuu yhdestä tai useammasta tietokoneohjelmasta, väliohjelmasta, ohjelmistokehyksestä tai ohjelmakomponentista (kuten kirjastoista). Ohjelmistotuotteisiin liittyvät usein myös niiden käyttämät tiedostot ja dokumentaatio. Ohjelmistoja ovat esimerkiksi niin tavalliset toimisto-ohjelmistot ja videopelit kuin kokonaiset käyttöjärjestelmätkin. Usein termejä *ohjelma* ja *ohjelmisto* käytetään sekaisin sekä toistensa synonyymeina.

Erityisesti sulautetuissa järjestelmissä, mutta myös yleisesti tietokoneista puhuttaessa, ohjelmistoksi kutsutaan usein kaikesta laitteen sisältämästä ohjelmakoodista muodostuvaa kokonaisuutta. 
Laitteistoon läheisesti liittyvä ohjelmisto on firmware, joka on erikoisunut ohjelmisto. Suorittimen sisäinen ohjelma on mikro-ohjelma, joka toimii alemmalla tasolla kuin konekielinen ohjelma. Tietokoneen varsinaisen suorittimen lisäksi grafiikkasuoritinta voidaan käyttää ohjelmakoodin suorittamiseen (GPGPU-käyttö).

Ohjelmat voidaan jakaa kahteen kategoriaan:
* järjestelmäohjelmat: tietokonejärjestelmän sisäistä toimintaa ohjaava ohjelmisto kuten käyttöjärjestelmä
* sovellusohjelmat: käyttäjän toiminnoista vastaavat ohjelmat kuten taulukkolaskentaohjelmat ja tekstinkäsittelyohjelmat

Epätoivottava ohjelmisto on haittaohjelma kuten tietokonevirus tai mato.

## Historia

Manchesterin yliopiston Small-Scale Experimental Machine (SSEM) oli ensimmäinen tietokone, jossa ohjelmaa voitiin vaihtaa ilman fyysisiä muutoksia tietokoneeseen (tallennetun ohjelman tietokone).

Ennen IBM S/360:tä ja monopolioikeudenkäyntiä IBM:ää vastaan ohjelmistot seurasivat ilmaiseksi tietokoneen mukana tai ne olivat erityisesti käyttötarpeeseen kehitettyjä.

Käsite omisteinen ohjelmisto syntyi vasta vuonna 1983 Applen oikeudenkäynnissä Franklin ACE-tietokoneista.

1950-luvulla julkaistuja varhaisia korkean tason ohjelmointikieliä olivat ALGOL, COBOL, Fortran ja LISP.

## Ohjelmien valmistus ja hankinta

Ohjelmistoja voi ohjelmoida itse, niitä voi saada ilmaisohjelmina (vapaan ja avoimen lähdekoodin ohjelmistot) tai niitä voi hankkia kaupallisina valmisohjelmistoina (omisteinen ohjelmisto). Valmisohjelmistot hinnoitellaan usein vielä lisenssipohjaisesti kuten lisenssi per käyttäjä tai lisenssi per suoritin (palvelinohjelmistot). Eräs ohjelmistotyyppi on pilvipalveluna tarjottava Software as a Service (SaaS) -ohjelmistotyyppi, jossa ohjelmistoa vuokrataan. SaaS-mallissa hinnoittelu perustuu käytön laajuuteen kuten projektinhallintatyökalussa hallittavien projektien määrään.

## Ohjelmien välinen toiminta
Ohjelmistot voidaan toteuttaa edusta- ja taustasovelluksina (*frontend* ja *backend*, esimerkiksi verkkoselainsovellukset), apuohjelmien avulla (kuten kaavaeditori Microsoft Officessa), komponenttien ja kirjastojen avulla tai yhtenä suurena ohjelmana.

Muun muassa pelikonsoleille julkaistavat videopelit voivat olla yhtenä suurena binääritiedostona (*blob*), joka käyttää useita yhteen liitettyjä datatiedostoja.

## Ohjelmien kääntäminen ja konfigurointi
Ohjelmointikielellä toteutettu ohjelma käännetään tai tulkataan siihen tehdyllä ohjelmalla. Käännöksen automatisointiin käytetään useita aputyökaluja kuten GNU Autotools. 

Valmiit ohjelmat ja ohjelmistot voidaan levittää jakelupaketteina tai myytävinä kokonaisuuksina. Vapaat ja avoimen lähdekoodin ohjelmistot jaetaan usein paketinhallintajärjestelmän avulla.

Asennuksen yhteydessä ohjelma(t) ja sen komponentit konfiguroidaan käyttötapausta ja käyttöympäristöä varten.

## Katso myös
* Ohjelmistoarkkitehtuuri
* Ohjelmistotuotanto
* Ohjelmistosuunnittelija
* Ohjelmointi
* Tietokonetekniikan historia
* Ohjelmistopatentti
* Ohjelmistolisenssi

## Lähteet

## Aiheesta muualla