Ohjelmisto tai tietokoneohjelmisto (engl.software) on joukko käskyjä tietokoneen ja siihen liittyvän laitteiston eli tietokonejärjestelmän käyttämiseen: ohjelmisto on vastakohta laitteistolle.[1][2][3][4]
Ohjelmisto on immateriaalista (ilman fyysistä olomuotoa) ja nimenomaisesti jotain, mikä ei ole konkreettista (laitteistoa).[4] Ohjelmisto on myös tarpeen yleiskäyttöisen tietokoneen käyttämiseen, jota ilman laitteisto ei ratkaise ongelmaa.[4]
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ä.[4] Myös laitteiston sisällä on kerroksia kuten mikro-ohjelma ja firmware.[4]
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.[5]Suorittimen sisäinen ohjelma on mikro-ohjelma, joka toimii alemmalla tasolla kuin konekielinen ohjelma.[6] Tietokoneen varsinaisen suorittimen lisäksi grafiikkasuoritinta voidaan käyttää ohjelmakoodin suorittamiseen (GPGPU-käyttö).[7][8]
Ennen IBM S/360:tä ja monopolioikeudenkäyntiä IBM:ää vastaan ohjelmistot seurasivat ilmaiseksi tietokoneen mukana tai ne olivat erityisesti käyttötarpeeseen kehitettyjä.[10]
Ohjelmistoja voi ohjelmoida itse, niitä voi saada ilmaisohjelmina (vapaan ja avoimen lähdekoodin ohjelmistot) tai niitä voi hankkia kaupallisina valmisohjelmistoina (omisteinen ohjelmisto).[14] 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)[15], apuohjelmien avulla (kuten kaavaeditori Microsoft Officessa[16]), komponenttien ja kirjastojen avulla tai yhtenä suurena ohjelmana.
Muun muassa pelikonsoleille julkaistavat videopelit voivat olla yhtenä suurena binääritiedostona (blob)[17], joka käyttää useita yhteen liitettyjä datatiedostoja.[18][19]
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.