Aliohjelma
idea aliohjelmasta syntyi sen jälkeen, kun laskentakoneet olivat olleet olemassa jo jonkin aikaa.Aritmeettinen ja ehdollinen hyppyohje suunniteltiin etukäteen ja ne ovat muuttuneet verrattain vähän, mutta toimenpidekutsuissa käytetyt erityisohjeet ovat muuttuneet vuosien saatossa suuresti.Varhaisimmissa tietokoneissa ja mikroprosessoreissa, kuten Manchester Babyssa ja RCA 1802: ssa, ei ollut ainuttakaan aliohjeohjetta.Aliohjelmat voitiin toteuttaa, mutta ne vaativat ohjelmoijia käyttämään kutsusekvenssiä—ohjesarjaa—jokaisessa puhelupaikassa.
Alirutiinit toteutettiin Konrad Zusen Z4: ssä vuonna 1945.
vuonna 1945 Alan M. Turing käytti termejä ”bury” ja ”unbury” keinona kutsua ja palata alirutiineista.
tammikuussa 1947 John Mauchly esitteli yleisiä huomioita ”a Symposium of Large Scale Digital Calculating Machineryssa” Harvardin yliopiston ja Yhdysvaltain laivaston Ordnance-viraston yhteisessä sponsoroinnissa. Tässä hän käsittelee sarja-ja rinnakkaisoperaatiota, mikä viittaa
…koneen rakenteen ei tarvitse olla yhtään monimutkainen. Koska kaikki tämän menettelyn kannalta olennaiset loogiset ominaisuudet ovat käytettävissä, on mahdollista kehittää koodausohje aliohjelmien sijoittamiseksi muistiin koneen tuntemiin paikkoihin ja siten, että ne voidaan helposti kutsua käyttöön.
toisin sanoen voidaan nimetä aliohjelma A jakolaskuksi ja aliohjelma B kompleksiseksi kertolaskuksi ja aliohjelma C lukujonon keskivirheen arvioinniksi, ja niin edelleen tiettyyn ongelmaan tarvittavien aliohjelmien luettelon kautta. … Kaikki nämä aliohjelmat tallennetaan sitten koneeseen, ja kaikki mitä tarvitsee tehdä on tehdä lyhyt viittaus niihin numero, koska ne on merkitty koodaus.
Kay McNulty oli tehnyt tiivistä yhteistyötä John Mauchlyn kanssa ENIAC-tiimissä ja kehittänyt idean aliohjelmia varten ENIAC-tietokoneelle, jota hän ohjelmoi toisen maailmansodan aikana. hän ja muut ENIAC-ohjelmoijat käyttivät aliohjelmia ohjusten lentoratojen laskemiseen.
Goldstine ja von Neumann kirjoittivat 16.elokuuta 1948 päivätyn paperin, jossa käsiteltiin aliohjelmien käyttöä.
joissakin hyvin varhaisissa tietokoneissa ja mikroprosessoreissa, kuten IBM 1620: ssa, Intel 4004: ssä ja Intel 8008: ssa sekä PIC-mikrokontrollereissa, on yhden käskyn aliohjelma—kutsu, joka käyttää erillistä laitteistopinoa paluuosoitteiden tallentamiseen-tällainen laitteisto tukee vain muutaman tason aliohjelmia, mutta voi tukea rekursiivisia aliohjelmia. Koneet ennen 1960-luvun puoliväliä—kuten UNIVAC I, PDP-1 ja IBM 1130—käyttävät tyypillisesti kutsumuskonventiota, joka tallensi ohjelaskurin kutsutun aliohjelman ensimmäiseen muistipaikkaan. Tämä mahdollistaa mielivaltaisen syvien aliohjelmien pesinnän, mutta ei tue rekursiivisia aliohjelmia. PDP-11 (1970) on yksi ensimmäisistä tietokoneista, joissa on pinoa työntävä aliohjelma kutsuopetus; tämä ominaisuus tukee sekä mielivaltaisen syvää aliohjelmaa pesintää ja tukee myös rekursiivisia aliohjelmia.
kielen tuki
hyvin varhaisissa kokoonpanijoissa aliohjelman tuki oli vähäistä. Aliohjelmia ei erikseen erotettu toisistaan tai pääohjelmasta, ja itse asiassa aliohjelman lähdekoodi voitiin sekoittaa muiden aliohjelmien lähdekoodiin. Jotkut assemblerit tarjoaisivat ennalta määritettyjä makroja puhelun ja paluun sekvenssien luomiseen. 1960-luvulle tultaessa assemblereilla oli yleensä paljon kehittyneempi tuki sekä inline-että erikseen koottaville alirutiineille, jotka voitiin yhdistää toisiinsa.
Alirutiinikirjastomedit
tälläkin hankalalla lähestymistavalla alirutiinit osoittautuivat erittäin hyödyllisiksi. Ensinnäkin he sallivat saman koodin käytön monissa eri ohjelmissa. Lisäksi muisti oli hyvin niukka resurssi varhaisissa tietokoneissa, ja aliohjelmat mahdollistivat merkittäviä säästöjä ohjelmien koossa.
monet varhaiset tietokoneet latasivat ohjelman ohjeet muistiin reikäpaperinauhalta. Jokainen aliohjelma voitaisiin sitten tarjota erillisellä nauhalla, joka ladattiin tai liitettiin ennen tai jälkeen pääohjelman (tai ”mainline”); ja samaa aliohjelman nauhaa voitaisiin sitten käyttää monissa eri ohjelmissa. Samanlaista lähestymistapaa sovelletaan tietokoneissa, jotka käyttivät reikäkortteja niiden pääsyötteenä. Nimi alirutiinikirjasto tarkoitti alun perin kirjaimellisessa merkityksessä kirjastoa, jossa säilytettiin indeksoituja nauhakokoelmia tai korttipakkoja kollektiiviseen käyttöön.
Return by indirect jumpEdit
poistaakseen itse muokkaavan koodin tarpeen tietokonesuunnittelijat antoivat lopulta epäsuoran hyppyohjeen, jonka operandina toimi itse paluuosoitteen sijaan paluuosoitteen sisältävän muuttuja-tai prosessorirekisterin sijainti.
näissä tietokoneissa kutsuohjelma ei muuttaisi aliohjelman paluuhyppyä, vaan tallentaisi paluuosoitteen muuttujaan siten, että aliohjelman valmistuttua se suorittaisi epäsuoran hypyn, joka ohjaisi suorituksen ennalta määritetyn muuttujan antamaan paikkaan.
hyppy alirutiineihin
toinen edistysaskel oli hyppy alirutiiniopetukseen, jossa yhdistettiin paluuosoitteen tallentaminen kutsuhyppyyn, jolloin ylimeno minimoitui merkittävästi.
IBM System / 360: ssä esimerkiksi proseduuripuheluun suunnitellut sivukonttorin ohjeet BAL tai BALR tallentaisivat palautusosoitteen ohjeessa määriteltyyn prosessorirekisteriin, convention register 14: ään. Palatakseen aliohjelman piti suorittaa vain epäsuora Br-käsky kyseisen rekisterin kautta. Jos aliohjelma tarvitsi kyseistä rekisteriä johonkin muuhun tarkoitukseen (kuten toisen aliohjelman kutsumiseen), se tallentaisi rekisterin sisällön yksityiseen muistipaikkaan tai rekisteripinoon.
HP 2100: n kaltaisissa järjestelmissä JSB-ohje hoitaisi vastaavan tehtävän, paitsi että paluuosoite tallennettiin haaran kohteena olleeseen muistipaikkaan. Toimenpiteen suorittaminen alkaisi itse asiassa seuraavasta muistipaikasta. HP 2100 assembly-kielellä kirjoitettaisiin esimerkiksi
... JSB MYSUB (Calls subroutine MYSUB.) BB ... (Will return here after MYSUB is done.)
kutsumaan pääohjelmasta aliohjelmaa nimeltä MYSUB. Aliohje merkittäisiin koodilla
MYSUB NOP (Storage for MYSUB's return address.) AA ... (Start of MYSUB's body.) ... JMP MYSUB,I (Returns to the calling program.)
JSB: n Ohje sijoitti seuraavan ohjeen osoitteen (eli BB) sen operandiksi määriteltyyn paikkaan (eli MYSUB) ja haarautui sen jälkeen seuraavaan paikkaan (eli AA = MYSUB + 1). Aliohjelma voisi sitten palata pääohjelmaan suorittamalla epäsuoran hypyn JMP MYSUB, I joka haarautui sijaintiin mysub.
Fortranin ja muiden kielten kääntäjät voisivat helposti hyödyntää näitä ohjeita, kun niitä on saatavilla. Tämä lähestymistapa Tuki useita tasoja puhelut; kuitenkin, koska paluuosoite, parametrit ja paluuarvot aliohjelman oli osoitettu kiinteän muistin sijainnit, se ei salli rekursiivisia puheluita.
vastaavanlaista menetelmää käytti Lotus 1-2-3 1980-luvun alussa selvittääkseen uudelleenlaskennan riippuvuudet laskentataulukossa. Nimittäin, paikka oli varattu jokaisessa solussa tallentaa palautusosoite. Koska ympyränmuotoiset viittaukset eivät ole sallittuja luonnollisessa uudelleenlaskujärjestyksessä, tämä mahdollistaa puun kävelyn varaamatta tilaa pinolle muistissa, mikä oli hyvin rajallista pienissä tietokoneissa, kuten IBM PC: ssä.
Call stackeedit
useimmissa nykyaikaisissa alirutiinipuhelujen toteutuksissa käytetään stack-tietorakenteen erikoistapausta, jossa alirutiinipuhelut ja-palautukset toteutetaan. Jokainen menettelykutsu luo uuden merkinnän, jota kutsutaan pinon kehykseksi, pinon yläosaan.; kun menettely palaa, sen pinon runko poistetaan pinosta, ja sen tilaa voidaan käyttää muihin menettelykutsuihin. Jokainen pinon kehys sisältää vastaavan puhelun yksityiset tiedot, jotka tyypillisesti sisältävät menettelyn parametrit ja sisäiset muuttujat, sekä palautusosoitteen.
kutsusekvenssi voidaan toteuttaa tavallisten ohjeiden jaksolla (lähestymistapa, jota käytetään edelleen reduced instruction set computing (RISC) ja very long instruction word (VLIW) – arkkitehtuureissa), mutta monet perinteiset 1960-luvun lopulta lähtien suunnitellut koneet ovat sisältäneet tähän tarkoitukseen erityisiä ohjeita.
kutsupino toteutetaan yleensä yhtenäisenä muistin alueena. On mielivaltainen suunnitteluvalinta, onko pinon alin vai korkein osoite tällä alueella, jotta pino voi kasvaa eteenpäin tai taaksepäin muistissa; monet arkkitehtuurit valitsivat kuitenkin jälkimmäisen.
joissakin malleissa, erityisesti joissakin Forth-toteutuksissa, käytettiin kahta erillistä pinoa, joista toinen oli lähinnä ohjaustietojen (kuten palautusosoitteiden ja silmukkalaskureiden) ja toinen datan. Edellinen oli tai toimi kuten puhelupino ja oli vain epäsuorasti ohjelmoijan käytettävissä muiden kielikonstruktioiden kautta, kun taas jälkimmäinen oli suoremmin saatavilla.
kun stack-pohjaiset menettelykutsut otettiin ensimmäistä kertaa käyttöön, tärkeä motivaatio oli kallisarvoisen muistin säästäminen. Tämän järjestelmän avulla kääntäjän ei tarvitse varata erillistä tilaa muistiin kunkin menettelyn yksityisille tiedoille (parametrit, paluuosoite ja paikalliset muuttujat). Milloin tahansa, pino sisältää vain yksityisiä tietoja puhelut, jotka ovat tällä hetkellä aktiivisia (nimittäin, jotka on soitettu, mutta ei ole vielä palannut). Koska ohjelmat yleensä koottiin kirjastoista, ei ollut (eikä ole edelleenkään) harvinaista löytää ohjelmia, jotka sisältävät tuhansia aliohjelmia, joista vain kourallinen on aktiivisia kulloinkin. Tällaisissa ohjelmissa call stack-mekanismi voisi säästää merkittäviä määriä muistia. Kutsupinon mekanismia voidaankin pitää varhaisimpana ja yksinkertaisimpana menetelmänä automaattiseen muistinhallintaan.
kutsupinomenetelmän toinen etu on kuitenkin se, että se mahdollistaa rekursiiviset alirutiinipuhelut, sillä jokainen sisäkkäinen puhelu samaan menettelyyn saa erillisen instanssin yksityisistä tiedoistaan.
viivästynyt pinoaminen Edit
yksi kutsupinon mekanismin haitta on prosessipuhelun lisääntynyt hinta ja sen täsmäävä tuotto. Lisäkustannuksiin kuuluu pinon osoittimen lisääminen ja säätäminen (ja joissakin arkkitehtuureissa pinon ylivuotojen tarkistaminen) sekä paikallisten muuttujien ja parametrien käyttö kehyssuhteellisilla osoitteilla absoluuttisten osoitteiden sijaan. Kustannukset voivat realisoitua lisääntyneenä suoritusaikana tai lisääntyneenä prosessorikompleksina tai molemmissa.
tämä yläpuoli on ilmeisin ja paheksuttavin lehtitoimenpiteissä tai lehtifunktioissa, jotka palaavat ilman, että mikään toimenpide kutsuu itseään.Vähentää, että yläpuolella, monet nykyaikaiset kääntäjät yrittävät viivyttää käyttöä puhelun pino, kunnes se on todella tarvitaan. Esimerkiksi toimenpiteen P kutsu voi tallentaa kutsutun menettelyn palautusosoitteen ja parametrit tiettyihin prosessorirekistereihin ja siirtää kontrollin toimenpiteen kehoon yksinkertaisella hypyllä. Jos menettely P palaa soittamatta mitään muuta puhelua, soittopinoa ei käytetä lainkaan. Jos P: n on soitettava toiseen menettelyyn Q, se käyttää soittopinoa tallentaakseen rekisterien sisällön (kuten palautusosoitteen), jota tarvitaan Q: n paluun jälkeen.