Funargin ongelma

Funarg  - lyhenne sanoista "funktionaalinen argumentti"; tietojenkäsittelytieteessä funargue-ongelma viittaa vaikeuteen toteuttaa toimintoja ensiluokkaisina objekteina pinosuuntautuneilla ohjelmointikielillä (laajemmassa merkityksessä, mukaan lukien kaikki kielet, joissa parametrit välitetään funktioille pinon kautta).

Monimutkaisuus syntyy, jos funktion runko viittaa suoraan (esimerkiksi ei parametrien välityksen kautta) tunnisteisiin, jotka on määritelty siinä ympäristössä, jossa funktio määritellään, eikä sen kutsun ympäristössä [1] . Yhteenvetona seuraava päättely, kaksi standardiratkaisua ovat kieltää tällaiset viittaukset tai luoda sulkemisia [2] .

Ongelmasta on kaksi versiota: nouseva funarg-ongelma ilmenee, kun funktio palaa jostain funktiosta, laskeva funarg-ongelma syntyy, kun funktio  välitetään parametrina jollekin funktiolle.

The Rising Funarg Problem

Kun funktio kutsuu toista normaalin ohjelman suorituksen aikana, kutsuvan funktion paikallinen tila (mukaan lukien parametrit ja paikalliset muuttujat) on tallennettava, jotta suoritusta voidaan jatkaa kutsutun funktion palattua. Useimmissa käännetyissä ohjelmissa tämä paikallinen tila on tallennettu puhelupinoon tietorakenteessa, jota kutsutaan pinokehykseksi . Tämä pinokehys työnnetään puhelupinoon, kun sisäistä toimintoa kutsutaan, ja poistetaan sieltä, kun se palaa. Kupliva funarg-ongelma ilmenee, kun soittaja viittaa soitetun tilaan kutsutun palattua. Siksi kutsutun funktion tilan sisältävää pinokehystä ei saa vapauttaa sen palatessa, mikä rikkoo pinosuuntautuneen funktion kutsuparadigman.

Ratkaisu kuplivaan funargs-ongelmaan on sijoittaa pinokehys kasaan puhelupinon sijaan luottaen jonkinlaiseen roskatkeräykseen varmistaakseen, että pinokehysten käyttämät resurssit vapautuvat, kun niitä ei enää tarvita. Kasaan allokoitujen pinokehysten kanssa työskentely on paljon tehottomampaa kuin pinossa, joten tämä strategia voi heikentää suorituskykyä merkittävästi.

Jos sulkevien funktioiden kehysten varaama muisti on pieni ja näiden kehysten data ei muutu, voidaan sulkevien funktioiden kehyksiä välittää arvoina. Tämä ominaisuus on ennalta määritetty joillekin kielille (useimmat toiminnalliset kielet ja Java sisäisten anonyymien luokkien menetelmille). Mutta myös kielille, jotka mahdollistavat sulkevien funktioiden tietojen muuttamisen (esim. C# ), jotkin tehokkaat kääntäjät ottavat käyttöön hybridilähestymistavan, jossa funktion pinokehys sijoitetaan kutsupinoon, jos kääntäjä onnistuu päättelemään ohjelma-analyysillä, että funktio ei luo nousevia funargeja ja muuten kasaan. Pinokehyksen sijoittaminen kasaan heikentää yleensä suorituskykyä.

Laskeva funarg-ongelma

Laskeva funarg voi myös viitata funktion tilaan, kun se ei ole käynnissä. Kuitenkin, koska määritelmän mukaan alavirran funargin olemassaoloa rajoittaa sen luovan toiminnon suoritusaika, sille voidaan sijoittaa pinokehys kutsupinoon. Ylhäältä alas suuntautuviin funareihin liittyy kuitenkin sulkujen ja kehysten puurakenne, mikä vaikeuttaa ihmisten päätelmiä ohjelman tilasta.

Ongelma ilmenee ohjelmissa kielillä, jotka sallivat funktioiden välittämisen parametreina, kuten Pascal ja Algol 68 .

Ylhäältä alas funarg-ongelma vaikeuttaa tail-rekursiota ja jatkoa välittävää koodia kääntää tehokkaasti .

Muistiinpanot

  1. FUNCTION-funktion funktio LISP:ssä tai miksi FUNARG-ongelmaa pitäisi kutsua ympäristöongelmaksi , kirjoittanut Joel Moses, julkaisussa: ACM SIGSAM Bulletin 17 (heinäkuu 1970), pp. 13-27
  2. Ehdotettu ratkaisu FUNARG-ongelmaan , kirjoittanut Erik Sandewall, julkaisussa: ACM SIGSAM Bulletin 17 (tammikuu 1971), pp. 29-42