Paradigmer i Programmering - akira.ruc.dk
Paradigmer i Programmering - akira.ruc.dk
Paradigmer i Programmering - akira.ruc.dk
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Paradigmer</strong> i programmering<br />
- Om hvor man skal starte i programmeringsundervisningen<br />
John Elbek Basbous — jelbekb@<strong>ruc</strong>.<strong>dk</strong><br />
Frank Biel Knudsen — fbk@<strong>ruc</strong>.<strong>dk</strong><br />
Andreas Westh — awesth@<strong>ruc</strong>.<strong>dk</strong><br />
Nikolaj Alstrøm Christiansen — nialch@<strong>ruc</strong>.<strong>dk</strong><br />
Christian Bohr-Halling — cbh@<strong>ruc</strong>.<strong>dk</strong><br />
Jon Hørup Langeland — kemo@discworld.<strong>dk</strong><br />
Vejleder:<br />
Keld Helsgaun — keld@<strong>ruc</strong>.<strong>dk</strong><br />
20. december 2003<br />
Roskilde Universitetscenter<br />
Naturvidenskabelig Basisuddannelse Hus 13.2<br />
3. semester
Resumé<br />
Rapporten omhandler hvilket paradigme man bør undervise i ved det introducerende<br />
programmeringskursus.<br />
I rapporten gennemg˚as definitionen p˚a et paradigme generelt, og i forbindelse med<br />
programmering. Vi beskriver de fire hovedparadigmer: det logik –, funktions –, imperativ,<br />
– og det objekt-orienterede paradigme. Derudover gives en kort forklaring af tankegangen<br />
bag multi-paradigmet.<br />
Rapportens konklusion bygger p˚a et litteraturstudie af over 50 forskellige artikler, der<br />
udtaler sig om paradigmer og undervisning. Konklusionen afhænger af hvilken synsvinkel<br />
man har p˚a programmering. Der konkluderes udfra to synsvinkler.<br />
Vi er n˚aet frem til, at hvis man har en teoretisk synsvinkel p˚a programmeringen, vil det<br />
være en fordel at starte undervisningen i et multi-paradigme. Er synsvinklen anvendelses<br />
orienteret, bør paradigmet være objekt orienteret.<br />
Abstract<br />
Paradigms of programming – Where to begin the teaching of programming<br />
The purpose of this report is to examine which paradigm should be taught in the first<br />
course of computer science. We describe the paradigm concept in general and in relation<br />
to computer programming. Furthermore we describe the 4 major paradigms(logical,<br />
functional, imperative and objectoriented) and briefly explain the concepts of the multiparadigm<br />
language.<br />
Our conclusion is based upon a study of more than 50 articles concerning the paradigms<br />
and teaching. The final conclusion depends on which of the two perspectives(listed below)<br />
are concidered:<br />
Teaching in the multiparadigm language would be an advantage if the student takes a<br />
theoretical approach towards programming.<br />
The objectoriented paradigm is recommended if the student takes an applicational<br />
approach towards programming.
Indhold<br />
1 Indledning 5<br />
1.1 Indledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
1.2 Problemformulering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
1.3 Afgrænsning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
1.4 Metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
1.5 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
1.6 M˚algruppe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
2 Hvad er et paradigme 8<br />
2.1 <strong>Programmering</strong> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />
2.2 <strong>Paradigmer</strong> i programmering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />
2.2.1 Paradigmatiske retninger for programmeringen . . . . . . . . . . . . . . . 10<br />
3 De procedurale paradigmer 12<br />
3.1 Det imperativt orienterede paradigme . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
3.1.1 Paradigmet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
3.1.2 Sætninger i det imperative paradigme . . . . . . . . . . . . . . . . . . . . 13<br />
3.1.3 Historie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
3.1.4 Opsummering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
3.2 Det objektorienterede paradigme . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
3.2.1 Objekter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
3.2.2 Klasser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
3.2.3 Nedarvning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
3.2.4 Historie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
3.2.5 Opsummering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
4 De deklarative paradigmer 18<br />
4.1 Det funktionsorienterede paradigme . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
4.1.1 Paradigmet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
4.1.2 Historie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
4.1.3 Opsummering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
4.2 Det logikorienterede paradigme . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
4.2.1 Generelt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
4.2.2 Paradigmet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
4.2.3 Logik i programmering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
4.2.4 Eksempler i Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
4.2.5 Historie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
4.2.6 Opsummering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />
5 Multiparadigmet 29<br />
3
<strong>Paradigmer</strong> i programmering<br />
6 Præsentation af fordele og ulemper ved paradigmerne 30<br />
6.1 Imperative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30<br />
6.1.1 Fordele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30<br />
6.1.2 Ulemper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30<br />
6.2 Objektorienteret . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />
6.2.1 Fordele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />
6.2.2 Ulemper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
6.3 Deklarativ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
6.3.1 Fordele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
6.3.2 Ulemper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33<br />
6.4 Multiparadigmet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33<br />
6.4.1 Fordele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33<br />
6.4.2 Ulemper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />
7 Undersøgelse 35<br />
7.1 Om undersøgelsen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
7.2 Forventninger til undersøgelsen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
7.3 Resultat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
8 Diskussion 38<br />
8.1 Anvendt datalogi — Datamatik. . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
8.2 Teoretisk datalogi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />
9 Konklusion 42<br />
10 Perspektivering 43<br />
20. december 2003 Roskilde Universitetscenter 4
Kapitel 1<br />
Indledning<br />
1.1 Indledning<br />
Uddannelse er et vigtigt element for at kunne klare sig p˚a arbejdsmarkedet i et udviklet samfund<br />
som det danske. Nogen g˚ar endda s˚a langt som at sige, at uddannelse er Danmarks vigtigste<br />
r˚astof, og i fremtiden m˚aske det eneste med reel betydning for samfundet. For at skabe gode<br />
uddannelser er det vigtigt at undervisningen ogs˚a er tilsvarende.<br />
Det er nødvendigt at gøre sig nogle overvejelser omkring undervisningsmetoder, pædagogik<br />
og m˚alsætningen for undervisningen, for eksempel hvilke dele der bør vægtes højt og hvilke der<br />
ikke har relevans. Endvidere indenfor hvilke emner i fagomr˚adet man bør p˚abegynde og afslutte<br />
undervisningen i.<br />
Som et banalt eksempel kunne man stille spørgsm˚al ved, om man inden for den matematiske<br />
videnskab skal starte med undervisning i addition eller multiplikation. I dette eksempel ville<br />
det være oplagt at starte med addition og se multiplikation som en udvidelse af dette koncept.<br />
Lige s˚a indlysende behøver det ikke at være i andre undervisningssituationer.<br />
Vores rapport tager udgangspunkt i datalogiundervisningen, og hvor i dette undervisningsomr˚ade<br />
eleverne f˚ar mest ud af at starte deres undervisning.<br />
Hvilket paradigme, eller programeringsmæssig tankegang, f˚ar eleverne det bedste grundlag<br />
for deres videre uddannelse? Vil det for eksempel være en fordel for de studerende at starte<br />
med objektorienteret programmering frem for noget andet?<br />
Overvejelserne for universiteterne og de studerende kunne g˚a p˚a, om det er form˚alet at<br />
tilgodese erhvervslivets interesser eller om det er vigtigere, at de studerende f˚ar en generel<br />
forst˚aelse for programmering, s˚aledes at de senere hen vil f˚a lettere ved at sættes sig ind i nye<br />
omr˚ader af datalogien.<br />
Overvejelser som disse er et glimrende oplæg til 3. semester p˚a den Naturvidenskabelige Basisuddannelse<br />
ved Roskilde Universitetscenter, hvor arbejdet skal dreje sig om naturvidenskaben<br />
som et kulturelt og samfundsmæssigt fænomen ud fra overskriften ” Refleksion over naturvidenskab<br />
og naturvidenskabsformidling“.<br />
Projektet har netop som helt centralt punkt overvejelser og reflektioner omkring undervisning<br />
i programmering, og undervisningen som s˚adan er netop et vigtigt element i forhold til<br />
b˚ade kultur og samfund.<br />
5
<strong>Paradigmer</strong> i programmering Kapitel 1.6<br />
1.2 Problemformulering<br />
Vi vil anskue programmeringsundervisningen udfra to tilgangsvinkler:<br />
En teoretisk tilgangsvinkel med programmeringens grundprincipper i fokus. En anvendelses<br />
orienteret tilgangvinkel med fokus p˚a praktisk anvendelses af programmering og planlægning.<br />
Vi opstiller følgende spørgsm˚al:<br />
Hvilket paradigme er mest hensigtsmæssigt at anvende til introducerende programmeringsundervisning,<br />
for hver af de to tilgangsvinkler?<br />
1.3 Afgrænsning<br />
Vi har valgt at beskæftige os med hvilket paradigme, der vil være mest hensigtsmæssigt at<br />
starte programmerings undervisning i, p˚a videreg˚aende datalogiske uddannelser. Det forventes<br />
ikke, at de studerende har modtaget nogle forudg˚aende undervisning indenfor programmering.<br />
Vi vil i rapporten kun forholde os til, hvilket paradigme man skal anvende, og konkluderer<br />
alts˚a ikke noget om konkrete programmeringssprog. Vi vil enkelte steder bruge konkrete program<br />
eksempler i rapporten for at tydeliggøre forst˚aelsen af de enkelte paradigmer. ˚ Arsagen<br />
til vi ikke har valgt at se p˚a konkrete sprog, men paradigmer istedet, er for at give rapporten<br />
et bredere perspektiv. Ved at se p˚a paradigmer istedet for sprog vil konklusionen være mere<br />
generel anvendelig.<br />
1.4 Metode<br />
For at besvare problemformuleringen, starter vi med at undersøge, hvad et paradigme er, b˚ade<br />
generelt i forhold til programmering og datalogi. Dette gør vi med henblik p˚a at f˚a en mere præcis<br />
forst˚aelse af paradigme-begrebet, og bedre kunne definere hvilke aspekter, der efterfølgende er<br />
relevante at behandle i rapporten.<br />
Herefter vil vi skabe os en forst˚aelse for de enkelte hovedparadigmer i programmeringen<br />
og hvad tankegangen er i disse. Dette gøres ud fra et studie af litteraturen for de forskellige<br />
programmeringsparadigmer.<br />
Vi vil dernæst forsøge at opstille fordelene og ulemperne i forhold til de enkelte paradigmer<br />
i programmering, og senere hen vurdere disse ud fra den introducerende programmeringsundervisning.<br />
Fordele og ulemper vil vi dels f˚a fra artikler, og dels fra en undersøgelse af praksis<br />
p˚a danske universiteter og datamatiker-skoler, med hensyn til førstgangsundervisningen i programmering.<br />
I undersøgelsen vil vi kontakte universiteter og datamatiker-skolerne via e-mail,<br />
for at undersøge deres overvejelser de har omkring førstegangsundervisningen i programmering.<br />
Dette vil desuden være med til at give os et billede af, hvilke paradigmer der rent faktisk<br />
anvendes aktuelt p˚a uddannelsesstederne i Danmark, og kan anvendes i forbindelse med en<br />
perspektivering.<br />
Da man ikke umiddelbart kan komme med en generel udtalelse om hvilket paradigme, man<br />
skal starte med at undervise i, valgte vi at arbejde udfra de to tidligere nævnte tilgangsvinkler.<br />
I diskussion vil vi ikke vurdere hvilken tilgangsvinkel der er den korrekte, men mere hvilket<br />
paradigme der bør anvendes inden for hver tilgangsvinkel.<br />
1.5 Motivation<br />
Vi har i de to første semestre p˚a NatBas haft kurser og projekter inden for det datalogiske<br />
omr˚ade, hvor vi hovedsageligt har beskæftiget os med datalogien indefra. Det betyder, at vi<br />
ukritisk har arbejdet inden for programmeringen. Vi mener det kunne være interessant at se<br />
p˚a datalogien mere udefra, hvilket netop er muligt i dette projekt, samt at f˚a et indblik i de<br />
forskellige programmeringsparadigmer.<br />
20. december 2003 Roskilde Universitetscenter 6
Kapitel 1.6 <strong>Paradigmer</strong> i programmering<br />
1.6 M˚algruppe<br />
Projektet henvender sig til personer med interesser for introducerende undervisning inden for<br />
programmering i datalogi. Der stilles indledende forudsætninger inden for programmering for<br />
at kunne forst˚a indholdet i rapporten; dette kunne være Datalogi A p˚a NatBas p˚a RUC.<br />
Der anbefales, at læseren har et grundlæggende kendskab til matematik, der svarer til et<br />
gymnasielt B–niveau. Dette skyldes at der optræder matematiske ligninger, symboler og lignende<br />
under beskrivelsen af funktions- og logik paradigmet.<br />
7 Roskilde Universitetscenter 20. december 2003
Kapitel 2<br />
Hvad er et paradigme<br />
I dette kapitel vil vi gennemg˚a hvad et paradigme generelt er. Vi beskriver bagefter de enkelte hovedparadigmer<br />
inden for programmering. <strong>Paradigmer</strong> som begreb er et hovedelement i denne rapport, derfor<br />
finder vi det nødvendigt at gennemg˚a.<br />
Et paradigme er i følge[Nudansk92] defineret som følgende<br />
Arbejdsmetoder og antagelser, som p˚a et givet tidspunkt er anerkendt som grundlæggende<br />
inden for et videnskabeligt omr˚ade, og som præger forskningen inden for dette.<br />
Et paradigme er alts˚a overordnet et grundsyn for, hvordan man anskuer en given videnskab<br />
og verden. S˚adan et grundsyn vil p˚avirke, hvordan man arbejder inden for en videnskab. Det<br />
kommer for eksempel til udtryk ved, at man tager udgangspunkt i visse antagelser og arbejder<br />
ud fra dem eller bygger videre p˚a dem.<br />
Især videnskabsteoretikkeren Kuhn har gjort sig tanker om paradigmebegrebet og videnskab.<br />
Kuhn ser videnskaben som værende strengt opdelt i paradigmer. Det vil sige, en given videnskab<br />
vil kun udfolde sig inden for ét paradigme ad gangen [Kuhn73]. Der vil generelt set kun være et<br />
paradigme ad gangen. Et paradigme kan dog blive afløst af et nyt og lovende paradigme, hvis<br />
der over tid er sket en opsummering af anomali i modstrid med det eksisterende paradigme, hvis<br />
dette nye og lovende paradigme p˚a samme tid kan forsvare denne anomali ud fra andre antagelser<br />
— betegnet Kuhnske revolutioner[Kuhn73]. Anomali forst˚as for eksempel som observationer,<br />
paradigmets teorier ikke kan forklare. Hvis et paradigme opererer med, at jorden er flad, s˚a vil<br />
et eksempel p˚a anomali være, at skibe kan sejle rundt om jorden uden at falde ud over en kant.<br />
Arbejdet, der udføres under et Kuhnsk paradigme, kaldes normalvidenskab og best˚ar i et<br />
” rengøringsarbejde“. Det vil sige, at man kun arbejder med en præcisering, for eksempel af teorier<br />
med mere inden for paradigmet. Det kunne for eksempel være at opn˚a en bedre samordning<br />
mellem forskellige teorier inden for paradigmet eller mere præcis bestemmelse af forskellige observationer.<br />
Man arbejder ikke p˚a at komme væk fra det gældende paradigme eller at opdage et<br />
nyt. Man arbejder netop under pardigmet, og p˚a denne m˚ade er dette alts˚a en styrende faktor<br />
— og m˚aske ogs˚a begrænsende.<br />
I den normalvidenskabelige fase er der mellem de videnskabelige aktører konsensus om blandt<br />
andet værdier; et eksempel herp˚a kunne være hvilke kriterier, man kræver opfyldt før teorier<br />
kan accepteres; et andet eksempel er de helt overordnede metafysiske antagelser om hvordan<br />
verden er opbygget (er den for eksempel flad eller rund; findes Gud eller ej; osv.). De omr˚ader,<br />
man finder relevant at forske i, styres af paradigmet, og dermed er der ingen reel objektivitet,<br />
da man allerede er p˚avirket af paradigmet og dermed ogs˚a i forhold til de ting, man overhovedet<br />
stiller spørgsm˚al ved.[Kragh91] Samlet set er paradigmet altdominerende og som udgangspunkt<br />
hævet over enhver tvivl. At rokke ved dette udgangspunkt kræver, som tidligere skrevet, en<br />
opsummering af anomali og et muligt afløserparadigme.<br />
En banal illustration af den styring, den forudindtagede tankegang, paradigmet hermed medfører,<br />
kan ses p˚a Figur 2.1. Figuren ses og tolkes oftest p˚a to m˚ader — som en hjort“ eller som<br />
”<br />
8
Kapitel 2.1 <strong>Paradigmer</strong> i programmering<br />
en ” fugl“ — i dette tilfælde er der ikke nogen korrekt tolkning. Den umiddelbare opfattelse styres<br />
af individets forudg˚aende oplevelser, erfaringer, pavirkninger og lærdom. Det er det samme<br />
med paradigmerne i videnskaben. N˚ar man først konsekvent opererer inden for et paradigme<br />
— f.eks. hjorteparadigmet, som vi jo kunne kalde det her — vil hele ens verdensanskuelse være<br />
kontrolleret af dette, og man vil s˚aledes sandsynligvis kun se netop hjorten.<br />
Figur 2.1: Fugl eller hjort[Kragh91]<br />
Det bør m˚aske bemærkes, at den Kuhn’ske opfattelse af rengøringsarbejdet ikke er negativt<br />
ladet, da arbejdet medfører et klarere og mere præcist billede af det aktuelle paradigme. I sidste<br />
ende er det ligeledes rengøringsarbejdet, der ligger til grund for, at der senere kan komme et<br />
paradigmeskift p˚a tale. Uden dette arbejde ville en afdækning af anomalier ikke ske [Kuhn73].<br />
2.1 <strong>Programmering</strong><br />
For at forst˚a, hvad programmering er, bliver man først nødt til at forst˚a, hvad et program er.<br />
Et program er det, der f˚a en computer til at udføre et bestemt handlingsforløb.Man kan kalde<br />
det for en slags forskrift. Programmet skrives i et programmeringssprog, som gøres forst˚aligt<br />
for computeren.<br />
Man kan kort definere et program som:<br />
Program: En komplet samling sætninger, udformet i alle detaljer i et programmeringssprog,<br />
med det form˚al at f˚a en computer til at udføre en p˚a forh˚and fastlagt og afrundet<br />
opgave.[itLex01]<br />
<strong>Programmering</strong> er s˚a den proces, hvor man udarbejder og udvikler programmet.<br />
Lige som nævnt i Kuhn’s paradigmeopfattelse, vil der ogs˚a være en vis styring — og m˚aske<br />
endda begrænsning — af tanker, løsningsmetoder og udtryksm˚ader, n˚ar man opererer under et<br />
bestemt programmeringsparadigme.<br />
Rent teknisk er det muligt at udtrykke det samme inden for alle programmringsparadigmer<br />
s˚a længe et givet sprog under et givet paradigme stiller en løkke- og en betingelseskonstruktion til<br />
r˚adighed 1 — dog med variationer i udtryksvanskeligheder[Budd95b] — s˚a teknisk begrænsende<br />
og styrende kan man ikke umiddelbart kalde et programmeringsparadigme. Det er i stedet netop<br />
udtryksvanskelighederne, paradigmet blandt andet er med til at bestemme styrken af. Der er for<br />
eksempel store udtryksvanskeligheder i at skulle udtrykke numeriske beregninger blot ved hjælp<br />
af logiske sammenhænge. Et paradigme inden for ren logik ville derfor ikke være hensigtsmæssigt<br />
at anvende i denne sammenhæng.<br />
Dette kan illustreres med ganske almindelig menneskesprog, som har rødder i forskellige<br />
kulturer . Hvis man p˚a grønlandsk skulle udtrykke ” sand“ ville man have større udtryksvanskeligheder<br />
i forhold til, hvis man ville udtrykke ” sand“ i et sprog med baggrund i den nordafrikanske<br />
kultur . Dette skyldes, at sprog indhørende under den nordafrikanske kultur formentlig<br />
har flere definitioner til r˚adighed, n˚ar det kommer til en præcis fremstilling. ” Sand“ er hører<br />
naturligt ikke ikke ind under den grønlandske kultur, s˚a overhovedet at komme p˚a den tanke at<br />
1 Rekursion er et eksempel p˚a en anden løkkenkonstruktion end den normale imperative<br />
9 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 2.2<br />
udtrykke det ved en given lejlighed er ogs˚a begrænset af denne kultur — og p˚a samme m˚ade er<br />
det selvfølgelig, hvis man vil udtrykke sne i et sprog med baggrund i den nordafrikanske kultur.<br />
P˚a denne m˚ade er kulturen med til at styre/begrænse udtryksmuligheder og tankem˚aden.<br />
Talesprog udspringer fra kulturere og har alt efter oprindelse forskellige udtrykmuligheder.<br />
Overført til programmeringsverden, hører de forskellige programmeringssprog ligeledes til, under<br />
overordnede paradigmer med individuelle udtryksmuligheder, hvorfor det kan være mere<br />
hensigtsmæssigt at udtrykke ” Sand“ indenfor et paradigme frem for et andet.<br />
Illustrationen med kultur (paradigmer) og menneskesprog (programmeringssprog under paradigmet)<br />
herover, skulle gerne give en intuition for, at programmeringsparadigmer og programmeringssprog<br />
netop har samme problemstillinger tilfælles, og at der overordnet er paradigmatiske<br />
krafter p˚a spil i forhold til styring af programmeringsretninger — ogs˚a selvom sprog inden<br />
for paradigmerne teoretisk set kan udtrykke det samme, men dette blot med forskellige grader af<br />
vanskeligheder. Et programmeringssprog inden for et givet programmeringsparadigme er i kraft<br />
netop af paradigmet begrænset i at kunne udtrykke konstruktioner, og paradigmet er dermed<br />
ogs˚a begrænsende for hvad, der reelt bliver udtrykt af en given programmør.<br />
Der er ikke hovedsagligt, som ved Kuhns paradigmer, tale om monoparadigmel styring, da<br />
man netop i progammeringen opererer inden for flere forskellige paradigmer — til tider endda<br />
p˚a samme tid. Man ” tillader“ alts˚a flere paradigmer at eksistere p˚a samme tid i den datalogiske<br />
verden uden de nødvendigvis ses som værende konkurrenter, og uden at man kan pege p˚a<br />
dét optimale paradigme. Faktisk g˚ar man s˚a langt, at paradigmerne ikke er strengt opdelte i<br />
reelanvendelse da man godt kan operere inden for forskellige paradigmer p˚a samme tid. Der<br />
tænkes her konkret p˚a, at der i mange programmeringssprog er tale om, at de understøtter flere<br />
forskellige paradigmer, hovedsagligt to. Der findes dog flere sprog som for eksempel Leda, der<br />
understøtter op til fire[Spinellis93].<br />
Til forskel fra Kuhn’s paradigmetankegang er der — i hvert fald ikke foreløbig — tale om ét<br />
paradigme, der ender med at omstyrte et eller flere andre paradigmer. Dette skyldes formentlig,<br />
at datalogien som videnskab er s˚a ung.<br />
2.2 <strong>Paradigmer</strong> i programmering<br />
Et programmeringsparadigme kan defineres som følgende:<br />
A programming paradigm is a way of conceptualizing what it means to perform computation,<br />
and how tasks that are to be carried out on a computer should be st<strong>ruc</strong>tured and<br />
organized[Budd95b]<br />
N˚ar man snakker om paradigmer inden for programmering, er der ikke tale om præcis det<br />
samme paradigmebegreb som inden for den generale videnskab, da der kan være flere paradigmeopfattelser<br />
p˚a samme tid. S˚a et nyt programmeringsparadigme er ikke nødvendigvis et<br />
aftagerparadigme, som i følge Kuhn er tilfældet inden for videnskaben.<br />
<strong>Programmering</strong>sparadigmer er alts˚a en begrebsliggørelse af, hvad det vil sige at programmere.<br />
En overordnet tankegang for, hvordan verden af programmering hænger sammen, er<br />
en anden m˚ade at betragte programmeringsparadigmer. Er det for eksempel i programmering<br />
smartest at se verden som best˚aende af enkeltst˚aende objekter, der arbejder sammen (objektorienteret<br />
programmering), eller skal den ses som matematikske funktioner, der kan bruge<br />
hinanden som in- og output (funktionsorienteret programmering). Skal programmering være<br />
om at opstille logiske sammenhænge (logikorienteret programmering) eller skal det handle om<br />
at lave kørselsopskrift for computeren (imperativt orienteret programmering).<br />
2.2.1 Paradigmatiske retninger for programmeringen<br />
Ud fra C. Ghezzi og M. Jazayeri, ” Programming Language Concepts ” , John Wiley and Sons,<br />
1987 som er citeret i John Placer, ” Multiparadigm Research“ [Placer91] er vi n˚aet frem til, at<br />
der primært er tre retninger, man anskuer programmering og paradigmer.<br />
20. december 2003 Roskilde Universitetscenter 10
Kapitel 2.2 <strong>Paradigmer</strong> i programmering<br />
A <strong>Paradigmer</strong>ne skal holdes adskilte i forhold til anvendelse. Man skal alts˚a i et programmeringssprog<br />
kun understøtte ét paradigme. Hvilket paradigme, et program skal udvikles<br />
under, bestemmes af typen af programmet, der skal udvikles.<br />
B<br />
Ét paradigme skal bruges til alt. Det vil sige, at alle programmer skal kunne udvikles<br />
under ét paradigme.<br />
C <strong>Paradigmer</strong> skal samles under én hat s˚aledes, at man i et givet sprog kan anvende flere<br />
paradigmer direkte.<br />
Der er fordele og ulemper ved dem alle. A er acceptabel, n˚ar man i udviklingen har separate<br />
problemstillinger, men s˚a snart der er tale om, at disse indhører under samme projekt, kommer<br />
der en konflikt. Enten m˚a man vælge ét paradigme ud og programmere det hele under det, eller<br />
skrive forskellige dele af det samlede program under forskellige paradigmer. Det førstnævnte er<br />
ikke altid en mulighed uden besvær (f.eks. matrix-beregninger under logik-paradigmet), og det<br />
sidstnævnte giver ikke plads til, at man direkte kan trække p˚a elementer tilhørende forskellige<br />
paradigmer.<br />
B kan forsvares ud fra, at man kun behøver at skulle arbejde med et paradigme, og af den<br />
grund ville kunne komme mere i dybden og opn˚a en bedre forst˚aelse for paradigmet. B er ikke<br />
optimalt ud fra det argument, at det ikke giver mening at sammenligne paradigmer generelt i<br />
den forstand, at man ikke bare overordnet kan sige, ét paradigme er bedre end et andet. Er det<br />
for eksempel altid bedre at se verden som en samling af objekter, eller er det altid bedre at se<br />
den som funktionsrelationer? Det giver ikke mening at skulle lave denne sammenligning og en<br />
konklusion p˚a, hvilket ene paradigme, der s˚a er dét bedste, da man netop s˚a skal ind og m˚ale<br />
p˚a diverse forudsætninger og antagelser omkring verden. Det ville svare en smule til, at skulle<br />
udtale sig om, hvilken religion er den mest rigtige.<br />
Dette leder frem til C. Her kan man operere direkte inden for flere og endda mange paradigmer<br />
p˚a én gang, fx Java der understøtter b˚ade det imperative og objektorienterede paradigme.<br />
P˚a denne m˚ade er man ikke bundet rent mentalt og tankemæssigt i sine muligheder for udfoldelse.<br />
Man bliver herved befriet fra et snævert og m˚aske ensporet syn p˚a verden gennem netop<br />
ét paradigmes begrænsninger. Man kan s˚a tvivle p˚a, om alle disse muligheder, hvis et sprog<br />
understøtter mange paradigmer p˚a en gang, er til at styre hensigtsmæssigt, eller det ender i et<br />
stort kaos af sammenblandede løsningsmuligheder og paradigmer.<br />
11 Roskilde Universitetscenter 20. december 2003
Kapitel 3<br />
De procedurale paradigmer<br />
De proceduralle paradigmer har procedurer som en essentiel strukturerende metode. En procedure<br />
defineres som et underprogram, der kan kaldes fra et andet underprogram eller et hovedprogram,<br />
og som selv kan kalde andre procedurer[itLex01].<br />
Procedurer kan eventuelt viderein<strong>dk</strong>apsles i objekter[itLex01], s˚a som i det objektorienterede<br />
paradigme, eller være den grundlæggende struktureringsmetode s˚a som i det imperative<br />
paradigme.<br />
Det objektorienterede paradigme skal ikke nødvendigvis forst˚as som en forlængelse af det<br />
imperative paradigme.<br />
3.1 Det imperativt orienterede paradigme<br />
3.1.1 Paradigmet<br />
Hvis man sl˚ar ordet imperativ op i en ordbog, finder man følgende definition.<br />
Imperativ(navneord); 1.a. En kommando; en ordre.[dictionary.reference.com, imperative]<br />
Denne definition passer godt sammen med den reelle definition p˚a det imperative paradigme,<br />
som bliver defineret p˚a følgende m˚ade af Lehmann[Lehmann].<br />
In imperative programming, a program is regarded as (partially ordered) sequence of actions<br />
(procedure calls) manipulating a set of variables.<br />
Det imperative paradigme kan alts˚a defineres som en række kommandoer til maskinen,<br />
hvorved der udføres nogle handlinger, som ændrer tilstande af variabler.<br />
For at gøre det mere overskueligt kan der opstilles tre definitions punkter.[Budd95c, side<br />
26].<br />
• Sekventiel udførelse af kommandoer.<br />
• <strong>Programmering</strong> med sideeffekter.<br />
• Maskinorienteret struktur, b˚ade data og kontrol ligger opad arkitekturen i en datamaskine.<br />
Sekventiel udførelse af kommandoer kan karakteriseres ved sekventielt/trinvist manipulation<br />
af et sæt variabler. Herved menes tilstandsændring af en mængde variabler, lagret i computerens<br />
hukommelse, En pædagogisk beskrivelse af det imperative paradigme, er at det kan forst˚as som<br />
en detaljeret opskrift. Med detaljeret opskrift menes at programmer skrevet p˚a imperative form,<br />
følger kommandoerne trin for trin, linje for linje og fra top til bund.<br />
12
Kapitel 3.1 <strong>Paradigmer</strong> i programmering<br />
Sideeffekter, der er et af de tre tidligere definerende punkter for det imperative paradigme, kan<br />
karakteriseres i programmering som alle andre p˚avirkninger end den efter hensigten primære<br />
p˚avirkning.[Horstmann03, side 832]. En sideeffekt kunne mere konkret være, hvis et procedurekald<br />
medfører, at en variabel i den omgivende programkode uden for procedurens kode bliver<br />
ændret af proceduren. Der sker p˚a den m˚ade mere end der umiddelbart kan forventes af et<br />
s˚adan procedurekald.<br />
Inspirationen til det imperative paradigme er hentet fra datamaskinerne. Datamaskiner anvender<br />
den selv samme teknik, som det imperative paradigme; en maskin-instruktion udføres en<br />
efter en. En computer følger et mønster af maskin-instruktioner, hvor hver instruktion f˚ar processoren<br />
til at hente nogle bestemte værdier fra hukommelsen, hvorefter deres tilstand ændres<br />
og de placeres igen p˚a deres specifikke plads i hukommelsen. N˚ar beregningerne/tilstandsændringerne<br />
er færdige, kan resultatet af maskin-instruktionerne findes i hukommelsen.[Budd95b,<br />
side9]<br />
Det imperative paradigme er velegnede til sm˚a programmer, men det kan blive vanskeligt at<br />
strukturere et større program, hvor der ofte vil opst˚a problemer med at holde styr p˚a eventuelle<br />
sideeffekters p˚avirkning p˚a globale data, ved procedurekald.<br />
De mest kendte programmeringssprog befinder sig enten i det imperative paradigme eller i<br />
b˚ade det imperative og det objektorienterede paradigme. For eksempel er Pascal og C begge<br />
imperative sprog hvorimod Java og C++ b˚ade er imperative og objektorienterede.<br />
3.1.2 Sætninger i det imperative paradigme<br />
I programmering betegner en sætning (eng.: statement) en sammenhængende og afsluttet række<br />
af definitioner og instruktioner.[itLex01] Der findes fire grundlæggende former for sætninger i<br />
det imperative paradigme. Her følger en definition p˚a dem. [wikipedia.org2]<br />
Tildeling<br />
Tildelingssætninger kan kort defineres som; tildeling af værdi til variable.[itLex01] Alts˚a tilstandsændring<br />
af variabler lagret i hukommelsen.<br />
Eksempel p˚a tildeling skrevet i det imperative sprog Fortran:<br />
v = 2<br />
Variablen p˚a venstre side af lighedstegnet f˚ar tildelt værdien p˚a højre side af lighedstegnet.<br />
Løkke<br />
En løkke tillader en række tildelingssætninger at blive udført adskillige gange. Løkker kan enten<br />
udføre de tildelingssætninger, de indeholder, et foruddefineret antal gange, eller de kan udføre<br />
dem gentagne gange, indtil en betingelse bliver sand.<br />
Eksempel p˚a While Løkke skrevet i det imperative sprog C:<br />
while(v < 12){ (løkker s˚a længe v er mindre end 12)<br />
v = v+1; (tildelingssætning inden i løkken)<br />
} (løkken slutter)<br />
13 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 3.1<br />
Betinget forgrening<br />
Hvis nogle betingelser er gældende, tillades udførelsen af en blok af erklæringer. Hvis betingelserne<br />
ikke er gældende bliver blokken sprunget over, og programmet fortsætter sin sekventielle<br />
gennemkørsel efter den betingede forgrening.<br />
Eksempel p˚a betinget forgrening skrevet i det imperative sprog C:<br />
IF (v < 2){ (hvis variablen v er mindre end to)<br />
v = 2+1 (tildelingssætning i den betinget forgrening)<br />
} (betinget forgrening slutter)<br />
Ubetinget forgrening<br />
Ved ubetinget forgrening er det muligt at hoppe til et andet sted i programmet. Dette kan for<br />
eksempel gøres med sætningen goto eller ved kald af en procedure.<br />
Eksempel p˚a ubetinget forgrening, rettere goto sætningen, skrevet i det imperative sprog<br />
Fortran:<br />
1 v = 2+1 (tildelingssætning)<br />
2 GOTO 1 (her sendes program udførelsen tilbage til linie 1)<br />
Det skal bemærkes at eksemplet ovenfor udgør en uendelig løkke, da den ubetingede forgrening<br />
vil blive ved med at sende udførelsen af programmet tilbage til linie 1.<br />
3.1.3 Historie<br />
Det imperative paradigme er det ældste programmeringsparadigme. Det s˚a, kraftigt inspireret<br />
af maskin-instruktioner, sit lys i slutningen af 1950’erne, i sprogene Algol og Fortran, der<br />
henholdsvis blev udviklet i Europa og USA. Inden udviklingen af Fortran programmerede man<br />
primært i maskinkode og Assembler. Maskinkode er den binære kode som en cpu forst˚ar. Selve<br />
koden best˚ar af kombinationer og sammensætninger af binære tal. I assemblerkode anvendes der<br />
symboler til repræsentation af maskinkoden, alts˚a er assembler symbolsk maskinkode.[Bergin96,<br />
side26]<br />
3.1.4 Opsummering<br />
Paradigmet er kraftigt inspireret af maskinkode, hvilket er kendetegnet ved den sekventielle<br />
læsning af kommandoerne. Paradigmet er svært at holde p˚a et højt abstraktionsniveau, hvilket<br />
skyldes ligheden med maskin-instruktionerne.<br />
Det imperative paradigme kan være vanskeligt at programmere større programmer i, da det<br />
er vanskeligt at holde styr p˚a sideeffekterne.<br />
20. december 2003 Roskilde Universitetscenter 14
Kapitel 3.2 <strong>Paradigmer</strong> i programmering<br />
3.2 Det objektorienterede paradigme<br />
Det objektorienterede paradigme, ligger ikke s˚a langt fra den m˚ade vi i dagligdagen opfatter<br />
verden. N˚ar man for eksempel betragter en person, ser man personen som et objekt.[Weisfeld01]<br />
I artiklen af Ole Lehmann [Lehmann], findes der en definition af det objektorienteret paradigme.<br />
In object-oriented programming a program execution is regarded as a physical model, simulating<br />
the behavior of either a real or imaginary part of the world.[Lehmann]<br />
Den centrale del af denne definition af paradigmet er, ifølge Ole Lehmann, ordet fysisk.<br />
Man ser objekter som et digitaliseret materiale, der kan bruges til at lave fysiske modeller.<br />
Objekterne kan ses som fysisk materiale, for eksempel legoklodser, der bruges til at opbygge en<br />
legofigur.[Lehmann]<br />
3.2.1 Objekter<br />
Som beskrevet ovenfor er omdrejningspunktet i det objektorienteret paradigme, objekter. Et<br />
objekt kan defineres som:<br />
En enhed der rummer b˚ade data og adfærd.[Weisfeld01]<br />
Vi vil herefter forklare hvad der menes med data og adfærd.<br />
Data — attributter<br />
I den objektorienteret terminologi kaldes data for attributter. Disse attributter kan bedst forklares<br />
ved et eksempel hentet fra Matt Weisfeld. Eksemplet tager udgangspunkt i den fysiske<br />
verden, hvor et objekt repræsenterer en person. Attributterne indeholder information om personen,<br />
og kunne for eksempel være hudfarve, CPR-nummer og telefonnummer.<br />
Adfærd — metoder<br />
Figur 3.1: Attributter<br />
Et objekts adfærd, er det objektet kan gøre. Adfærderen bliver implementeret i objektet med<br />
metoder. Metoder bliver i andre paradigmer kaldt for procedurer, funktioner, subrutiner. For at<br />
bruge en metode skal den aktiveres, ved at sende en besked til den. I eksemplet med person–<br />
objektet, har man brug for en metode, der kan ændre og returnere de forskellige attributter.<br />
Derfor vil hvert attribut have korresponderende metoder. Eksempelvis vil telefonnummer attributten<br />
have metoderne setTelefonnummer og getTelefonnummer. P˚a denne m˚ade kan andre<br />
objekter hente og sende data fra person–objektet.<br />
3.2.2 Klasser<br />
En klasse er en skabelon til at oprette objekter. N˚ar man opretter et objekt siger man at instantiere<br />
et objekt. Hvis man for eksempel opretter tre person–objekter, laver man i virkeligheden<br />
3 instanser af person–klassen. Hver person–objekt indeholder sine egne data i attributterne og<br />
en kopi at metoderne.<br />
15 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 3.2<br />
3.2.3 Nedarvning<br />
Figur 3.2: Metoder<br />
Figur 3.3: Klasser<br />
Et af paradigmets største fordele, er den store genavendelighed af kode. Med nedarvning udvider<br />
man muligheden for at genanvende kode, og samtidig f˚ar man muligheden for at definere relationer<br />
mellem klasser. En klasse kan arve egenskaber fra en mere generel klasse(superklasse). En superklasse<br />
kan videregive egenskaber til sine, mere specialiserede underliggende klasser(subklasser).<br />
[itLex01]<br />
Eksempelvis kunne man lave en Hunde–klasse og en Katte–klasse, som begge indeholder<br />
attributten øjenfarve og dens tilsvarede metoder. Med nedarvning er det muligt at abstrahere<br />
og lave en klasse der hedder Pattedyr–klassen. Denne klasse indeholder attributten øjenfarve<br />
og tilsvarende metoder. Det er nu muligt for vores Hunde–klasser og Katte–klasser, at arve<br />
øjenfarve–attributterne og dens metoder. P˚a denne m˚ade sparer man en masse kode og f˚ar<br />
skabt en relation mellem henholdsvis pattedyr/hunde–klassen og pattedyr/katten–klassen. Det<br />
er stadig muligt for Hunde og Katte–klasserne at angive nye attributter. I eksemplet forneden<br />
har Hunde–klassen en gøfrekvens som attribut og Katte–klassen en mijavefrekvens. Fælles for<br />
dem begge er at de har øjenfarve–attributten fra Pattedyr–klassen.<br />
3.2.4 Historie<br />
Er blevet u<strong>dk</strong>ommenteret, da der skal skrives noget andet<br />
Ideerne til det objekt orienterede opstod i midt af 60’erne, og i 1967 kom det første egentlig<br />
objekt orienteret sprog; Simula men ogs˚a sproget, Ada er et godt stykke hen ad vejen, og<br />
man kan ogs˚a argumentere for, at LISP kan opføre sig objekt-orienteret. Men der har manglet<br />
forst˚aelse blandt programmørerne.<br />
C fik i starten af 80’erne en efterfølger p˚a designbordet, C with Classes, som i løbet af f˚a ˚ar<br />
skulle udvikle sig til en ANSI-standard kaldet C++ (”++”er optællingsoperatoren i C, s˚a C++<br />
er 1 mere end C). I C++ har programmøren mulighed for at beskrive, hvordan hendes egne<br />
datatyper skal opføre sig i forskellige situationer - det er s˚a at sige datastrukturens eget ansvar<br />
20. december 2003 Roskilde Universitetscenter 16
Kapitel 3.2 <strong>Paradigmer</strong> i programmering<br />
Figur 3.4: Nedarvning<br />
at behandle sine data. Det har en stor indflydelse p˚a metoder for udvikling af software, fordi<br />
eventuelle fejl altid befinder sig i den del af koden, der er sprogligt direkte relateret til de data,<br />
som indeholder fejlen. C++ vinder kraftigt frem blandt systemprogrammører, men kritiseres<br />
for at være et konglomerat af lappeløsninger.<br />
I 1995 lancerer Sun sproget Java, der med sin platform uafhængighed virkelig hjalp det<br />
objekt orienterede paradigme p˚avej.<br />
3.2.5 Opsummering<br />
I det objektorienteretparadigme organiser man alts˚a koden i objekter, der kan interagere med<br />
hinanden. Objekterne kan være opbygget at referencer til andre objekter og metoder. Nedarvning<br />
giver objekterne muligheden at arve egenskaber fra hinanden. Denne metode gør objekterne<br />
meget genanvenlig og den høje genanvenlighed er ogs˚a med til at gøre det objektorienteretparadigme<br />
meget attraktivt for større programmeringsprojekter, da disse kan drage stor nytte af<br />
dette.<br />
17 Roskilde Universitetscenter 20. december 2003
Kapitel 4<br />
De deklarative paradigmer<br />
Et deklarativt program erklærer hvad programmet skal udføre s˚a tydeligt, entydigt og præcist<br />
som muligt, men det lader op til compilerprogrammøren at holde styr p˚a s˚a mange memory,<br />
proces og andre ” how to“ afgørelser som muligt.[Reinfelds95]<br />
Med deklarativeparadigme bringer man programmøren p˚a et højere abstraktionsniveau. Man<br />
bevæger sig væk fra det mere maskinnære og tankegangen om, hvordan gør vi dette til det mere<br />
overordnede, hvad er det, vi gør.<br />
Der findes to programmeringsparadigmer inden for det deklarative paradigme, funktion og<br />
logik.<br />
4.1 Det funktionsorienterede paradigme<br />
Det funktionsorienterede paradigme tager udgangspunkt i en matematisk tankegang. Definition<br />
af funktioner (disse dog ikke begrænset til at arbejde med tal) er omdrejningspunktet i programmeringen<br />
inden for paradigmet. Paradigmet kan mere formelt set defineres ud fra følgende<br />
tre punkter, s˚asom [Placer91] har opsummeret det ud fra M.A. Jenkins, J.I Glasgow og C.D.<br />
McCrosky, ” Programming Styles ind Nial“, IEEE Software 3, 1, Jan. 1986, p. 46-55.<br />
• Funktioner har fast input/output-relation (Referential transparency)<br />
• Matematiske variable (uforanderlige variable)<br />
• Funktioner kan have andre funktioner som in- og output (højere-ordens funktioner)<br />
Dette bliver mere detaljeret gennemg˚aet umiddelbart herefter.<br />
4.1.1 Paradigmet<br />
Matematiske funktioner<br />
Da selve funktionsbegrebet er vigtigt for paradigmet, begynder vi med en definition af dette,<br />
hvorefter vi set dette i forhold til funktioner anvendt i programmering.<br />
Matematiske funktioner har en afvigende definition i forhold til de funktioner, der normalt<br />
anvendes i datalogisk programmering om disse s˚a kaldes ” funktioner“, ” procedure“, ” metoder“<br />
eller ” subrutiner“.<br />
Funktion. En afbilledning af mængden A ind i mængden B er en funktion, hvis den til<br />
ethvert element i A entydigt tilordner et element i B [Karush78]<br />
Matematisk set er en funktion en black box, der entydigt afbilleder en definitionsmængde ind i<br />
en anden mængde, værdimængden. P˚a denne m˚ade bliver en funktion en input/output–relation<br />
gennem en black box, som indeholder selve implementationen af denne relation.<br />
18
Kapitel 4.1 <strong>Paradigmer</strong> i programmering<br />
Selve implementationen af funktionens relationer, formelen, kan være udformet p˚a vidt<br />
forskellige m˚ader. Et eksempel kan være input/output–relationen mellem et givet naturligt tal<br />
og summen af de underliggende naturlige tal i talrækkefølgen kan udtrykkes p˚a følgende to<br />
forskellige m˚ader:<br />
f(x) = 1 + 2 + 3 + 4 + ... + (n − 1) + n<br />
n(n + 1)<br />
g(x) =<br />
2<br />
Funktionerne f og g betegner samme funktoin, men har forskellige implementationer/formler.<br />
Referential transparency<br />
Udtrykket for en matematisk funktion med en given pargument–værdi (f.eks. g(3)) kan substitueres<br />
med dens returværdi uden, at der vil være forskel p˚a resultatet — man kalder dette, at<br />
matematiske funktioner har referential transparency [Paulson91]. Det vil med andre ord sige,<br />
at en matematisk funktion altid producerer samme output ved samme input, og der er en fast<br />
input/output–relation for en funktion — en funktion giver ikke forskellige output alt efter,<br />
hvorn˚ar den kaldes. Konsekvensen heraf er, at den matematiske funktion kun er inkonsekvent 1<br />
p˚avirkelig gennem et funktionskalds aktuelle parametre. Funktionen kan alts˚a kun modtage<br />
foranderligt input gennem parameteroverførsel.<br />
Et eksempel p˚a referential transparency i matematisk sammenhæng kunne være, n˚ar man<br />
vil foretage en trigonometrisk udregning; her forventer man, at cos(90) altid giver 0 ogs˚a selvom<br />
man for eksempel umiddelbart før har anvendt cos-funktionen med parameteren 17 — og s˚adan<br />
er det da ogs˚a for matematiske funktioner. Det vil sige, man kan forvente, at cosinus-funktionens<br />
formel ikke har ændret sig og altid giver det samme.<br />
Overholdelse af referential transparency i et program vil medføre, at man ikke skal bekymre<br />
sig om betydningen af, hvorn˚ar man kalder en funktion i programmet. Funktionen vil altid<br />
opføre sig p˚a samme m˚ade. Det vil sige, man skal ikke holde øje med et programs dynamik for<br />
at kunne forst˚a resultatet af et funktionskald. At man kalder en funktion p˚a linje 5 og p˚a line 20<br />
gør ingen forskel. Sagt p˚a en anden m˚ade, s˚a vil alle funktioner være p˚a samme m˚ade, som cosfunktionen<br />
i eksemplet herover. Dens formel vil aldrig ændre sig. S˚adan bør et paradigme-rent<br />
programmeringssprog under det funktionsorienterede paradigme ogs˚a opføre sig med hensyn til<br />
funktioner.<br />
En funktion i et traditionelt programmeringssprog har ikke nødvendigvis referential transparency<br />
— den vil ikke som en selvfølge have samme returværdi til samme aktuelle parameter<br />
ved forskellige funktionskald. Dette kan være grundet, at dens formel er p˚avirkelig af indirekte<br />
input, det vil sige input, der ikke kommer via en parameteroverførsel, og at dette indirekte input<br />
netop er inkonsekvent fra gang til gang, funktionen kaldes. Hvis et indirekte input, til en given<br />
funktion, er konsekvent fra gang til gang, denne funktion kaldes, vil dette ikke kunne medføre<br />
ændring af opførsel af funktionen. Den vil nemlig s˚aledes have samme formel og dermed have<br />
referential transparency.<br />
Sideeffekter er problematiske i forhold til referential transparency, da et funktionskald dermed<br />
kan medføre ændring af det omgivende miljø, og disse ændringer kan indg˚a som input i<br />
anden funktion. En matematisk funktion p˚avirker kun — som resultat af parameterinputtet —<br />
det omgivende miljø via den direkte returværdi og kan derfor ikke siges at have sideeffekter.<br />
En funktion i et traditionelt programmeringssprog kan derimod netop godt have sideeffekter,<br />
hvilket ikke er aktuelt i et paradigme–rent funktionsorienteret sprog.<br />
Det er ikke referential transparency i for eksempel det imperative sprog Pascal eller det objekt<br />
orienterede sprog Java 2 . Beregningen af henholdsvis en funktion og en metode i disse sprog kan<br />
p˚avirkes inkonsekvent af det omgivende miljø p˚a anden m˚ade end gennem inputparameteren<br />
1Den kan i teorien godt være p˚avirklig andet end via parameteroverførsel, blot p˚avirkning s˚a er konsekvent<br />
hver gang.<br />
2Selvom Java er objekt orienteret s˚a hører implemtationen af metoderne under det imperative paradigme.<br />
19 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 4.1<br />
til funktionen/metoden. Der er ogs˚a sideeffekter, da funktionen/metoden selv kan p˚avirke det<br />
omgivende miljø tilbage p˚a anden m˚ade end gennem realværdien.<br />
Et konkret eksempel — om end en smule trivielt — p˚a sideeffekt og manglende overholdelse<br />
af referential transparency kan ses i Programkode 4.1. Problemet er netop her, at metoden<br />
f(int n) har anden indg˚aende forbindelse fra det omgivende miljø end gennem parameteren n,<br />
da den ogs˚a f˚ar indirete og inkonsekvent input fra variabelen flag. Det er indirekte, da det ikke<br />
overføres via parameteroverførsel, og det er inkonsekvent, da selvsamme metode ændrer p˚a det<br />
ved hvert metodekald. Dette betyder i at metoden giver forskellige realværdier ved samme input<br />
— noget der aldrig ville ske ved en matematisk funktion, der netop har referential transparency<br />
og ingen sideeffekter.<br />
1 class Eks{<br />
2 private s t a t i c boolean f l a g = true ; // f o r a n d e r l i g data<br />
3<br />
4 public s t a t i c int f ( int n ) {<br />
5 int r e t u r ;<br />
6 i f ( f l a g ) // problem ( har i n d i r e k t e , f o r a n d e r l i g i n p u t )<br />
7 r e t u r = n ;<br />
8 else<br />
9 r e t u r = 2∗n ;<br />
10<br />
11 f l a g = ! f l a g ; // problem ( s i d e e f f e k t )<br />
12 return r e t u r ;<br />
13 }<br />
14<br />
15 public s t a t i c void main ( S t r i n g [ ] a r g s ) {<br />
16 System . out . p r i n t l n ( f ( 1 ) + f ( 2 ) ) ; // f (1) + f (2) = 1 + 4 = 5<br />
17 System . out . p r i n t l n ( f ( 2 ) + f ( 1 ) ) ; // f (2) + f (1) = 2 + 2 = 4<br />
18 }<br />
19 }<br />
Programkode 4.1: Sideeffekt og ikke–referential transparency i en Java–metode<br />
Manglende referential transparency og sideeffekter gøre det svært at overskue, hvad en given<br />
ikke–matematisk funktion giver som output, da man er nødt til at tage historikken af tidligere<br />
funktionskald og det omgivende program med i sine betragtninger. Dette er alts˚a i modsætning<br />
til den matematiske funktion og funktioner i et funktionsorienteret programmeringssprog, da<br />
disse ligger fast med hensyn til input/output–relationen underordnet sammenhængen, funktionskaldene<br />
kommer.<br />
Hovedproblemet her er, at det er tilladt for en ikke–matematisk funktion at ændre data i<br />
det omgivende miljø p˚a anden m˚ade end via returværdien af funktionen og at det p˚a samme tid<br />
er muligt for en s˚adan funktion at anvende denne data, eftersom denne data kan være blevet<br />
ændret mellem forskellige funktionskald.<br />
Uforanderlige variabler<br />
Det virker umiddelbart ud fra en traditionel datalogisk synsvinkel selvmodsigende, at variable<br />
skal være uforanderlige, men en variabel skal netop under det funktionsorienterede paradigme<br />
ikke anskues ud fra traditionel datalogisk synsvinkel, men ud fra en matematisk synsvinkel.<br />
Variabelbegrebet er matematisk set, at en variabel dækker over en vilk˚arlig konstant. Det<br />
vil mere præcist sige, at en variabel kan antage forskellige tilskrivninger fx af værdier, men<br />
n˚ar først en variabel er tilskrevet en værdi første gang, kan den ikke ændres. Der kan dermed<br />
ikke være flere tildelinger af værdier til en variabel, alts˚a findes der ikke destruktiv tildeling.<br />
Det ville i en matematisk sammenhæng være utænkeligt, at variablen x i det følgende antog to<br />
forskellige værditilskrivninger henholdsvis før og efter funktionskaldet g(8), mens det ikke ville<br />
være en umulighed i traditionel programmering.<br />
x 2 + g(8) + x<br />
I traditionel programmering kan en variabel x godt antage forskellige værditilskrivninger<br />
og er s˚aledes ikke bundet til den første værditilskrivning. Hvis ovenst˚aende var skrevet ud fra<br />
20. december 2003 Roskilde Universitetscenter 20
Kapitel 4.1 <strong>Paradigmer</strong> i programmering<br />
det imperative paradigme, s˚a ville funktionskaldet g(8) uden problemer via en sideeffekt kunne<br />
have ændret værditilskrivningen af x s˚aledes, at x før 3 funktionen g(8) evalueres er tilskrevet én<br />
værdi, men efter g(8) er evalueret er den tilskrevet en anden værdi med dertil ændret resultat<br />
af den samlede evaluering.<br />
Højere-ordens funkioner<br />
En højere-ordens funktion er en funktion, der som argument og/eller som returværdi kan have<br />
andre funktioner[Thompson99].<br />
Et eksempel kunne være, funktionen, composit, der sætter to funktioner sammen til én. Den<br />
f˚ar to argumenter, som ogs˚a er funktioner, og giver som returværdi en ny samlet funktion.<br />
Dermed bliver composit en funktion af højere orden. Selve definitionen heraf som den ser ud i<br />
Haskell er vist i Programkode 4.2.<br />
1 −− d e f . en f u n k t i o n a f h ø j e r e orden<br />
2 composit : : ( a −> a ) −> (a −> a ) −> (a −> a ) −− d e f . a f f u n k t i o n e n s domæne og<br />
værdiomr˚ade<br />
3 composit p q = ( p . q ) −− d e f . a f f u n k t i o n e n s formel ( funktionssammensætning )<br />
Programkode 4.2: Composit, definition af en højere-ordens funktion i Haskell<br />
I linje 2 st˚ar der (a −> a)−> (a −> a)−> (a −> a). Dette angiver input– og output–domæne,<br />
typer for funktionens argumenter og returværdi. N˚ar der st˚ar (a −> a) angiver dette, at der er<br />
tale om en funktion, hvor første a er argumenttypen, og sidst er returtypen; mere præcist bliver<br />
der i aktuelle tilfælde tale om en vilk˚arlig funktion med hensyn til domæne, da input- og output–<br />
domæne er vilk˚arligt i kraft af, at a her ikke betegner en konkret type, hvorfor funktionen ikke<br />
er bundet til for eksempel at have heltal som input og decimaltal som output.<br />
De to første gange (a −> a) optræder i composit-funktionens domnænedefinition er det som<br />
repræsentant for input-argumenter, hvilke der alts˚a er to af her, mens den sidste gang (a −> a)<br />
optræder, er det som repræsentant for returværdien. Som input f˚ar composit derfor netop to<br />
funktioner over et vilk˚arligt domæne angivet som (a −> a)−> (a −> a), og outputtet er netop<br />
ogs˚a en funktion, angivet som det sidste −> (a −> a).<br />
Linje 3 angiver selve formlen for composit, og den er her blot en sammensætning af de to<br />
inputfunktioner ved hjælp af operatoren ” .“. p og q er i denne sammenhæng argumenterne for<br />
de to inputfunktioner, composit-funktionen tager, og svarer til de to første (a −> a) i linje 2.<br />
Det bliver mere klart, hvis vi giver et eksempel p˚a anvendelse. Vi starter med at definere<br />
to funktioner, der kan anvendes som input-funktioner i højere-ordens funktionen composit, se<br />
Programkode 4.3. Linje 1–3 i programkoden definerer funktionen f. I linje 2 angives funktionens<br />
input- og outputdomæne. Den har ét inputargument som heltal, og som returværdi har den<br />
ligeledes heltal. Dernæst i linje 3 defineres selve formlen for funktionen. Præcist det samme<br />
gøres for funktionen g i linje 5–7.<br />
1 −− d e f . a f en alm . f u n k t i o n<br />
2 f : : Int −> Int −− d e f . a f f u n k t i o n e n s domæne og værdiomr˚ade<br />
3 f ( x ) = 8∗ x + 3 −− d e f . a f f u n k t i o n e n s formel<br />
4<br />
5 −− d e f . a f en alm . f u n k t i o n<br />
6 g : : Int −> Int −− d e f . a f f u n k t i o n e n s domæne og værdiomr˚ade<br />
7 g ( x ) = 10∗ x + 2 −− d e f . a f f u n k t i o n e n s formel<br />
Programkode 4.3: To tiltældige funktioner i Haskell<br />
Vi kan dernæst i et program kalde composit-funktionen med disse to funktioner som argument,<br />
f og g. Af dette kald kan composit’s returværdi anvendes som en ny funktion. Det vil sige (composit<br />
g f) er returværdien af et funktionskald af composit-funktionen med argumenterne g og f. Vi kan<br />
derfor kalde denne returværdi (alts˚a en funktion) med et argument, (4), og f˚a et resultat, se<br />
Programkode 4.4.<br />
3 Evaluering venstre mod højre<br />
21 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 4.1<br />
1 −− a n v e n d e l s e a f composit−f u n k t i o n e n<br />
2 ( composit g f ) ( 4 ) −−g i v e r 352<br />
Funktionsparadigmets tankegang<br />
Programkode 4.4: Anvendelse af composit<br />
Paradigmet tager udgangspunkt i en matematisk tankegang. Der er referential transparency,<br />
uforanderlige variabel og højere-ordens funktioner. Funktionsbegrebet og variabelbegrebet ses<br />
ud fra det, de matematiske definitioner foreskriver.<br />
Paradigmet er ligeledes deklarativt. Det vil sige, at man ved programmering skal opstille<br />
statiske funktionsdefinitioner. Dette er i modsætning til at være dynamisk i programmeringen.<br />
Definitionerne har ikke dynamik indbygget i sig p˚a den m˚ade, at der i beregningen sker<br />
ændringer eller opdateringer. Beregninger sker i kraft af en definition og ikke i kraft af en<br />
beregningesmæssig metode. Under det funktionsorienterede paradigme gælder det netop ikke<br />
om at programmere med tilstandændringer for øje (som man gør imperativt med opdateringer<br />
af variable), men i stedet med definitioner og sammenhænge mellem definitioner for øje. Omdrejningspunktet<br />
er ikke gennemkørsel, men definitioner. Denne deklarative tankem˚ade finder<br />
man ogs˚a i logik–programmering, men hvor man i funktionsprogrammering lægger vægten p˚a<br />
funktioner, lægger man i logik–programmering vægten p˚a de logiske relationer.<br />
Mere konkret kommer den deklarative tankegang til udtryk ved, at man ikke opererer med<br />
foranderlige variable. Der er kun én tilstand af en variabel, da denne kun kan antage netop én<br />
værdi. Der er derfor ingen tildelingssætninger (assigments), da man ikke kan ændre en variabels<br />
værdi (man kan kun lave en ny variabel). Man har heller ikke eksplicitte løkker, da tankegangen<br />
i funktionsprogrammering netop ikke g˚ar p˚a at n˚a frem til en løsning ved hjælp af hvordan og<br />
ændringer af tilstande i programmet. Implicit kan en løkkestruktur dog skrives ved at definere<br />
rekursive funktioner. Da der ikke som s˚adan er tilstandsændringer, er der derfor heller ikke<br />
sideeffekter. Udover dette har man ogs˚a referential transparency.<br />
Eksempel p˚a tankegangen Til hjælp af forst˚aelsen af tankegangen, opstilles her et eksempel<br />
p˚a den funktionsorienterede tankegang set som modstykke til den traditionelle.<br />
Hvis man i et imperativt sprog som C eller et objektorienteret sprog som Java fik stillet<br />
den opgave at skrive en metode til at beregne potenser, hvordan ville man s˚a udforme denne<br />
løsning? Vi ser naturligvis bort fra, at potens–udregning allerede er muligt i sproget Dette<br />
kan læseren jo lige stoppe op og tænke lidt over inden den videre læsning her. Jo, man ville<br />
sandsynligvis gøre sig nogle tanker om, hvad x n er for noget. Da man netop underliggende her<br />
har imperative tanker i baghovedet, ville man sandsynligvis n˚a frem til, at x n er x ganget med<br />
sig selv n gange. Da denne tankegang netop inspirerer til en løsning, der let kan laves i C eller<br />
Java — det vil sige en tilstandsændrende løsning. Løsningen bliver derved hurtigt inden for det<br />
imperative paradigme med udgangspunkt i en løkke, der opdaterer en variabel til det endelige<br />
resultat er n˚aet, se Programkode 4.5.<br />
1 // Beregner potens , xˆn<br />
2 public s t a t i c int power ( int x , int n ) {<br />
3 i f ( n == 0) return 1 ;<br />
4<br />
5 int r e s u l t a t = x ;<br />
6 for ( int i = 1 ; i < n ; i ++)<br />
7 r e s u l t a t = r e s u l t a t ∗ x ;<br />
8<br />
9 return r e s u l t a t ;<br />
10 }<br />
Programkode 4.5: Dynamisk og tilstandsændrende i Java (metode imperativ)<br />
Ved en løsning under funktionsparadigmet ville man nok ogs˚a gøre sig nogle tanker om, hvad<br />
x n er for noget, men da man opererer inden for en helt anden verden — deklarativ og uden<br />
løkker — s˚a er det overvejende sandsynligt, at man i stedet ville n˚a frem til en erklæring, en<br />
20. december 2003 Roskilde Universitetscenter 22
Kapitel 4.1 <strong>Paradigmer</strong> i programmering<br />
definition, p˚a x n i stedet for en beregningsmæssig metode; groft sagt kommer man frem til hvad<br />
i stedet for hvordan. Man ville nemlig nok n˚a frem til, at x n er x · x n−1 . I dette er der ingen<br />
programmering til ændringer af tilstande og opdatering af variable, men i stedet erklæring af<br />
en definition, se Programkode 4.6.<br />
1 (∗ Beregner potens , xˆn ∗)<br />
2 fun power ( x , 0 ) = 1<br />
3 | power ( x , n ) = x ∗ power ( x , n−1) ;<br />
4.1.2 Historie<br />
Programkode 4.6: Statisk og deklarativ i SML (funktionsorienteret)<br />
Et af m˚alene med udviklingen af programmeringssprogvar at komme op p˚a et højere abstraktionsniveau<br />
i forhold til ren maskinkode og assembler. <strong>Programmering</strong> i maskinkode og assembler<br />
er meget nær det imperative paradigme, s˚a man kan se det imparative paradigme i<br />
forlængelse heraf. Det funktionsorienterede paradigme derimod prøver at bevæge sig op p˚a et<br />
endnu højere abstraktionsniveau i forhold hertil og dermed fjerne sig fra det maskinelle.<br />
Lisp fra sidst af 1950’erne var det første programmeringssprog[wikipedia.org1], der indeholdte<br />
funktionsorienterede elementer. Det var ikke fuldstændigt funktionsorienteret, da det<br />
ogs˚a havde imperative strukuterer, som for eksempel sideeffekter. Det blev udviklet af en gruppe<br />
under M.I.T., der arbejdede med kunstig intelligens. Dets anvendelsesomr˚ade er mere præcist<br />
manipulation af forskellige symbolske udtryk[Sammet69].<br />
Sidenhen er fulgt andre sprog som ML og endnu senere det mere paradigme–rene 4 Haskell.<br />
4.1.3 Opsummering<br />
Paradigmet er matematisk i sin grundstuktur. Dette er med til at gøre programmer skrevet<br />
under dette paradigme klarere at forst˚a, da man ikke har ting som for eksempel sideeffekter<br />
og foranderlige variable samt man har referential transparency. Som konsekvens heraf er dette<br />
ogs˚a med til at gøre formel bevisførelse for programmerne lettere at udføre.<br />
P˚a samme tid er paradigmet ogs˚a deklarativt, hvilket medfører et højere abstraktionsniveau<br />
for programmøren. Der skal ikke bruges tid p˚a trivielle ting som at finde ud af, hvordan man<br />
gør noget, men hvad det er, der rent faktisk skal gøres.<br />
4 Mere ren i overholdelsen af paradigmets definerende elementer med de ting, der understøttes, samt s˚a vidt<br />
muligt udeladelse af andre paradigmalle elementer<br />
23 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 4.2<br />
4.2 Det logikorienterede paradigme<br />
4.2.1 Generelt<br />
Normalt betegner ” logik“ læren om rette slutning ud fra bestemte forudsætninger [Høholdt00].<br />
I logikken ser man ikke p˚a det egentlige indhold af forskellige udsagn, men hvorledes den rette<br />
sammenhæng mellem forudstæning og slutning opn˚as. Dermed bliver de reele ting om verden,<br />
der udtrykkes i en given situation, ikke relevante at se p˚a og logikken bliver derved uden<br />
tilknytning til verden som s˚adan. Dette kan i et almindeligt sprog sammenlignes med kun at se<br />
p˚a grammatiske regler i en sætning og ikke p˚a den faktiske og konkrete betydning af sætningen.<br />
Matematisk logik er denne form for logisk tænkning i en konkret formaliset udformning med<br />
regler og metoder til at bestemme den logiske korrekthed[Høholdt00].<br />
I kapitlet kigger vi p˚a logikken inden for matematisk logik, der hedder udsagnslogik og<br />
prædikatlogik. Til sidst gives eksempler p˚a hvordan logik bruges i programmering.<br />
4.2.2 Paradigmet<br />
Udsagnslogik<br />
Udsagnslogik 5 er opbygget af udsagn og logiske operatorer[itLex01]. Et udsagn er i denne sammenhæng<br />
noget, der kan være enten sandt eller falsk[Høholdt00] og formaliseres ved et stort<br />
bogstav; mens operatorerne i denne sammenhæng best˚ar af en række symboler, der er vist i<br />
nedenst˚aende tabel.<br />
Navn: Symbol:<br />
Konjunktion(OG) ∧<br />
Disjunktion(ELLER) ∨<br />
Negation(IKKE) ¬<br />
Implikation ⇒<br />
Biimplikation ⇔<br />
Et eksempel p˚a et udsagn kan være der er fuldm˚ane“ (P) eller det blæser“ (Q). Der er<br />
” ”<br />
knyttet en sandhedsværdi til disse og betragtes som enten værende sande ellers falske. Hvis der<br />
er fuldm˚ane, er udsagnet sandt og hvis ikke, er det falsk. Disse udsagn for eksempel samles til<br />
” der er fuldm˚ane og det blæser ikke“. Dette giver et nyt udsagn, der samlet set igen enten kan<br />
være sandt eller falsk. I vores eksempel her er det samlet set kun sandt i det tilfælde, at begge<br />
dele er opfyldt. Det vil sige, at det faktisk er fuldm˚ane“ og det faktisk ikke blæser“. Dette kan<br />
” ”<br />
formaliseres som: P ∧ ¬Q.<br />
Vi kan udvide vores eksempel. Vi kunne bruge den samlede sandhedsværdi for, om der er<br />
fuldm˚ane og det ikke blæser som betinget konsekvens. Vi kan skrive hvis der er fuldm˚ane og<br />
”<br />
det ikke blæser s˚a er det ikke uhyggeligt“. I formaliseret udgave bliver det til, hvis udsagnet<br />
” det er uhyggeligt symboliseres med S: P ∧ ¬Q ⇒ ¬S Den faktiske tilknytning til verden af P<br />
”<br />
og Q er ikke relevant.<br />
At P og Q henholdsvis dækkker over der er fuldm˚ane“ og det blæser“ har ingen betydning<br />
” ”<br />
for logikken. Lige meget hvad P og Q antager af forbindelse til den virkelige verden, s˚a vil det i<br />
logik betyde, at for det samlede udsagn skal være ska b˚ade P & Q være sande. Dette er netop<br />
helt uafhængigt af den faktisk binding til verden for de to udsagn P og Q.<br />
Prædikatlogik<br />
Prædikat logik er en udvidelse af udsagnslogik med prædikatsymboler, individvariable og kvantorer[itLex01]<br />
Den formalisme, der blev beskrevet i det tidligere afsnit om udsagnslogik, viser sig utilstrækkelig<br />
til at beskrive og undersøge alle de logiske slutninger vi kan være interesserede i. Lad os<br />
betragte et nyt eksempel[Høholdt00]:<br />
5 Kaldes ogs˚a propositions logik<br />
20. december 2003 Roskilde Universitetscenter 24
Kapitel 4.2 <strong>Paradigmer</strong> i programmering<br />
Eksempel 1.<br />
Hvis x og y er reele tal og xy = 0<br />
s˚a gælder, at x = 0 eller y = 0.<br />
Ovenst˚aende matematiske sætning indeholder variabler (x,y) og kan ikke udtrykkes vha.<br />
udsagnslogik, da xy = 0, x = 0 og y = 0 ikke er konkrete udsagn. Deres sandhedsværdi afhænger<br />
af hvilke reele tal x og y refererer til. Ved at indføre begrebet prædikat kan vi behandle udtryk<br />
og slutninger af ovenst˚aende karakter.<br />
Et prædikat kan i denne forbindelse være udtrykket x = 0. ” x“ er en variabel og kan antage<br />
en værdi fra en mængde af reele tal. Denne mængde kalder vi for universet, og der understreges<br />
at der til ethvert prædikat tilhører et univers. Hvis man erstatter x med et bestemt element fra<br />
universet, s˚a f˚as et udsagn, der enten er sandt eller falsk. Ved at betegne udtrykket x = 0 med<br />
N(x) og gøre brug af de tidligere introducerede operatorer, kan vi formulere en del af sætningen<br />
i Eksempel 1, som:<br />
N(xy) ⇒ [N(x) ∨ N(y)].<br />
Ovenst˚aende er et sammensat prædikat. Ved at bruge andre operatorer sammen med prædikater,<br />
kan man p˚a tilsvarende m˚ade opn˚a andre sammensatte udtryk.<br />
M˚aden at anvende prædikater kan anvendes i andre sammenhænge end vist i Eksempel 1.<br />
Lad os betragte et nyt eksempel(Eksempel 2): x er en hund. Her antager variablen x en værdi<br />
fra et univers af hunde. Hvis vi lader A(x) betyde ” x er et hund“ og lade B(x) betyde ” x har<br />
fire ben“, s˚a kan vi opskrive udtrykket<br />
A(x) → B(x)<br />
Udtrykket betyder: Hvis x er en hund, s˚a har x fire ben. Vi kan lade variablen ” x“ referere<br />
til navnet ” Fido“ og lade p betegne dette navn. A(p) vil derfor betyde, at Fido er en hund og<br />
B(p) at Fido har fire ben. For at gøre Eksempel 2 mere abstrakt kan vi skrive ” Alle hunde har<br />
fire ben“. Vi mangler blot at indføre et udtryk for ” Alle“. Hvis vi lader K(x) være et prædikat<br />
og anvende det logiske symbol for alkvatoren, kan vi skrive: ∀ x K(x), som læses, for ethvert x<br />
K(x), er udsagnet sandt, n˚ar udsagnet K(a) er sandt, uanset hvilket element a fra det betragtede<br />
univers der er tale om. Et komplet sandt udsagn for Eksempel 2 kan nu formaliseres som:<br />
1. ∀ x (A(x) → B(x)) (Alle hunde har 4 ben)<br />
2. A(p) (Fido er en hund)<br />
3. B(p) (Fido har fire ben).<br />
Efter at have introduceret alkvatoren kan vi ligeledes opskrive et komplet udtryk for Ekempel<br />
1.<br />
∀ x ∀ y (N(xy) → (N(x) ∨ N(y))).<br />
Der findes flere prædikatlogiske relationer(operatorer), som man kan anvende til at konstruere<br />
mere komplekse og omfattende prædikatlogiske udsagn. I Eksempel 1 og 2 er der vist hvordan<br />
nogle af de mere grundlæggende relationer anvendes.<br />
I næste afsnit skal vi se p˚a de metoder man anvender til at udtrykke logik i programmering.<br />
4.2.3 Logik i programmering<br />
Ovenfor introducerede vi tankegangen bag matematisk logik og hvordan man vha. bl.a symboler,<br />
der repræsenterer operatorer, kan formalisere konkrete prædikatlogiske udsagn ud fra en række<br />
sætninger. Tankegangen i logikprogrammering stemmer overens med den vi har introduceret<br />
25 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 4.2<br />
i de foreg˚aende afsnit. I logik paradigmet kan man betragte databehandling som en deduktiv<br />
proces, som gør brug af fakta, regler og forespørgsler[Budd95c]. Resultatet af forespørgsler opn˚as<br />
p˚a baggrund af fakta og regler for inferens. I afslutningen af dette afsnit ser vi p˚a hvordan man<br />
udtrykker fakta og forespørgsler i logikprogrammeringssproget Prolog.<br />
Klausuler<br />
I logikprogrammering anvendes en form til at udtrykke logiske sætninger, som kaldes klausulform.<br />
Generelt kan en klausul betragtes som en sætning af formen ” hvis A s˚a B“, som opskrives<br />
B1,...Bn ← A1,...An<br />
, hvor B1,...Bn og A1,...An kaldes atomer. Atomerne A1,...An er betingelser og atomerne<br />
B1,...Bn er konklusioner i klausulen[Kowalski]. Et atom er et udtryk af formen P(t1, ... , tn<br />
, hvor P er prædikatsymbolet og t1, ... , tn kaldes termer. Et atom skal fortolkes som, at relationen<br />
P dækker over individerne t1, ... , tn. Et term kan enten være en variabel eller en<br />
konstant.<br />
Lad os kigge p˚a et eksempel, hvor vi anvender en klausul. Ønsker vi for eksempel at udtrykke<br />
et forhold imellem en far og en søn, f.eks. sætningen Peter er fader til Jens, hvor Peter referer til<br />
variabel x og Jens til y, vil det udtrykkes som Fader(peter,jens). Vi kan ogs˚a nøjes med kun at<br />
definere en person og lade den anden variabel st˚a: Fader(Peter,y). Fader“ er et prædikat symbol,<br />
”<br />
som repræsenterer et forhold mellem de to personer. Det andet klausul best˚ar af konstanterne<br />
” peter“ og jens“, som er de to defineret personer.<br />
”<br />
Et andet eksempel hvor vi gøre brug af operatorer og hvor en betingelse skal være opfyldt<br />
kunne være:<br />
Hankøn(x) ← Fader(x,y)<br />
Ovenst˚aende klausul skal forst˚as som: x er hankøn hvis x er fader til y. I dette eksempel gør vi<br />
brug af den logiske operator implikation. Hankøn(x) er konklusionen i klausulen hvis betingelsen<br />
Fader(x,y) bliver opfyldt.<br />
Ved at anvende konnektoren og kan vi udtrykke mere komplekse klausuler, som best˚ar af<br />
flere forhold. Lad os betragte følgende eksemplet:<br />
Bedstefader(x,y) ← Forældre(x,z), Forældre(z,y)<br />
, hvor kommaet i klausulen betyder og. For alle x,y og z variabler gælder der: x er bedstefader<br />
til y hvis x er forældre af z og z er forældre til y.<br />
4.2.4 Eksempler i Prolog<br />
Fakta<br />
Efter gennemgangen af klausuler vil vi vise en række konkrete eksempler i programmeringssproget<br />
Prolog. Da logik i Prolog bruges som en konkret værktøj til problemløsning er der en<br />
række principper, som undervejs vil blive introduceret(bl.a. regler og forespørgsler). Den simpleste<br />
form for klausul-erklæring i Prolog kaldes for et faktum. Hvis vi anvender Eksempel A fra<br />
tidligere kan et faktum udtrykkes s˚aledes: Fader(peter,jens).<br />
Et program i logik best˚ar af en række fakta. I Eksempel 3. er vist en lille familiedatabase,<br />
som best˚ar af forbindelser mellem forskellige personer.<br />
20. december 2003 Roskilde Universitetscenter 26
Kapitel 4.2 <strong>Paradigmer</strong> i programmering<br />
Eksempel 3<br />
Fader(peter,jens). Hankøn(peter).<br />
Fader(abraham,anders). Hankøn(anders).<br />
Moder(line,isabel). Hunkøn(line).<br />
Forespørgsler<br />
Den anden form for erklæring i logikprogrammeringer en forespørgsel, som er en m˚ade at<br />
f˚a information udfra et logik program. En forespørgsel undersøger om der er en forbindelse<br />
imellem individ objekter. Tager vi udgangspunkt i familiedatabasen, vil et udtryk som Fader(abraham,anders)?<br />
undersøge om Fader-forholdet gælder for personerne abraham og anders.<br />
Da dette faktum er angivet i databasen er denne forespørgsel umiddelbart sand, og Prolog vil returnerer<br />
svaret ”´ja“. Spørgsm˚altegnet efter udtrykket angiver at der er tale om en forespørgsel.<br />
Hvis vi ligeledes spørgerFader(line,anders)? vil Prolog returnerer svaret ”´nej“, da denne forespørgsel<br />
ikke stemmer overens med de fakta angivet i familie databasen, og vil umiddelbart<br />
være falsk.<br />
Logiske variabler<br />
I de tidligere afsnit gennemgik vi hvordan variabler anvendes i matematisk logik. I logikprogrammeringkan<br />
man definere et logisk variabel som et uspecifieret individ[Sterling2000] Logiske<br />
variabler kan bl.a. bruges i forbindelse med forespørgsler. Hvis vi f.eks. vil vide hvem abraham<br />
er fader til, kan vi spørge Fader(abraham, X)?, som vil returnere svaret X=anders. At anvende<br />
logiske variabler i forespørgsler i denne sammenhæng, er en effektiv m˚ade finde en relation<br />
mellem individer, da man ikke undg˚ar at skulle undersøge samtlige Fader forhold i databasen.<br />
Universelle fakta<br />
Logiske variabler kan ogs˚a anvendes i fakta. Lad os antage at b˚ade peter, abraham og line elsker<br />
appelsiner. I stedet for at angive dette faktum for alle individer, som Elsker(peter,appelsiner),<br />
Elsker(abraham,appelsiner). og Elsker(line,appelsiner)., kan man opsummere alle disse fakta<br />
vha. logiske variabler og skrive: Elsker(x,appelsiner). Den logiske variabel ”´x“ dækker alts˚a<br />
over alle personer.<br />
Regler<br />
Den sidste og vigtigste bestanddel i logikprogrammeringer en regel. En regel kan opskrives p˚a<br />
formen A ← B1, B2, ...,Bn, hvor n ≥ 0. Det er værd at bemærke, at et fakta er en regel n˚ar<br />
n=0. Vi kan udbygge vores database med en række regler. Hvis vi f.eks. ønsker at regel der<br />
udtrykker et ” søn“ og et ” datter“ forhold kan vi skrive:<br />
Søn(X,Y) ← Fader(Y,X), Hankøn(X).<br />
Datter(X,Y) ← Fader(Y,X), Hunkøn(X).<br />
Pilen til ventre er taget fra matematisk logik og er symbolet for implikation. Søn reglen skal<br />
læses som: ” X er søn af Y, hvis Y er fader af X og X er hankøn“. Prædikatet ” Søn“ er blevet defineret<br />
ud fra prædikaterne ” Fader“ og ” Hankøn“. Regler er ofte anvendt i logik programmer, da<br />
man kan definere hvilke betingelser, der skal være gældende i forbindelse med f.eks. en familie.<br />
4.2.5 Historie<br />
Udviklingen af logikprogrammeringbegyndte i starten af 1970’erne, og blev introduceret af Robert<br />
Kowalski(1974) og Alain Colmerauer et al(1973). Deres arbejde bestod i en videreudvikling<br />
af automatisk bevisførelse(inden for kunstig intelligens), som var introduceret af J. A.<br />
Robinson[HofPL].<br />
27 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 4.2<br />
P˚a dette tidspunkt ekisterede programmeringssprog inden for det imparative paradigme,<br />
s˚asom Fortran og Algol. I disse sprog havde programmøren blandt andet mulighed for at anvende<br />
symbolske navne til lagrings omr˚ader og skrive algebraiske udtryk. Disse sprog gjorde det lettere<br />
for programmører at programmere, da oversætteren gjorde en stor del af struktur-arbejdet i<br />
koden.<br />
P˚a trods af disse fordele, bestod et program skrevet i det imperative paradigme stadig af<br />
kommandoer(som virker ved at ændre værdier i hukommelsesomr˚ader). Kowalski og Colmerauer’s<br />
ide var at bruge logik som et programmeringssprog. I stedet for at et program best˚ar af<br />
kommandoer som skal udføres, skal det indeholde definitioner og erklæringer om det problem<br />
der skal løses. Denne tankegang kaldtes for deklarativ programmering. Det betyder, at man<br />
for eksempel udtrykker en sætning i et logiksprog, som er enten sand eller falsk. Deklarative<br />
programmer indeholder ingen explicit instruktioner, som computeren skal udføre. Derimod er<br />
computerens opgave at manipulere information og n˚a frem til en løsning p˚a et givet problem.<br />
Det var denne tankegang der indledte til udviklingen af et, af de i dag mest udbredte logik<br />
programmeringsprog, Prolog.<br />
4.2.6 Opsummering<br />
En gennemgang af den matematiske logik giver et indblik i den grundlæggende tankegang i logik<br />
paradigmet. Eksemplerne vist under afsnittende om udsagns– og prædikatlogik skulle illustrere<br />
hvordan man vha. symboler for operatorer kan formalisere en sætning som et matematisk logisk<br />
udtryk. I logikprogrammering anvender man samme tankegang, og vi har vist hvordan man<br />
bruger klausul formen til at udtrykke sætninger. I et programmeringssprog som Prolog gør man<br />
brug af logiske variabler, regler, fakta og forespørgsler som anvendes i forbindelse med løsningen<br />
af et givent problem. I afsnittet s˚a vi hvordan man brugte disse typer af erklæringer i en familie<br />
database.<br />
20. december 2003 Roskilde Universitetscenter 28
Kapitel 5<br />
Multiparadigmet<br />
Multiparadigmet kombinerer tidligere paradigmers principper i et samlet overordnet paradigme.<br />
I artikel [Budd95c] refereres Brent Hailpern som har givet følgende definition.<br />
”A multiparadigm programming language is a system that incorporates two or more of the<br />
conventional programming”<br />
Et multiparadigmentionelt programmeringssprog, skal alts˚a have to eller flere konventionelle<br />
programmeringsparadigmer inkorporeret i sig, før det kan kaldes et multiparadigmentionelt<br />
sprog. Som s˚adan er der ikke tale om et konventionelt paradigme, da det ikke tilføjer nye<br />
programmeringssyn, men kombinerer tidligere principper i et enkelt programmeringssprog. Det<br />
kan derfor diskuteres, om hvorvidt man overhovedet kan tale om et s˚akaldt multiparadigme,<br />
men om der ikke kun er tale om multiparadigmentionelle programmeringssprog, der kombinerer<br />
allerede eksisterende tankegange.<br />
Tendensen i nye programmeringssprog g˚ar ogs˚a p˚a kombinationen af flere paradigmer. Eksempelvis<br />
er C++ blevet udr˚abt som et multiparadigmentionelt programmeringssprog i [Budd95c],<br />
som refererer Stanley B. Lippman. C++ Primer. Addison-Wesley, Reading, Massachusetts,<br />
second edition,1991. Om hvorvidt man vælger at betegne et kombinationssprog for et hybridsprog,<br />
istedet for et multiparadigmentionelt sprog er i og for sig underordnet – der lader ikke<br />
til at være fastsl˚aet en standard betegnelse.<br />
Et programmeringssprog, der ofte nævnes i sammenhæng med multiparadigmet, er Leda, som<br />
kombinerer imperativ-, logik-, funktions- og objekt-orienteret programmering i et sprog med én<br />
syntaks[Budd95b]. Leda startede p˚a forsøgsbasis, hvor man ønskede at undersøge mulige fordele<br />
og ulemper ved løsninger indenfor for flere paradigmer, i følge forfatteren bag Leda — Timothy<br />
A. Budd — videreudvikles det løbende. Den ˚abenlyse fordel ved at benytte et multiparadigmentionelt<br />
sprog er, at man kan tilg˚a samtlige inkorporerede paradigmer med samme syntaks.<br />
Dette vil vi behandle senere ved præsentationen af de paradigmatiske argumenter.<br />
29
Kapitel 6<br />
Præsentation af fordele og<br />
ulemper ved paradigmerne<br />
I dette kapitel vil vi præsentere fordele og ulemper inden for de fire programmeringsparadigmer.<br />
Alle argumenter er taget p˚a baggrund af en række artikler der beskriver, hvilke paradigme(er)<br />
den studerende skal introduceres for, i et indledende programmeringskursus. Fordelene og ulemperne<br />
skal være grundlaget for, at vi kan vurdere hvilket paradigme vi mener der bør undervises<br />
i, i et indledende programmeringskursus. Disse skal lede op til en diskussion af overvejelser omkring<br />
denne problematik.<br />
Det kan forekomme, at der vil være nogle fordele og ulemper der vil modsige hinanden,<br />
hvilket skyldes at artiklerne har forskellige meninger inden for dette emne. Vi har valgt at<br />
medtage begge synspunkter, da vi ikke skal vurdere argumenterne i dette afsnit.<br />
6.1 Imperative<br />
6.1.1 Fordele<br />
• Der findes meget kvalificeret undervisningsmateriale til anvendelse ved et indledende programmerings<br />
kursus, hvorimod andre paradigmer godt kan halte lidt p˚a dette punkt. Det<br />
er dog kun et spørgsm˚al om hvor længe det p˚agældende paradigme har eksisteret og været<br />
anvendt til undervisning.[Brilliant96][Pedroni03]<br />
• S. Brilliant og T. Wiseman[Brilliant96] mener, at der ikke er andre paradigmer p˚a samme<br />
høje pædagogiske niveau som det imperative paradigme, hvilket giver sig til kende ved at<br />
de fleste studerende, finder paradigmet nemt at forst˚a/indlære.[Brilliant96]<br />
• Det imperative paradigme er ofte mere naturligt for de studerende end andre paradigmer.<br />
[Neubauer02]<br />
• De fleste paradigmer anvender sammen kørselorienteret tankegang som det imperative<br />
paradigme.[Pedroni03] Især i det objektorienteret paradigme, der ofte kombineres med<br />
imperative, se for eksempel p˚a Java og C++. Derfor bør der altid undervises i det imperative<br />
paradigme, og de studerende skal have fuld kendskab til det, inden der for eksempel<br />
undervises i det objektorienterede paradigme.[Neubauer02]<br />
6.1.2 Ulemper<br />
• Det imperative paradigme er et af de oftest anvendte paradigmer.<br />
Dette skyldes, at paradigmet er kan bruges til programmering af maskinelle apparater,<br />
s˚asom hvidevarer med elektroniske styresystemer. Det er et faktum at det imperative<br />
paradigme er udbredt p˚a arbejdsmarkedet, dog mener ACM og IEEE-CS [Curricula01]<br />
30
Kapitel 6.2 <strong>Paradigmer</strong> i programmering<br />
at man ikke bør undervise i det p˚a universiteterne, da det ikke er universiteternes job at<br />
lefle for softwareindustrien og fremstille dataloger der kan programmere i det pt. hyppigst<br />
anvendte programmeringsparadigme. De skal derimod være fremtidssikret for eksempel<br />
med henblik p˚a forskning.<br />
• Undervises de studerende i de hyppigst anvendte paradigmer, for eksempel imperative,<br />
vil de f˚a en negativ indstilling, til at lære andre paradigmer.[Brilliant96]<br />
• Imperativ er det paradigme de studerende oftest har kendskab til i forvejen, derfor bør<br />
man ikke undervises i det, som førstegangsundervisning, da de studerende sandsynligvis<br />
ikke har samme forudsætninger. [Curricula01]<br />
• N˚ar der er opn˚aet en forst˚aelse for det imperative paradigme, er det vanskeligt at ændre<br />
tankegangen til at tænke i for eksempel objekter.[Brilliant96][Neubauer02] Det har vist<br />
sig at paradigme skiftet fra imperativ til objektorienteret er vanskelig for de studerende,<br />
hvorimod skiftet fra objektorienteret til imperativ er betydeligt nemmere. [Pedroni03]<br />
• Det tvinger de studerende til at lægge fokus p˚a syntakserne og karakteristikaene ved det<br />
p˚agældende sprog der nu anvendes. Derved fjernes hovedvægten fra algoritmerne, der er<br />
det fundamentale ved det imperative paradigme. [Pedroni03] Et andet minus er at det er<br />
vanskeligt at genbruge kode skrevet i det imperative paradigme. [Decker93]<br />
• Det imperative paradigme kræver operationel-, implementering- og sekventiel-paradigme<br />
specifik tankegang, i artiklen eksemplificeret i C. Dette kan f˚a eleverne til at glemme<br />
simpel og elegant kode.[Brilliant96]<br />
• Det kan være vanskeligt at holde styr p˚a sideeffekter n˚ar man skriver sætninger i imperative<br />
paradigme, hvilket vanskeliggør indlæringen for de studerende. [Brilliant96]<br />
6.2 Objektorienteret<br />
6.2.1 Fordele<br />
• I stigende grad anvendes det objektorienterede paradigme b˚ade i akademisk sammenhæng<br />
og i software-industrien. Dette er i ACM og IEEE-CS’s Computing Curricula [Curricula01]<br />
argumentet for at starte med det objektorienteredeparadigme, da man s˚a tidligt som muligt<br />
bør have kendskab til paradigmet. P˚a samme tid er dette paradigme ogs˚a komplekst,<br />
s˚a man i det indledende kursus især skal overveje undervisningsforløbet for at begrænse<br />
denne kompleksitet for de studerende.<br />
• Objekt-begrebet giver en mere korrekt beskrivelse af, hvordan mennesket løser opgaver,<br />
siger R. Decker [Decker93], hvorfor objekter i programmering ogs˚a tillader os at løse en<br />
opgave mere ud fra menneskelig tænkning i modsætning til, at vi som mennesker i vores<br />
problemløsning skal tænke som computeren. Som konsekvens heraf er det objektorienterede<br />
paradigme lettere at arbejde med i de indledende programmeringkurser. Dette er vel<br />
nok ogs˚a den generelle holdning, at objekter — alts˚a et samlet hele i form netop af et<br />
objekt — er en mere naturlig afbilledning af den faktiske verden.<br />
• Den struktur- og design-mæssige karakter ved det objektorienterede paradigme er en fordel<br />
i følge J. Rosenberg m.fl. [Rosenberg95]. Paradigmet tilskønner programmering med<br />
designovervejelser for øje og kodegenbrug, hvilket bliver introduceret tidligt i undervisnignsforløbet.<br />
• Paradigmeskift fra det objektorienterede paradigme til andre paradigmer er lettere, mens<br />
den modsatte vej synes mere vanskelig. S˚adan har det i følge J. Rosenberg m.fl. [Rosenberg95]<br />
vist sig at være, hvis man er kommet fra det imperative til det objektorientede paradigme.<br />
31 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 6.3<br />
• Man bør starte undervisningen inden for det objektorienterede paradigme, da dette paradigme<br />
medfører et højt abstraktionsniveau allerede fra starten af, og giver s˚aledes tidligt<br />
øvelse i abstraktion, da dette i følge Peter Sprague og Celia Schahczenski [Sprague02]<br />
netop skal bruges gennem hele de studerendes videre studie.<br />
6.2.2 Ulemper<br />
• Objekt-begrebet er nødvendigvis ikke det mest naturlige i alle programmeringssituationer<br />
i følge J. Neubauer m.fl. [Neubauer02]. De siger, at selvom verden godt nok er opbygget<br />
af objekter, s˚a har disse ikke metoder til at gøre noget ved sig selv, da der i stedet i<br />
den virkelige verden ofte bliver gjort noget ved objekterne. Det vil sige, at i den rigtige<br />
verden udføres der en process p˚a objekter, mens objekter i objektprogrammering selv<br />
har ansvaret for det, der kan/skal gøres — de udfører alts˚a processen p˚a sig selv. Som<br />
eksempel herp˚a nævner de blandt andet, at en side i en fysisk bog (et objekt) ikke selv har<br />
en metode at vende sig, den bliver vendt. Det er alts˚a en process udefra, der udføres p˚a<br />
objektet og objektet har intet begreb om de ting, der kan gøres ved det. Processbegrebet<br />
stemmer mere overens med den imperative tankegang, hvor man netop ogs˚a har processen<br />
central, og det er et argument mod det objektorienterede paradigme som et letforst˚aligt<br />
første paradigme.<br />
• De studerende skal introduceres til syntaks uden reelt at forst˚a deres betydning, hvilket<br />
P. J. Burton og R. E. Bruhn [Bruhn] beskriver som et problem. De mener, at før man<br />
overhovedet begynder p˚a undervisning i det objektorienterede paradigme, skal man først<br />
have styr p˚a det imperative. Det vil sige processen først, og s˚a det mere strukturmæssige<br />
fra det objektorienterede paradigme. P˚a denne m˚ade ser de det objektorienterede paradigme<br />
som en naturlig udvidelse af det mere procesorienterde imperative paradigme. At<br />
se det objektorienterede paradigme s˚aledes er dog helt forkert, st˚ar der i [Pedroni03], da<br />
det netop er en helt anden tankegang det objektorienterede paradigme medfører, og ikke<br />
blot en udvidelse.<br />
6.3 Deklarativ<br />
Vi har valgt at samle fordele og ulemper for det funktionsorienterede og logikorienterede paradigme<br />
under ét afsnit og ser samlet p˚a dem. Dette har vi gjort, da argumenterne, vi har fundet,<br />
har været gældende for begge paradigmer og ikke som s˚adan for de enkelte paradigmer.<br />
Dette medfører s˚aledes, at vi i konklusionen ikke er i stand til at se p˚a de to deklarative<br />
paradigmer adskilt, men derimod som et samlet hele.<br />
6.3.1 Fordele<br />
• Det deklarative paradigme har i høj grad simpel syntaks og semantik [Reinfelds95], og af<br />
denne grund er det let at lave et hurtigt program med en masse funktionalitet.<br />
• Den deklarative tankegang er mindre kompleks, da den fjerner tidsdimensionen i et program.[Rebelsky01]<br />
• Det kan skabe problemer at mange studerende, der vil læse datalogi, i forvejen har kendskab<br />
til programmering. Oftest er det de har kendskab til et imperativt eller et objektorienteret<br />
paradigme, og derfor vil det være mere hensigtsmæssigt at starte undervisningen inden<br />
for et deklarativt paradigme[Reinfelds93], da alle har samme startforudsætninger.[Pedroni03]<br />
• Beherskelse en række mindre koncepter, og gør det muligt at løse interessante problemer og<br />
giver en gradvis overgang fra konkrete til abstrakte koncepter inden for problemløsning.[Reinfelds93]<br />
20. december 2003 Roskilde Universitetscenter 32
Kapitel 6.4 <strong>Paradigmer</strong> i programmering<br />
• Deklarative giver en god opdeling mellem en præcision ved løsningen af problemet og en<br />
effektiv implematation af løsningen.[Reinfelds93]<br />
• Deklarativ vil give en nemmere forst˚aelse af datalogien, og det bevirker at den studerende<br />
allerede fra første dag, kan skrive meningsfyldte programmer.[Reinfelds93]<br />
6.3.2 Ulemper<br />
• Mange studerende vil finde det svært at skulle tænke abstrakt inden for paradigmet. At<br />
introducere abstraktion tidligt i undervisningsforløbet kan afskrække studerende der ikke<br />
er vant til denne tankegang, som st˚ar skrevet i Michela Pedronis afhandling [Pedroni03]<br />
• Rekursion er en vigtig del af det funktionsorienterede paradigme og skal introduceres<br />
tidligt. Det er ofte tilfældet at studerende har problemer med at lære rekursion fordi de<br />
endnu ikke har den nødvendige viden for at forst˚a princippet, hvilket st˚ar skrevet i Michela<br />
Pedronis afhandling[Pedroni03]<br />
6.4 Multiparadigmet<br />
Helt overordnet burde studerende undervist i multiparadigmet have en bredere vifte af løsningsmodeller<br />
p˚a datalogiske problemstillinger end studerende med kendskab til kun et enkelt<br />
programmeringsparadigme, hvorfor de burde have en bedre forst˚aelse af grundprincipperne inden<br />
for programmeringen.<br />
6.4.1 Fordele<br />
• De studerende vil efter det indledende programmeringskursus være bedre rustet til de<br />
uundg˚alige fremtidige programmeringsparadigme skift. Eleverne skulle alts˚a have meget<br />
lettere ved at tilegne sig nye programmeringssyn, da man har den bredere vifte af løsningsmuligheder<br />
i kraft af anvendelsen af flere paradigmeteorier.[Budd95c]<br />
• Undervisningen er ikke styret af de nuværende industrille krav, som bekendt ogs˚a skifter<br />
hyppigt.[Budd95c]<br />
• Det har vist sig at studerende, der skal omstille sig fra det først indlærte paradigme til<br />
et nyt m˚aske endog mere pædagoisk paradigme, har store vanskeligheder med at tilegne<br />
sig de nye principper, og det er endvidere ofte en tidskrævende process [Brilliant96]. Hvis<br />
man skal vende argumentet om burde de studerende undervist i multiparadigmet i s˚a<br />
fald ogs˚a have svært ved at begrænse sig til eksempelvis udelukkende objektorienterede<br />
løsninger, hvis de senere hen tvinges til at arbejde med det paradigme. Dette postulat<br />
nævnes dog ikke i artiklen. Dog betegnes mange nye programmeringssprog som s˚akaldte<br />
hybrid sprog, der kombinerer to paradigmer i et enkelt sprog[Budd95c], det tyder p˚a at<br />
det er den generelle opfattelse, at kombinationer af traditionelle paradigmer er noget man<br />
vil se mere til i fremtiden. Hvis hybridsprog bliver et gennemg˚aende fællestræk for nye<br />
programmeringssprog, kan det tænkes at multiparadigmet vil være en god baggrund.<br />
• Det første undervisningsparadigme menes at have en stor indflydelse p˚a hvordan, man<br />
overordnet opfatter det at programmere, hvilket kan læses i J. Placer [Placer91], og er med<br />
til at p˚avirke den studerende adskillige ˚ar frem. Dette undg˚as netop i multiparadigmet<br />
da man netop ikke ensporet koncentrerer sig om et enkelt paradigme i den indledende<br />
undervisning.<br />
• I og med de studerende præsenteres for forskellige paradigmers løsninger i et multiparadigmentioneltsprog,<br />
undg˚as mange af de syntaksvanskeligheder der ellers ville være til<br />
stede, n˚ar et nyt paradigme skal indlæres p˚a traditionelvis ved brug af, et for dem, nyt<br />
programmeringssprog. Dermed kan der fokuseres p˚a programmeringens grundprincipper<br />
i stedet. [Placer93]<br />
33 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 6.4<br />
6.4.2 Ulemper<br />
• Der argumenters for, at man p˚a første programmeringskursus kun skal undervises i et<br />
enkelt paradigme og lære dets grundprincipper til fulde, da man kun kan f˚a den nødvendige<br />
indsigt i et enkelt paradigme, ved at arbejde med det ét helt semester[Bruhn].<br />
• Undervisning i multiparadigmet kunne m˚aske skræmme potentielle dataloger væk fra<br />
feltet, da den konkrete indsigt og fordybelse i et af de mere anvendte programmeringsparadigmer<br />
ikke er tilstede[Bruhn].<br />
20. december 2003 Roskilde Universitetscenter 34
Kapitel 7<br />
Undersøgelse<br />
7.1 Om undersøgelsen<br />
Form˚alet med undersøgelsen er, at give et indblik i hvilke paradigmer, der bliver brugt til introducerende<br />
datalogikurser p˚a de danske uddannelsesinstutionerner. Vi har valgt at kontakte<br />
lange og mellemlange videreg˚aende uddannelser, og det er blevet til 16 datamatikerskoler, 7 datalogiskeinstitutter<br />
og 3 ingeniørskoler. Undersøgelsen blev foretaget per e-mail, hvor der blev<br />
stillet følgende tre spørgsm˚al:<br />
Spørgsm˚al:<br />
• Indenfor hvilket paradigme/sprog udbyder I de indledende programmeringskurser?<br />
• Udfra hvilke kriterier har I gjort disse valg?<br />
• Hvem har truffet valget? Har det for eksempel været op til de enkelte kursusundervisere,<br />
eller har der været en overordnet planlægning heraf?<br />
Form˚alet med undersøgelsen har som nævnt kun været at f˚a et overblik over, hvilke paradigmer<br />
der undervises i, p˚a de introducerende programmeringskurser, og at f˚a argumenter for<br />
disse valg. Derfor har vi valgt at e-mailen kun skulle indeholde disse relative enkelte spørgsm˚al.<br />
Vi valgte bevidst at skrive paradigme/sprog i første spørgsm˚al, selvom vi i rapporten kun<br />
behandler paradigmer. Dette skyldes vores tvivl, om der er nogen paradigme overvejelser p˚a<br />
alle institutioner.<br />
7.2 Forventninger til undersøgelsen<br />
Vores forventninger til undersøgelsen gik p˚a at se en tydelig opdeling, af hvilke paradigme der<br />
bliver undervist i og p˚a hvilken type uddannelsessted.<br />
Da det objektorienteret paradigme er det hyppigst anvendte paradigme p˚a arbejdsmarkedet,<br />
har vi en forventning om at datamatikerne undervises i dette paradigme. Denne introduktion<br />
er mest hensigtsmæssig for datamatikerne, da de kan g˚a direkte ud i erhvervslivet, forberedt til<br />
at programmere i det paradigme der allerede anvendes, p˚a den p˚agældende arbejdsplads.<br />
Forventningerne til ingeniørernes introduktion til det imperative paradigme, skyldes at det<br />
er det, paradigme der ligger nærmest maskinkode. Den lave abstraktion er velegnet til ingeniørernes<br />
viden om maskinarkitektur.<br />
Forventningerne til datalogi–institutionerne er et kursus der tilbyder generel og fremtidssikret<br />
programmeringsundervisning. Det vil sige at undervise i overordnede metoder, ikke specifikke<br />
og produktafhængige.<br />
35
<strong>Paradigmer</strong> i programmering Kapitel 7.3<br />
7.3 Resultat<br />
Af de 26 emails, fik vi svar tilbage fra 13 — nogle mere fyldige end andre.<br />
Hvis vi først kigger p˚a spørgsm˚alet: ” Indenfor hvilket paradigme/sprog udbyder I de indledende<br />
programmeringskurser?“ s˚a var fordelingen som følgende:<br />
Antal<br />
Java (objektorienteret) 9<br />
C++ (objektorienteret) 3<br />
Delphi (objektorienteret) 1<br />
Ubesvaret 13<br />
Tabel 7.1: Resultat fra undersøgelsen.<br />
Det er interessant, at alle sprogene er objektorienteret. Man skal dog huske p˚a, at der<br />
er imperative tankegange i de objektorienterede sprog, der her undervises i, da man i det<br />
objektorienteret sprog C++ kan ligge meget vægt p˚a det imperative element, eftersom det er<br />
en udvidelse af det imperative sprog C.<br />
Til spørgsm˚alet om, hvad der har ligget til grund for valg af sprog, var svarene godt fordelt<br />
udover; hensyn til erhvervslivet, især omkring JAVA, der samtidig giver et godt grundlag for det<br />
objekt orienterede paradigme. Nedenfor er der citeret et udsnit af svarene til dette spørgsm˚al.<br />
Pædagogisk optimal og samtidig er kompleksiteten stor nok, relevant for erhvervslivet.(IT<br />
Akademiet, Skive)<br />
Pædagogiske overvejelser, samt faglige, dvs. hvilke sprog som erhvervslivet anvender. (Uddannelsesleder<br />
Erhvervsakademi Midtjylland)<br />
Objektorientering har vi valgt ud fra følgende kriterier:<br />
• OO understøtter en tydelig opdeling af systemer og programmer.<br />
• OO understøtter b˚ade data-abstraktion og funktionel abstraktion<br />
• OO er moderne og udbredt i undervisningssektoren samt i erhverslivet<br />
• Java er udbredt og egner sig rimelig godt til grundlæggende undervisning<br />
P˚a tidspunktet for valget (˚ar 1999) var Java efter vor opfattelse det bedste valg. Andre sprog<br />
overvejes løbende.(Vejle handelsskole)<br />
Jeg kan ikke udtale mig med stor autoritet om hvorfor det lige er Java man har valgt, men<br />
jeg kan komme med nogle gæt (IT-Universitetet i København):<br />
• Det bliver benyttet i ganske mange firmaer.<br />
• Det har en syntaks som er relativt let at læse i forhold til f.eks C++.<br />
• Det giver god mulighed for at demonstrere mange grundlæggende begreber indenfor<br />
OOP.<br />
Industrirelevans + at den hardware og de systemer vi arbejder med forudsætter anvendelsen<br />
af C/C++. Eksempelvis ville det ikke være muligt at anvende Java som alternativ.<br />
(Ingeniørhøjskolen ˚ Arhus)<br />
20. december 2003 Roskilde Universitetscenter 36
Kapitel 7.3 <strong>Paradigmer</strong> i programmering<br />
Til spørgsm˚alet om hvem der træffer beslutningen om hvilket sprog/paradigme der skal undervises<br />
i har stort set alle svaret, at det er lærekolegiet der tager en fælles beslutning.<br />
Vurdering af undersøgelsen<br />
Vi kan konstatere, at svarene for undersøgelsen ikke opfylder vores ønske om at f˚a undersøgt<br />
hvilket paradigme, der undervises i p˚a de udvalgte uddannelsesinstitutioner. Vi havde forh˚abninger<br />
om at resultatet af undersøgelsen, ville best˚a af en række argumenter for hvilket paradigme<br />
universiteter, datamatikeruddannelser og ingienøruddannelser bruger i deres indledende<br />
programmeringsundervisning.<br />
Tilsyneladende fremgik det ikke klart i vores spørgsm˚al, at uddannelsesinstitoutioner skulle<br />
argumentere for deres brug af programmeringsparadigme og ikke programmeringssprog. Dette<br />
har formentlig været˚arsagen til vi ikke opn˚aede det ønskede resultat. Det betyder, at vi kun bruger<br />
argumenterne fra vores artikler og udfra dem vurdere hvilket paradigme, der skal anvendes<br />
i et indledende programmeringskursus.<br />
37 Roskilde Universitetscenter 20. december 2003
Kapitel 8<br />
Diskussion<br />
Vi vil i diskussionen tage udgangspunkt i argumenterne, vi præsenterede i kapitel 6. I dette afsnit<br />
vurderes hvordan man opn˚ar den optimale introducerende programmeringsundervisning. Denne ses ud<br />
fra forskellige fokusomr˚ader inden for programmering orienteret mod det anvendelige og teoretiske, og<br />
skal lede op til den afsluttende konklusion.<br />
Igennem projektforløbet har projektgruppen gentagende gange gjort sig overvejelser omkring<br />
m˚alet med de indledende programmeringskurser. Hvis m˚alet er at gøre de datalogi–studerende<br />
s˚a attraktive som overhovedet muligt for erhvervslivet — her antager vi at erhvervslivet ikke<br />
vægter innovation og nytænkning højt — m˚a det formodes at der fokuseres p˚a et programmeringsparadigme<br />
og de mest udbredte programmeringssprog inden for dette, hvorfor det vil være<br />
mest hensigtsmæssigt at undervise i kun det paradigme fra studiets begyndelse. Derved kan den<br />
studerende f˚a s˚a meget erfaring og knowhow inden for paradigmet som overhovedet muligt.<br />
En anden indgangsvinkel er at give den studerende den brede programmeringsviden. Det vil<br />
sige en bredde som formodentlig vil give et bredere perspektiv, og dermed et større indblik<br />
i udviklingen af nye programmeringsmetoder og forskningsomr˚ader inden for programmering.<br />
Har den studerende kendskab og erfaringer med løsninger inden for de forskellige programmeringsparadigmer,<br />
er det sandsynligt at man efterfølgende har en bedre baggrund for at designe<br />
algoritmer og løsningsmodeller til forskelligartede opgaver. Dog kan man frygte, at erhvervslivet<br />
ikke værdsætter eksempelvis evner og kendskab til logikprogrammering særlig højt, og derfor<br />
stort set altid ville vælge at ansætte datalogen, der har størst erfaring med programmering,<br />
inden for det paradigme som er oppe i tiden.<br />
En anden ting, vi har haft med i vores overvejelser, er om man med fordel ikke kan undervise<br />
de studerende i programplanlægning, alts˚a hvordan man kan dele en problemstilling op i mindre<br />
dele og p˚a den m˚ade f˚a et overblik over, hvorledes man bør starte sin programmering. Dette er<br />
selvfølgelig især oplagt, hvis man senere har til hensigt at sætte sig ind i objektorienteret programmering.<br />
Man taler ogs˚a om evnen til at analysere problemstillinger og dermed hurtigere<br />
komme ind til selve programmeringen. Det tænkes, at den studerendes manglende programmeringsevner<br />
vil vanskeliggøre forst˚aelsen af programplanlægningen, og det dermed ikke er en<br />
hensigtsmæssig introduktion til programmering.<br />
Vi vil ud fra problemformuleringen finde den mest hensigtsmæssige programmeringsundervisning.<br />
Derfor opstiller vi nu de tidligere omtalte tilgangsvinkler. De to tilgangsvinkler til<br />
programmeringsundervisningen er følgende.<br />
Inspirationen til denne opdeling blev fundet i IT-Lex [itLex01].<br />
• Teoretisk datalogi. Her lægges vægt p˚a studiet af de principelle muligheder for databehandling,<br />
som dækker datarepræsentation og transformation.<br />
38
Kapitel 8.1 <strong>Paradigmer</strong> i programmering<br />
• Anvendt datalogi — Datamatik. Med dette tænkes at der skal tilegnes et dybdeg˚aende<br />
kendskab og kompetence indenfor programmering, systemkonstruktion og planlægning.<br />
Den faktiske udnyttelse af den ” teoretiske datalogi“ sker i den ” anvendt datalogi“ .<br />
Det er op til ledelsesorganer for studiet at definere i den p˚agældende studieordningen, hvad<br />
der efterfølgende ønskes, de studerende skal være specialiseret i. Vi som projektgruppe vil ikke<br />
udtale os om hvordan en s˚adan studieordning konkret bør se ud, men derimod vende os mod<br />
tilgangsvinklerne.<br />
8.1 Anvendt datalogi — Datamatik.<br />
Vi vil nu vurdere programmeringsparadigmerne som valget til første programmeringskursus ud<br />
fra anvendt datalogisk tilgangsvinkel.<br />
Vi finder multiparadigmet mindst hensigtsmæssig i forhold til de andre paradigme inden for<br />
denne tilgangsvinkel. Da dette medfører manglende fordybelse i et konkret paradigme. Derfor<br />
f˚ar den studerende ingen dybdeg˚aende kompetence efter det introducerende kursus, hvorfor<br />
man mangler evnen til at løse konkrete anvendelses relaterede opgaver, i den umiddelbare<br />
efterfølgende undervisning.<br />
Multiparadigmet er ikke aktuelt anvendelsesorienteret, da der p˚a nuværende tidspunkt ikke<br />
findes noget alment udbredt multiparadigmalt sprog.<br />
De deklarative paradigmer er ikke hensigtsmæssige, da paradigmernes anvendelsesspektre er<br />
en anelse snævert, hvorfor man m˚a formode det ikke vil give den studerende generelle brugbare<br />
kompetencer indenfor systemplanlægning og konstruktion. Endvidere er mulighederne for at<br />
udvikle generelle applikationer under de deklarative paradigmer begrænset.<br />
Abstraktionniveauet i deklarative paradigmer er p˚a et højere niveau, hvorfor det kan tænkes<br />
at de studerende ikke vil vinde noget ved at blive undervist p˚a dette niveau, og vil eventuelt<br />
afskrække dem for studiet i forhold til deres forventninger.<br />
Avancerede begreber bliver introduceret p˚a et tidligere niveau grundet paradigmets struktur,<br />
hvorfor der er meget teoretisk fokus allerede i starten, hvilket ikke er hensigtsmæssigt i forhold<br />
til programudvikling.<br />
Endvidere er det et faktum, at de deklarative paradigmer ikke er særlige udbredte, hvilket<br />
betyder de færreste har forudg˚aende kendskab til paradigmet. Dette er en fordel for den<br />
studerende i forbindelse med den introducerende undervisning, da alle starter p˚a samme niveau.<br />
Det imperative paradigme er som s˚adan et ganske fornuftigt valg til det indledende programmeringskursus.<br />
Det er simpelt i sin opbygning og har lavt abstraktionsniveau, hvilket gør det<br />
fordelagtigt for studerende, som ikke har noget kendskab til programmering. Endvidere kunne<br />
det tænkes at programmeringskurser med undervisning i imperativ ville appelere til studerende,<br />
som ikke har planer om at studere datalogi, da eksempelvis fysikere og matematikere kan f˚a<br />
brug for, at skrive sm˚a simple programmer til talbehandling eller lignende.<br />
Lignende grundlæggende opbygning, af eksempelvis løkker, findes ofte i objektorienterede<br />
sprog, og en senere tilgang til s˚adanne vil muligvis være lettere for den studerende. Dog er<br />
der blevet argumenteret for at de studerende skulle være negativt indstillet p˚a at lære nye<br />
programmeringssyn — det er dog ikke noget holdbart argument, da man burde undg˚a en generel<br />
negativ indstilling ved en pædagogisk tilgang til et nyt paradigme.<br />
Paradigmet skulle, som nævnt i kapitel 6, falde naturligt for mange studerende. Det i kombination<br />
med de mange ˚ars erfaring og veludviklede pædagoiske undervisningsmateriale inden<br />
for imperative programmering, giver det de bedste forudsætninger for de studerende for at tage<br />
imperative programmering til sig. Risikoen for sideeffekter og dermed unødige tidskrævende<br />
problemer er overhængende, og kan være et problem.<br />
39 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 8.2<br />
Undervisning i det imperative paradigme vil give den studerende en fornuftig basis indenfor<br />
simpel programmering, der efterfølgende kan bygges videre p˚a.<br />
Vi mener, at undervisningen indenfor det objektorienterede paradigme er et oplagt valg til<br />
et introducerende programmeringskursus. De tidlige design overvejelser og arbejdet med at<br />
strukturere et program bliver lettere tilgængeligt med objekter. Endvidere er der ogs˚a dem, der<br />
mener den objektorienterede tankegang ligger tættere opad den virkelige verden og dermed er<br />
hurtigt at tilegne.<br />
Der kan argumenteres for, at det er sværere at tilegne sig det objektorienteret paradigme,<br />
n˚ar man allerede har opereret inden for andre paradigmer. Overgangen fra objektorienteret til<br />
andre paradigmer er efter sigende nemmere for de studerende.<br />
Det objekt orienterede paradigme opfylder de opstillede punkter godt inden for datamatik,<br />
b˚ade med kompetence indenfor reel programmering og planlægning.<br />
8.2 Teoretisk datalogi<br />
Det imperative paradigme er det traditionelle programmeringsparadigme. Det er relativ simpel<br />
og giver god træning i procesorienteret programmering. Paradigmet ligger tæt p˚a den maskinelle<br />
udførelse, hvilket gør at den studerende f˚ar en god indsigt i den reelle maskinudførelse.<br />
P˚a den anden side er abstraktionsniveauet i det imperative paradigme meget lavt, hvilket<br />
gør det svært for den studerende at repræsentere data p˚a et højere plan, og der skal meget<br />
grundarbejde til. Da paradigmet netop opererer p˚a dette nærmaskinelle plan fjerner det fokus<br />
fra teorien, da man skal bruge forholdsvis meget energi p˚a at realisere teorierne i paradigmet,<br />
eftersom der skal tages højde for kodning af mere triviel art.<br />
Det objektorienterede paradigme løfter programmøren fra det maskinnære abstraktionsniveau<br />
til en problemløsningsmetode nærmere den menneskeligetankegang.<br />
Overgangen fra objektorienteret paradigme til andre paradigmer, er ikke nær s˚a problematisk<br />
som ved andre paradigmer. Dette er en fordel for den teoretisk tilgangsvinkel til datalogi, da<br />
man her arbejder med flere paradigmer.<br />
I forhold til den teoretiske forst˚aelse for paradigmer er objektorienteret d˚arligt ved en førstegangsundervisning,<br />
eftersom der ved det introducerendekursus formentlig vil være en del<br />
udenadslæren.<br />
Hvis man derimod ser p˚a den deklarative tankegang, som er med til at bringe programmøren<br />
p˚a et højere abstraktionsniveau, s˚a har det en del fordele: Man bevæger sig væk fra det mere<br />
maskinnære og tankegangen om, ” hvordan gør vi det“, til det mere overordnede, ” hvad er det, vi<br />
gør“. Bindingen til maskinens m˚ade at gøre tingene p˚a undg˚ar man stort set, da man slipper for<br />
at tænke p˚a at allokere hukommelse og sletning af brugte referancer. Ved at lægge selve maskinens<br />
m˚ade at arbejde p˚a til side gives et større perspektiv, da man under programudviklingen<br />
ikke tynges ned af beslutninger af mere teknisk art.<br />
Samtidig kan det ogs˚a argumenteres at abstraktions niveauet kan blive for højt. Det kan<br />
være svært for de studerende at sætte sig ind i den ofte ganske anderledes tankegang, samtidig<br />
med at det er let at miste overblikket. Dette sammen med at de deklarative paradigmer ikke er<br />
alment udbredt, kan give de studerende en skeptisk holdning.<br />
Endvidere er det et faktum, at de deklarative paradigmer ikke er særlige udbredte, hvilket<br />
betyder de færreste har forudg˚aende kendskab til paradigmet. Dette er en fordel for den<br />
studerende i forbindelse med den introducerende undervisning, da alle starter p˚a samme niveau.<br />
Multiparadigmet er et oplagt valg til denne teoretiske tilgang, da fokus ikke bliver p˚a de<br />
forskellige paradigmers individuelle sprogs syntaks, men p˚a de paradigmentionelle principper<br />
og en forst˚aelse af disse. Multiparadigmet gør det nemmere for den studerende at sætte sig ind<br />
i fremtidige programmeringsparadigmer. Multiparadigmet giver de bedste muligheder for ikke<br />
20. december 2003 Roskilde Universitetscenter 40
Kapitel 8.2 <strong>Paradigmer</strong> i programmering<br />
at blive udsat for en paradigmatisk styring — om man vil det eller ej. Dette er netop vigtigt for<br />
en mere teoretisk orienteret datalog, eftersom denne helst skal kunne arbejde objektivt inden<br />
for flere paradigme.<br />
41 Roskilde Universitetscenter 20. december 2003
Kapitel 9<br />
Konklusion<br />
Vi kan p˚a baggrund af det forudg˚aende projektarbejde konkludere, at for ´”Anvendt datalogi“<br />
vil det være mest hensigtsmæssigt at anvende det objekt orienterede paradigme til den introducerende<br />
undevisning, da dette giver den studerende kompetencer indenfor b˚ade konkret<br />
programmering og systemplanlægning.<br />
Hvis man vælger at starte undervisning med henblik p˚a et mere teoretisk syn, vil det være<br />
mest optimalt at starte med multiparadigmet, da dette fra starten af den introducerende programmeringsundervisning,<br />
giver den studerende et kendskab til paradigmatiske grundprincipper<br />
i programmering.<br />
42
Kapitel 10<br />
Perspektivering<br />
Projektarbejdet tog udgangspunkt i spørgsm˚alet ´”Hvilket paradigme er mest hensigtsmæssigt<br />
at anvende til introducerende programmeringsundervisning, for hver af de to tilgangsvinkler?“.<br />
Vi valgte at bedømme paradigmerne udfra nogle bestemte tilgangsvinkler, men der var som<br />
s˚adan intet, der forhindrede os i at have bedømt paradigmerne udfra nogle andre tilgangsvinkler.<br />
Man kunne eventuelt have argumenteret for, at ´”hensigtsmæssigt“ ville være et paradigme<br />
hvor man allerede efter første kursusgang ville være i stand til skrive et stykke kode, der kunne<br />
udføre noget, samtidig med at man forst˚ar hvorfor koden se ud som den gør. ´”Mest hensigtsmæssigt“<br />
kunne ogs˚a bare være set i forhold til erhvervslivet.<br />
Vi valgte at beskæftige os med paradigmer, for at rapporten ville kunne sige noget mere<br />
generelt, og ikke bare se p˚a et lille udsnit af konkrete programmeringssprog. Men efter nu at<br />
have in<strong>dk</strong>redset hvilket paradigme, der er mest hensigtsmæssigt at starte undervisningen med,<br />
ville det da være interessant at lave et opfølgende projekt, der havde til form˚al at undersøge<br />
hvilket sprog man konkret skulle undervise i.<br />
Man ville eventuelt kunne gøre den endnu mere specifik, og konkludere hvad man skal undervise<br />
i p˚a eksempelvis RUC.<br />
Hvis vi skal vende tilbage til undersøgelser, der kunne være interessante: En undersøgelse af<br />
hvad de studerende p˚a et indledende programmeringskursus finder vanskeligt.<br />
43
Litteratur<br />
[Bergin96] Thomas J. Bergin & Richard G. Gibson, ” History of Programming Languages“,<br />
The American University Washington D.C.,1996<br />
[Brilliant96] Susan S. Brilliant og Timothy R. Wiseman, ” The first programming paradigm<br />
and language dilemma“, ACM SIGCSE Bulletin , Proceedings of the<br />
twenty-seventh SIGCSE technical symposium on Computer science education,<br />
Volume 28, Issue 1, 1996<br />
[Bruhn] P. J. Burton og R. E. Bruhn, ” Teaching programming in the OOP era“,<br />
ACM SIGCSE Bulletin, Volume 35, Issue 2<br />
[Budd95b] Timothy A. Budd, ” Multiparadigm Programming in Leda“, Addison-Wesley,<br />
1995<br />
[Budd95c] Timothy A. Budd og Rajeev K. Pandey, ” Never Mind the Paradigm, What<br />
About Multiparadigm Languages?“, ACM SIGCSE Bulletin, Volume 27 Issue<br />
2, 1995<br />
[cs.auc.<strong>dk</strong>1] Undervisnings materiale p˚a AUC - http://www.cs.auc.<strong>dk</strong>/∼normark/ps3-<br />
98/noter/pdf/intr.pdf<br />
[Curricula01] Computing Curricula 2001, ACM og IEEE-CS,<br />
http://www.computer.org/education/cc2001/final/chapter07.htm<br />
[Decker93] Rick Decker og Stuart Hirshfield, ” Top-down teaching: Object-oriented programming<br />
in CS1“, ACM SIGCSE Bulletin , Proceedings of the twentyfourth<br />
SIGCSE technical symposium on Computer science education, Volume<br />
25, Issue 1, 1993<br />
[dictionary.reference.com] Online engelsk ordbog - http://dictionary.reference.com/<br />
[Gordon88] Michael J. C. Gordon, ” Programming Language Theory and its Implementaion“,<br />
Prentice Hall International (UK) Ltd, 1988<br />
[Hadjerroult98] Said Hadjerroult, ” Java as First Programming langauge: A critical evaluation“,<br />
ACM SIGCSE Bulletin, Volume 30, Issue 2<br />
[Harbison91] Samuel P. Harbinson & Guy L. Stelle Jr., ” C a reference manual“, 3 udg,<br />
Prentice-Hall, 1991<br />
[HofPL] Thomas J. Bergin og R. Gibson, ” History of programming languages“, ACM<br />
Press, 1996<br />
[Horstmann03] Cay Horstmann, ” Computing Concepts with Java Essentials“, 3. udg, Wiley,<br />
2003<br />
[Høholdt00] Tom Høholdt og Helge Elbrønd Jensen, ” Grundlæggende matematik“, Institut<br />
for Matematik, DTU, 2000<br />
44
Kapitel 10.0 <strong>Paradigmer</strong> i programmering<br />
[itLex01]<br />
” IT-lex“, 2. udg., Ingeniøren | bøger, 2001<br />
[Karush78] Willian Karush, ” Matematisk Opslagsbog“, Politikens Forlag, 1978<br />
[Kowalski] Robert Kowalski, ” Algoritm = Logik + Control“, Imperial College, London<br />
[Kragh91] Helge Kragh og Stig Andur Pedersen, ” Naturvidenskabens teori“, 2. udg.,<br />
Nyt Norisk Forlag Arnold Busk, 1991<br />
[Kuhn73] Thomas Kuhn, ” Videnskabens Revolutioner“, Fremad, 1973<br />
[Lehmann] Ole Lehrmann Madsen, ” Towards A Unified Programming Language“, Aahus<br />
Universitet.<br />
[Luker89] Paul A. Luker, ” Never mind the Language, What about the Paradigme?“,<br />
ACM SIGCSE Bulletin , Proceedings of the twentieth SIGCSE technical<br />
symposium on Computer science education, Volume 21, Issue 1<br />
[Luker94] Paul A. Luker, ” There’s more to OOP than syntax“, ACM SIGCSE Bulletin<br />
, Proceedings of the twenty-fifth SIGCSE symposium on Computer science<br />
education, Volume 26, Issue 1<br />
[Mey87] Meyer, B., ” Reusability: The Case for Object-Orieted Design“, IEEE<br />
Software, March 87<br />
[Neubauer02] B. J. Neubauer og D.D. Strong, ” The Object-oriented paradigm: More natural<br />
og less familiar?“, JCSC 18, okt, 2002<br />
[Nudansk96] Erik Høvring, ”Politikens store nye Nu Dansk ordbog“, Politikens Forlag,<br />
1996<br />
[Nudansk92]<br />
” Poltikens Nudansk Ordbog“, 15. udg., Politikens Forlag, 1992<br />
[Sammet69] Jean E. Sammet, ” Programming Languages: History and Fundamentals“,<br />
Prentice–Hall, 1969<br />
[Spinellis93] Diomidis D. Spinellis, ” Programming paradigms as Object Classes: A St<strong>ruc</strong>turing<br />
Mechanism for Multiparadigm Programming“, maj 1993, doktordisputats,<br />
Dept. of Computing, University of London, United Kingdom<br />
[Sterling2000] Leon Sterling og Ehud Shapiro, ” Art of Prolog“, Second Edition 2000<br />
[Paulson91] Laurence C. Paulson, ” ML for the Working Programmer“, Cambridge University<br />
Press, 1991<br />
[Pedroni03] Michela Pedroni, ” Teaching introductory programming with the inverted<br />
curriculum Approache“, Diploma thesis, Dept. of Computer Science, ETH<br />
Zurich, 2003<br />
[Placer91] John Placer, ” Multiparadigm Research: A New Direction In Language Design“,<br />
ACM SIGPLAN Notices, vol. 26, no. 3, March 1991<br />
[Placer93] John Placer, ” The promise of multiparadigm languages as pedagogical<br />
tools“, Proceedings of the 1993 ACM conference on Computer scienc, 1993<br />
[Rebelsky01] Samuel A. Rebelsky m.fl., ” Why I Do Declare! Declarative Programming<br />
in the Undergraduate Curriculum“, ACM SIGCSE Bulletin , Proceedings<br />
of the thirty-second SIGCSE technical symposium on Computer Science<br />
Education, Volume 33, Issue 1, 2001<br />
45 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel 10.0<br />
[Reinfelds93] Juris Reinfelds og Gopal Gupta,<br />
” LP as an Introductory<br />
Programming Paradigm“, http://wwwlp.doc.ic.ac.uk/UserPages/staff/ft/alp/comment/intro.html<br />
[Reinfelds95] Juris Reinfelds, ” A three paradigm first course for CS majors“, ACM<br />
SIGCSE Bulletin , Proceedings of the twenty-sixth SIGCSE technical symposium<br />
on Computer science education, Volume 27, Issue 1, 1995<br />
[Rosenberg95] M. Kölling, B. Koch og J. Rosenberg, ” Requirements for a first year objectoriented<br />
teaching language“, ACM SIGCSE Bulletin , Proceedings of the<br />
twenty-sixth SIGCSE technical symposium on Computer science education,<br />
Volume 27, Issue 1<br />
[Sprague02] Peter Sprague og Celia Schahczenski, ” Abstraction the key to CS1“, The<br />
Journal of Computing in Small Colleges, Volume 17, Issue 3, 2002<br />
[Thompson99] Simon Thompson, ” Haskell: The Craft of Functional Propgramming“, 2.<br />
udg., Addison-Wesley, 1999<br />
[VirginaTech] John A. Lewis, Sallie M. Henry, Dennis G. Kafura “‘An Empircal Study of<br />
the Object-Oriented Paradigm and Software Reuse´”, Virginia Tech, Blacksburg,<br />
Virginia<br />
[Wadler] Philip Wadler, ” Function Programming, Why no one uses funtional languages“,<br />
Bell Laboratories, Lucent Technologies<br />
[Weisfeld01] Matt Weisfeld, ” Objektorienterede begreber“, IDG, 2001<br />
[wikipedia.org1] http://en.wikipedia.org/wiki/Functional programming#History<br />
[wikipedia.org2] http://en.wikipedia.org/wiki/Imperative programming<br />
Sekundær litteratur<br />
- Maurive V. Wilkes, ” From Fortran and Algol to Object-Oriented Languages“, Communications<br />
of the ACM, Juli 1993, no. 7, p. 21-23<br />
- Hugh Glasser, Chris Hankin og David Till, ” Principles of Functional Programming“,<br />
Prentice-Hall International, 1984<br />
- ˚ Ake Wikström, ” Functional Programming Using Standard ML“, Prentice-Hall International,<br />
1987<br />
- Malcolm Morrison og Timothy S. Newman, ” A Study of the Impact of Student Background<br />
and Preparedness on Outcomes in CS I“, ACM SIGCSE Bulletin , Proceedings of the<br />
thirty-second SIGCSE technical symposium on Computer Science Education, Volume 33,<br />
Issue 1, 2001<br />
- Douglas Goodman og R. A. McBride, ” Ada as an Introductory Language“, Proceedings<br />
of the conference on TRI-Ada ’92, 1992<br />
- Katrin Becker, ” Back to Pascal: retro but not backwards“, The Journal of Computing in<br />
Small Colleges, Volume 18, Issue 2, 2002<br />
- William Marion, ” CSl: What Should We Be Teaching?“, SIGCSE Bulletin, Vol 31, 4,<br />
December 1999<br />
- Elliot Koffman og Ursula Wolz, ” CSI Using Java Language Features Gently“, ACM SIGCSE<br />
Bulletin , Proceedings of the 4th annual SIGCSE/SIGCUE ITiCSE conference on Innovation<br />
and technology in computer science education, Volume 31, Issue 3, 1999<br />
20. december 2003 Roskilde Universitetscenter 46
Kapitel 10.0 <strong>Paradigmer</strong> i programmering<br />
- Niklaus Wirth, ” Computing Science Education: The Road not Taken“, ACM SIGCSE<br />
Bulletin , Proceedings of the 7th annual conference on Innovation and technology in<br />
computer science education, Volume 34, Issue 3, 2002<br />
- N. Ram, ” Effectiveness of paradigmatic approach in teaching programming“, Proceedings<br />
of the ACM 1980 annual conference, 1980<br />
- Kris Howell, ” First computer languages“, The Journal of Computing in Small Colleges,<br />
Volume 18, Issue 4, 2003<br />
- Mary Beth Rosson, ” How might the object-oriented paradigm change the way we teach<br />
introductory programming?“, CM SIGPLAN OOPS Messenger , Addendum to the proceedings<br />
on Object-oriented programming systems, languages, and applications (Addendum),<br />
Volume 4, Issue 2, 1992<br />
- Cara MacNish m.fl., ” Java as a teaching language — opportunities, pitfalls and solutions“,<br />
Proceedings of the third Australasian conference on Computer science education, 1998<br />
- Chuck Leska m.fl., ” Multiple paradigms in CS I“, ACM SIGCSE Bulletin , Proceedings of<br />
the twenty-seventh SIGCSE technical symposium on Computer science education, Volume<br />
28, Issue 1, 1996<br />
- Amruth Kumar m.fl., ” Resources for Next Generation Introductory CS Courses“, ITiCSE<br />
1999 Working Group Reports, Vol 31, 4, 1999<br />
- Joel C. Adams, ” Object-centered design: a five-phase introduction to object-oriented programming<br />
in CS1–2“, ACM SIGCSE Bulletin , Proceedings of the twenty-seventh SIGCSE<br />
technical symposium on Computer science education, Volume 28, Issue 1, 1996<br />
- Mary Jane Willshire, ” Old Dogs, New Tricks“, ACM SIGCSE Bulletin , Proceedings of<br />
the twenty-sixth SIGCSE technical symposium on Computer science education, Volume<br />
27, Issue 1, 1995<br />
- Rolf Wiehagen m.fl., ” On the Power of Learning Robustly“, Proceedings of the eleventh<br />
annual conference on Computational learning theory, 1998<br />
- Ariel Ferreira Szpiniak m.lf., ” Our Experience Teaching Functional Programming at University<br />
of Rio Cuarto (Argentina)“, SIGCSE Bulletin, Vol 30, 2, 1998<br />
- Nan C. Schalle m.fl., ” Using Java in computer science education“, The supplemental proceedings<br />
of the conference on Integrating technology into computer science education:<br />
working group reports and supplemental proceedings, 1997<br />
- Leon E. Winslow, ” Programming Pedagogy – A Psychological Overview“, SIGCSE BUL-<br />
LETIN, Vol. 28, 3, 1996<br />
- Michael Kölling m.fl., ” Requirements for a first year object-oriented teaching language“,<br />
ACM SIGCSE Bulletin , Proceedings of the twenty-sixth SIGCSE technical symposium<br />
on Computer science education, Volume 27, Issue 1, 1995<br />
- M. B. Wells og B. L. Kurtz, ” Teaching multiple programming paradigms: a proposal for<br />
a paradigm general pseudocode“, ACM SIGCSE Bulletin , Proceedings of the twentieth<br />
SIGCSE technical symposium on Computer science education, Volume 21, Issue 1, 1989<br />
- Suzanne Skublics og Paul White, ” Teaching Smalltalk as a First Programming Language“,<br />
ACM SIGCSE Bulletin , Proceedings of the twenty-second SIGCSE technical symposium<br />
on Computer science education, Volume 23, Issue 1, 1991<br />
- Ursula Wolz m.fl., ” Teaching introductory programming in the multi-media world“, ACM<br />
SIGCSE Bulletin , Proceedings of the 1st conference on Integrating technology into computer<br />
science education, Volume 28, 1996<br />
47 Roskilde Universitetscenter 20. december 2003
<strong>Paradigmer</strong> i programmering Kapitel .0<br />
- ” A debate on Teaching Computing Science“, Communications of the ACM, Volume 32,<br />
Number 12, 1989<br />
- Mohsen Beheshti, Ananda D. Gunawardena, ” Teaching programming paradigms using a<br />
laboratory approach“, The Journal of Computing in Small Colleges, Volume 16, Issue 3,<br />
2001<br />
- Piyush Maheshwari, ” Teaching Programming Paradigms and Languages for Qualitative<br />
Learning“, Proceedings of the second Australasian conference on Computer science education,<br />
1997<br />
- Roger Duke m.fl., ” Teaching Programming to Beginners — choosing the language is just<br />
the first step“, Proceedings of the Australasian conference on Computing education, 2000<br />
- N.N. King, ” The evolution of the programming languages course“, ACM SIGCSE Bulletin<br />
, Proceedings of the twenty-third SIGCSE technical symposium on Computer science<br />
education, Volume 24, Issue 1, 1992<br />
- Tony Jenkins, ” The Motivation of Students of Programming“, ACM SIGCSE Bulletin<br />
, Proceedings of the 6th annual conference on Innovation and technology in computer<br />
science education, Volume 33, Issue 3, 2001<br />
- Richard J. Reid, ” The object oriented paradigm in CS 1“, ACM SIGCSE Bulletin , Proceedings<br />
of the twenty-fourth SIGCSE technical symposium on Computer science education,<br />
Volume 25, Issue 1, 1993<br />
- Amparo Lopez Gaona, ” The Relevance of Design in CS1“, SIGCSE Bulletin, Vol 32, 2,<br />
2000<br />
- Peter Van Roy m.fl., ” The Role of Language Paradigms in Teaching Programming“, ACM<br />
SIGCSE Bulletin , Proceedings of the 34th SIGCSE technical symposium on Computer<br />
science education, Volume 35, Issue 1, 2003<br />
- Rick Decker og Stuart Hirshfield, ” The Top 10 Reasons Why Object-Oriented Programming<br />
Can’t Be Taught in CS 1“, ACM SIGCSE Bulletin , Proceedings of the twenty-fifth<br />
SIGCSE symposium on Computer science education, Volume 26, Issue 1, 1994<br />
- A. Michael Berman m.fl., ” Using C++ in CS1/CS2“, ACM SIGCSE Bulletin , Proceedings<br />
of the twenty-fifth SIGCSE symposium on Computer science education, Volume 26, Issue<br />
1, 1994<br />
- L.F. Johnson, ” C in the First Course Considered Harmful“, Communications of the ACM,<br />
Vol. 38, 5, 1995<br />
- Richard Close m.fl., ” CS1: perspectives on programming languages and the breadth-first<br />
approach“, The Journal of Computing in Small Colleges , Proceedings of the fifth annual<br />
CCSC northeastern conference on The journal of computing in small colleges, Volume 15,<br />
Issue 5, 2000<br />
- Frances Bailie m.fl., ” Objects first — does it work?“, The Journal of Computing in Small<br />
Colleges, Volume 19, Issue 2, 2003<br />
- Stephen A. Bloch, ” Scheme and Java in the first year“,The Journal of Computing in Small<br />
Colleges , Proceedings of the fifth annual CCSC northeastern conference on The journal<br />
of computing in small colleges, Volume 15, Issue 5, 2000<br />
- Richard L. Wexelblat, ” The consequences of one’s first programming language“, Proceedings<br />
of the 3rd ACM SIGSMALL symposium and the first SIGPC symposium on Small<br />
systems, 1980<br />
- Douglas Bell, ” Visual Basic.Net as a First Language: An Evaluation“, ACM SIGCSE<br />
Bulletin, Volume 34, Issue 4, 2002<br />
20. december 2003 Roskilde Universitetscenter 48