Ohjelmointirajapinta

**Ohjelmointirajapinta** () on komponenttien ja moduulien välinen raja ohjelmoitavassa järjestelmässä.

Ohjelmointirajapinta on määritelmä, jonka mukaan eri ohjelmat voivat tehdä pyyntöjä ja vaihtaa tietoja eli *keskustella* keskenään. Esimerkki rajapinnasta on käyttöjärjestelmän rajapinta, jolla ohjelmat voivat käyttää keskusmuistia sekä tiedostoja.

Ohjelmointirajapinnat voivat toimia ohjelmien välillä tai ohjelmien ja laitteiston välillä (esimerkiksi BIOS). Ohjelmointirajapinnan tunnusmerkkeihin kuuluvat *joukko toimintoja syötteiden ja tulosteiden määrittäminä* sekä *mahdollisuus muuttaa toteutusta ilman häiriötä sen käyttäjille*.

Ohjelmointirajapintoja voi toteuttaa lähes kaikilla olemassa olevilla ohjelmointikielillä. Termillä viitataan usein myös internetin yli toimiviin ohjelmointirajapintoihin (Web API). Internetin yli toimivien ohjelmointirajapintojen voidaan katsoa olevan esimerkiksi Amazonin AWS-pilvipalvelujen menestyksen taustalla. Niiden liiketoiminnallisena ideana on kapseloida palvelimien monimukainen logiikka helppokäyttöisen ohjelmointirajapinnan taakse ja tuottaa siitä ohjelmointirajapinnan avulla yksinkertainen tapa hyödyntää niitä tarpeen mukaan. Moderneja internetin yli toimivia ohjelmointirajapintoja toteutetaan esimerkiksi Restful-arkkitehtuurityylillä.

## Historia
Keskeisessä osassa ohjelmointirajapintojen syntyä on Maurice Wilkesin, David Wheelerin ja Stanley Gillin työ EDSAC-tietokoneen parissa. 
Aiempi John von Neumannin ja Herman Goldstinen työ käsitteli aihetta hyvin yleisellä tasolla.
Wilkesin havaittua ensimmäisen ei-triviaalin ohjelman yhteydessä käyttävänsä jatkossa huomattavasti aikaa ohjelmien debuggaukseen tunnistettiin tarve uudelleen käytettäville alirutiineille. EDSAC:lla ei ollut vielä kilpailevia arkkitehtuureita, ei edes toista samanlaista tietokonetta eikä ennestään ollut olemassa vanhoja tuettavia ohjelmia, mutta se oli varhainen käsitteen syntyyn vaikuttanut askel.
Ensimmäinen termin *application programming interface* käyttö liitetään vuoden 1968 artikkeliin *Data Structures and Techniques for Remote Computer Graphics*.

## Kuvaus

Kirjastojen kanssa ohjelmointirajapinta määrittää, miten ohjelma kutsuu kirjastoa. Ohjelmistokehyksen kanssa ohjelmointirajapinta määrittää, miten kehys kutsuu ohjelmaa. Dokumentointi on keskeinen osa rajapintaa.

Yksi ohjelmointirajapinnan päätarkoituksista on tarjota käyttömahdollisuus yleisimmille toiminnoille. Käyttöliittymä voi esimerkiksi tarjota ohjelmointirajapinnan ikkunoiden tai kuvakkeiden piirtoon, ja tietokanta taas rajapinnan kyselyiden läpiviemiseksi. Ohjelmointirajapinta liitetään hyvin usein osaksi **[[SDK]]:ta** (*Software development kit*).

Hyvä ohjelmointirajapinta sisältää kapseloinnin, jonka avulla ohjelmoijan ei tarvitse tietää rajapinnan alaisista menetelmistä. Tämän avulla rajapinta voidaan pitää "alaspäin yhteensopivana", eli ohjelmointirajapinnan toimintaa voidaan tehostaa ilman, että ohjelma, joka käyttää rajapintaa, häiriintyisi siitä.

Ohjelmointirajapintojen julkaisukäytännöistä erottuu kolme erilaista tapaa:

# *Ohjelmointirajapintaa ei julkaista* (yksityinen)
# *Rajapinta julkaistaan tietyin rajoituksin* (yhteistyökumppanit)
# *Täysin tai lähestulkoon avoin ohjelmointirajapinnan julkaisu* (julkinen)

POSIX on esimerkki standardoidusta rajapinnasta, jonka kuvaus on avoimesti saatavilla ja useiden valmistajien tukema.
Useiden pelikonsolien ohjelmointirajapinnat ovat saatavilla vain lisensoiduille tahoille.
Suljettuja rajapintoja on käytössä kaupallisissa ohjelmistoissa, joissa ne ovat vain kehittäjätahon tiedossa.

Käytännössä järjestelmä voi sisältää kaikkia kolmea, esimerkiksi kaupallisessa käyttöjärjestelmässä on vain kehittäjien tiedossa olevia rajapintoja, yhteistyökumppaneille avattuja rajapintoja sekä julkisia rajapintoja sovelluskehittäjille.

## Kiistat
Rajapinnat ovat keskeisessä osassa kiistaa Oraclen ja Googlen välillä jälkimmäisen Java-toteutukseen liittyen. Yhdysvaltain korkeimman oikeuden päätöksessä rajapintojen käyttö ei rikkonut tekijänoikeuslakia. Päätöksessä todettiin, että jos Oracle saisi rajoittaa rajapintojensa käyttöä se olisi haitallista ja rajoittaisi uusien ohjelmistojen kehittämistä. Vuonna 2021 ratkaistu kiista on ollut käynnissä vuodesta 2010 lähtien.

## Suomen julkisen hallinnon API-periaatteet
Suomessa on laadittu vuonna 2022 julkisen hallinnon API-periaatteet. Niiden tavoitteena on yhtenäistää julkisen hallinnon eri organisaatioiden toimintaa ohjelmointirajapinnoissa. Lisäksi Digi- ja väestötietovirasto koordinoi julkisen hallinnon API-verkostoa, jossa ylläpidetään ja kehitetään julkisen hallinnon API-periaatteita.

## Kansalaisjärjestötyö
Open Knowledge Finland ry. on laatinut avoimen ohjelmointirajapinnan määritelmän vuonna 2014, jonka ideana on määritellä avoin ohjelmointirajapinta terminä.

## Katso myös
* ABI (*Application binary interface*)

## Lähteet

## Aiheesta muualla
* A Brief, Opinionated History of the API 
* How to Design a Good API and Why it Matters  (PDF) 
* How Do I Make This Hard to Misuse? 
* What If I Don't Actually Like My Users? 
* avoinrajapinta.fi: Avoimen rajapinnan määritelmä