16.07.2013 Views

Paradigmer i Programmering - akira.ruc.dk

Paradigmer i Programmering - akira.ruc.dk

Paradigmer i Programmering - akira.ruc.dk

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!