Coroutine ( englanniksi corutine ) - ohjelmistomoduuli , joka on erityisesti järjestetty varmistamaan vuorovaikutus muiden moduulien kanssa yhteistoiminnallisen moniajon periaatteella : moduuli keskeytetään tietyssä pisteessä, mikä tallentaa täyden tilan (mukaan lukien puhelupinon ja komentolaskurin ) ja siirtää ohjaus toiselle, toinen vuorostaan suorittaa tehtävän ja siirtää ohjauksen takaisin säilyttäen pinon ja laskurin. Kuitujen ohella korutiinit ovat keino tarjota "kevyt" ohjelmiston monisäikeisyys siinä mielessä, että ne voidaan toteuttaa ilman käyttöjärjestelmän kontekstinvaihtomekanismeja .
Korutiinit ovat joustavampia ja yleisempiä kuin aliohjelmat : verrattuna alirutiiniin, jolla on aina yksi aloituspiste, korutiinilla on aloituskohta ja se on sisäkkäin palautussarjan sisällä, jota seuraa aloituspisteet. Aliohjelma voi palata vain kerran, korutiini voi palata useita kertoja. Aliohjelman ajoaika määräytyy LIFO - periaatteella (viimeksi kutsuttu aliohjelma valmistuu ensin), aliohjelman ajoaika määräytyy sen käytön ja välttämättömyyden mukaan.
Korutiinin käsitteen syntyminen johtuu Melvin Conwayn vuonna 1958 käyttämästä konstruktiosta ohjelmoinnissa kokoonpanokielellä [1] , 1960-1970-luvuilla korutiinia harjoitettiin joissakin korkean tason kielissä . ( Klu , Simula , Modula-2 ), mutta ne saivat huomattavan levinneisyyden vasta 2000-luvulla, jolloin suosittuihin ohjelmointikieliin ilmestyi lukuisia korutiinitukikirjastoja ja joitain uusia kieliä (kuten Lua , Ruby , Go , Julia ) on rakennettu alusta alkaen. Korutiineja käytetään toteuttamaan monia samankaltaisia ohjelmakomponentteja, kuten generaattoreita ja iteraattoreita , laiskoja arviointeja käyttäviä äärettömiä listoja , putkia , tilakoneita yhden aliohjelman sisällä (jossa tilan määrää nykyinen tulo- ja poistumispiste), poikkeuksia käsittelevät toteutukset ja näyttelijän malli .
Merkittävä osa suosituista ohjelmointikielistä , mukaan lukien C ja johdannaiset ( C++ ennen C++20 ), ei tue suoraan korutiineja kielessä tai vakiokirjastossa (tämä johtuu suurelta osin pinon vaatimuksista aliohjelmien toteutus).
Tilanteessa, jossa korutiinit, jotka ovat luonnollinen tapa toteuttaa komponentteja, eivät ole käytettävissä, tyypillinen ratkaisu on luoda korutiinit käyttämällä boolen lippuja ja muita muuttujatiloja ulkoisen tilan ylläpitämiseksi kutsujen välillä. Koodin sisällä olevat ehdot saavat aikaan erilaisia komentosarjoja, jotka suoritetaan peräkkäisissä kutsuissa tilamuuttujien arvojen mukaan. Toinen tyypillinen ratkaisu on toteuttaa tilakone itse isolla kytkinlauseella . Tällaisia toteutuksia on vaikea tukea ja ylläpitää.
Virrat ovat sopiva vaihtoehto korutiineille useimmissa nykyaikaisissa malleissa. Säikeet tarjoavat mahdollisuuden hallita "samanaikaisesti" suoritettavien koodiosien vuorovaikutusta. Siksi se on ratkaisu suuriin ja monimutkaisiin ongelmiin, se sisältää voimakkaita monimutkaisia ominaisuuksia ja siihen liittyy monimutkaisuutta oppia. Muista vaihtoehdoista huolimatta säikeet ovat kuitenkin laajalti saatavilla C-ympäristössä, ne ovat tuttuja useimmille ohjelmoijille ja yleensä toteutetaan, dokumentoidaan ja ylläpidetään.
Joitakin yrityksiä toteuttaa korutiineja C:ssä:
Yksi tapa käyttää korutiineja kielillä ilman alkuperäistä tukea on pinoamattomat protosäikeet , jotka tarjoavat estokontekstin useiden muistitavujen kustannuksella säiettä kohden.
Toiminnalliset ohjelmointikielet käyttävät usein korutiineja, kuten Scheme , Lisp , Haskell . Useisiin kieliin on lisätty sisäänrakennettu korutiinituki myöhemmissä toteutuksissa, kuten Python (versiosta 2.5 lähtien ja selkeällä syntaktisella tuella vuodesta 3.5), PHP (5.5:stä lähtien), Kotlin (1.1:stä lähtien), JavaScript (1.7 alkaen ). ), C# (alkaen 2.0), Tcl (alkaen 8.6).