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.
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 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 .