Funktion (programmering): Forskelle mellem versioner

Content deleted Content added
m Bot: Kosmetiske ændringer
Tilføjelser og omformuleringer; flere links
Linje 1:
Inden for [[programmering]] er en '''funktion''' ('''metode'[[underprogram]]'', '''procedure'[[subrutine]]'', '''rutine'[[procedure_(programmering)| procedure]]'', eller '''underprogram'[[metode_(programmering)|metode]]'') en stump kode som udføreudfører en bestemt opgave som del af et større program. Sådanne stumper af kode bliver nogle gangeofte samlet i biblioteker. De kan kaldes flere gangeforskellige steder uden at kodestumpen skal skrives mere end en gang. I de fleste programmeringssprog skal en sådan kodestump have et navn, men en del sprog tillader også [[anonyme funktioner]], også kaldet [[lambda-funktioner]].
 
I mangenogle programmeringssprog, fx [[Pascal]], skelner man mellem ''funktion'' og ''procedure'', hvor en funktion returnerereturnerer en værdi mens en procedure ikke gør.
 
En funktion identificeres ud fra dens [[prototype]], eller ''signatur'', som består af tre elementer:. EtDe funktionsnavnvigtigste og2 ener returtype samt en eller flereet [[parameterfunktionsnavn]]typer, hvorog deren medeller typeflere menes''formelle'' [[datatypeparameter| parametre]].; Udover prototypen indeholder den nogeti [[kode]],stærkt dertypecheckede udfører den egentlige behandling af [[inddataprogrammeringssprog]]. Dennespecificeres kode igangsættes (køres) gennem et "funktionskald"parametertyper, oghvor [[uddata]]der kanmed lagrestype i enmenes [[variabeldatatype]], bortkastes eller testes på. Funktioner,Det somtredie ikkeelement returnererer etdatatypen resultat,af harfunktionens returtypenevt. "void" i mange programmeringssprogreturværdi.
 
Ud over prototypen indeholder funktionen noget [[kode_(programmering)]|programkode]], der definerer den egentlige behandling af [[inddata]]. Koden aktiveres gennem et ''funktionskald'', hvor konkrete værdier - [[aktuelle parametre]], også kaldet [[argumenter]] - bliver bundet til, dvs. brugt til at [[initialisere]], de enkelte formelle parametre; det er disse værdier, funktionskoden under udførelse af et funktionskald arbejder på. M.a.o. fungerer navnene på de formelle parametre i koden som pladsholdere for de aktuelle værdier. Der er flere forskellige mekanismer for denne binding af aktuelle værdier, eller argumenter, til de formelle parametre; bindingsprocessen kaldes også ''parameteroverføring''
En funktion kan oprette sine egne [[variabel|variable]], der kun eksisterer så længe funktionen kører. Dette gør funktionen i stand til at arbejde med midlertidige data, som kun skal bruges i forbindelse med den aktuelle beregning.
<ref>
Den mest grundlæggende overføringsmekanisme er [[værdioverføring]] ([http://en.wikipedia.org/wiki/Call_by_name#Call_by_value| call by value]), hvor den formelle parameter bliver initialiseret med en ''kopi'' af den tilsvarende aktuelle værdi. Da de formelle parametre i funktionskoden fungerer på linie med lokale variabler, kan funktionskoden derfor ændre parametrenes værdier uden at det får virkning på de aktuelle parametre og dermed uden for funktionen.
<br /><br />
En anden parameteroverføringsmekanisme er [[referenceoverføring]] ([http://en.wikipedia.org/wiki/Call-by-reference#Call_by_reference| call by reference]), hvor det er en [[reference]] til den aktuelle værdi som parameteren bliver initialiseret med. Hvis funktionskoden modificerer værdien af en referenceoverført formel parameter, indvirker det på den tilsvarende arguments værdi. Den aktuelle parameter skal derfor i dette tilfælde referere til en modificerbar variabel.
<br /><br />
En tredje parameteroverføringsmodel er [[navneoverføring]] ([http://en.wikipedia.org/wiki/Call_by_name#Call_by_name| call by name]), som svarer til at den formelle parameter over alt i funktionskoden bliver erstattet af ordlyden af den aktuelle parameter; derefter bliver den således indsatte værdi gen-evalueret hver gang den bruges.
<br /><br />
Beregningsmæssigt er referenceoverføring den mindst krævende, da der typisk overføres en eller en [[pointer]], dvs. en enkelt [[maskindresse]], el.lign.
<br /><br />
Værdioverføring er betydeligt tungere, når de kopierede værdier er omfangsrige eller komplekse. Desuden kan de aktuelle parametre være udtryk.
<br /><br />
Navneoverføring kan pga. de gentagne gen-evalueringer være særlig omkostningskrævende og ses derfor efterhånden sjældent i [[imperative programmeringssprog]]. Til gengæld er det den potentielt mest slagkraftige af disse 3 overføringsmetoder; når den aktuelle parameter er en variabel, svarer navneoverføring nærmest til værdioverføring, men når parameteren er et udtryk, kan den bruges til særdeles avanceret programmering, jf. [[Jensen's device]] - i øvrigt en dansk opfindelse.
</ref>.
 
Kaldets resultat, eller [[inddata|uddata]], kan lagres i en [[variabel]], bortkastes, testes på eller indgå som et argument i et andet funktionskald. Funktioner, som ikke returnerer et resultat, har returtypen "void" i mange programmeringssprog, især fra [[C]]-familien.
Funktioner kan kalde andre funktioner, og i de fleste moderne [[programmeringssprog]] kan de også kalde sig selv, hvorved de bliver [[rekursiv]]e. Eksempler på [[rekursiv]]e (funktionsorienterede) programmeringssprog er [[C]] og [[SML]].
 
En funktion kan oprette sine egne ''lokale'' [[variabel|variablevariabler]], der kun eksisterer så længe funktionen kører og som er utilgængelige for andre funktioner. Dette gør funktionen i stand til at arbejde med midlertidige data, som kun skal bruges i forbindelse med dendet aktuelle fuktionskald. En variant er ''statiske lokale variabler'', som overlever fra kald til kald og derfor gør det muligt at gemme resultatet af en beregning til næste gang den skal udføres, fx som den nye initialværdi.
I samtlige programmeringssprog er der visse prædefinerede funktioner som kan bruges. Disse funktioner omfatter blandt andet [[systemkald]] til [[operativsystem]]et samt gængse datakonverterings-, formaterings- og behandlingsalgoritmer.
 
I modsætning til lokale variabler er [[global variabel|globale variabler]] synlige og tilgængelige for alle funktionerne i en [[programmeringsenhed]] ([[modul]]) eller endda i hele programmet. Da enhver funktion kan både læse og overskrive værdierne af globale variabler, er det fristende at bruge disse variabler som en slags postkasser til at overføre værdier mellem funktionskald. ''<u>Denne fremgangsmåde kan ikke frarådes stærkt nok</u>'', da den gør fejl betydelig mere sandsynlige (jf. [[Murphy's lov]]) og kodevedligeholdelse og fejlfinding betydelig mere besværlige.
 
Funktioner kan kalde andre funktioner, og i de fleste moderne [[programmeringssprog]] kan de også kalde sig selv, hvorved de bliver [[rekursiv|rekursive]]e. Eksempler på programmeringssprog som tillader [[rekursiv|rekursion]]e (er [[Pascal]], [[C]]/[[C++]], [[Java]] og andre sprog fra [[Algol]]-familien. I [[funktionsorienteret|funktionsorienterede)]] programmeringssprogprogrammerinsgssprog bruges rekursion i udpræget grad - eksempler er [[CLISP]] og [[SML]]. Det samme gælder mange [[deklarative programmeringssprog]], fx [[Prolog]].
 
I samtlige programmeringssprog er der visse prædefinerede funktioner som kan bruges. Disse funktioner omfatter blandt andet [[systemkald]] til [[operativsystem|operativsystemet]]et samt gængse datakonverterings-, formaterings- og behandlingsalgoritmer.
 
Et eksempel på en prædefineret funktion er "easter_date()" funktionen i PHP. I dette tilfælde er året inddata, og uddata er den dato hvor [[påskedag]] ligger for det pågældende år. F.eks. vil "easter_date(2005)" returnere noget i retning af "0411", dvs. 11. April. Typisk vil mange matematiske funktioner også være prædefinerede, f.eks. [[Sinus (matematisk funktion)|sinus]] og [[cosinus]], [[kvadratrod]] osv.
 
<u>Noter</u>:
<references />
 
[[Kategori:Datalogi]]
[[Kategori:Programmering]]