daimiposten - oktober '97

daimiposten er internt meddelelsesorgan for studerende og medarbejdere ved Datalogisk Afdeling, Aarhus Universitet. Indlæggene er ikke udtryk for afdelingens officielle holdning.


Ti år med Trine

En hel generation af studenter ved Daimi er blevet opfostret med Trine som introducerence programmeringssprog i dProg1, Dat1 eller Dat11. Nu, hvor sproget og kurset måske synger deres svanesang, skuer en af Trine åndelige fædre tilbage.

af Michael Schwartzbach.

Programmeringssproget Trine blev første gang anvendt til den introducerende datalogiundervisning i 1987. I år benyttes det for antageligvis sidste gang. Det giver godt nok 11 år (stakitter og mellemrum), men den nuværende overskrift lyder jo bedre.

I denne artikel vil jeg se tilbage på udviklingen af Trine og erfaringerne med dets brug.

Præhistorie

I de tidlige 80'ere afholdt Erik Meineche Schmidt og Mogens Nielsen for gymnasielærere en række efteruddannelseskurser kaldet »Algoritmer ­ konstruktion og analyse«. Til det formål ønskede de en speciel programmeringsnotation, der skulle gøre det meget ligetil at udtrykke og udføre simple algoritmer. Det eksisterende alternativ var et sprog som Pascal, men det indbyggede overhead virkede for stort for målgruppen.

Som studenterprogrammører designede og implementerede Birger Nielsen og jeg i sommeren 1981 et sådant sprog, der dybest set var Dijkstras minimale notation for algoritmer på lister. Sproget blev kaldt Aka, hvilket naturligvis var afledt af kursets initialer men også var en parodi på Ada, der netop blev lanceret på samme tid. Aka programmer blev oversat til Pascal-programmer, hvilket var overraskende indviklet på grund af en mængde indbyggede begræsninger i datidens Pascal-implementationer. Akas runtime-omgivelse tillod, at man single-steppede gennem programudførelsen og inspicerede programmets tilstand. Gymnasielærerne var vældigt tilfredse og nåede meget længere, end de ellers ville have kunnet.

Siden 1979 havde Erik undervist Datalogi 1 og baseret sig på Pascal. Efter oplevelsen med gymnasielærerne besluttede han, at Aka på samme vis kunne benyttes på den introducerende datalogiundervisning. Efter en nødtørftig afpudsning blev Aka-implementationen derfor flyttet til den legendariske CDC mainframe: en kæmpemaskine med en cpu på én kubikmeter, som alt i alt fyldte hele Mausoleet ­ der var ikke plads til brugere. Maskinen tilhørte den daværende Regionale Edb-center for Aarhus Universitet (Recau) og havde 300 terminalbrugere rundt omkring på campus.

I 1982 startede de nye studenter således med et kortere Aka-forløb, inden de kastede sig over Pascal. Det fungerede udmærket rent pædagogisk, men både sproget og dets design var klart for begrænsede.

Derfor blev Aka 2.0 designet i foråret 1983. Det var et betydeligt mere ambitiøst sprog, der indeholdt procedurer, abstrakte datatyper (klasser uden nedarvning), turtle grafik og en notorisk indviklet (men snedig) Snobol-inspireret i/o-mekanisme. Sproget introducerede desuden de nondeterministiske kontrolstrukturer, der har forbløffet og forvirret nye studenter lige siden. Implementationen blev også mere moden, idet compileren nu oversatte til en abstrakt A-maskine, der så blev fortolket. Jeg skrev compileren først på sommeren og rejste derefter på ferie til USA. Da jeg kom hjem igen, havde Birger implementeret A-maskinen. Da de to dele blev sat sammen, fungerede det faktisk, pånær en håndfuld mindre rettelser. Da Erik kom tilbage fra sommerferie kunne vi så præsentere ham for hans undervisningsprog til det kommende semester. I et anfald af pædagogisk soberhed beordrede han os til fjerne vores underholdende og opmuntrende fejlmeddelelser såsom: »Gone for lunch«, »CDC hardware collapse« (illustreret af et binært dump med et 2-tal et sted) og »Programmer too stupid«. Derefter blev Aka 2.0 succesfuldt brugt i efteråret 1983.

Hardwaremæssigt var det flotte forhold dengang. Studenterne arbejdede ved små terminaler, der mest af alt lignede lyseblå styrthjelme (70'er design). De kunne vise 24 x 80 tegn, hvilket var en lidt problematisk opløsning for vores turtlegrafik.

I sommeren 1984 afleverede jeg mit speciale (med Erik som vejleder), der handlede om en futuristisk udvidelse af Aka og dens pædagogiske pointer. Derefter startede jeg på mit ph.d.-studium i USA, hvor jeg de følgende år beskæftigede mig med ganske andre ting.

I denne tid blev AKA sammen med Pascal stadig brugt på Datalogi 1. I 1986 blev undervisningen flyttet fra CDC-maskinen til et klassesæt af PC-AT maskiner, hvilket var meget moderne. Derfor porterede Birger og Per Olsvig Jensen (Poj) AKA-implementationen til Dos i Modula 2. Denne udgave blev brugt i efteråret 1986, nu sammen med Modula 2. Poj fortsatte i de næste 9 år som hårdtprøvet og uundværlig programmør på Datalogi 1.

I foråret 1987 vendte jeg med min funklende nye ph.d.-grad tilbage til Daimi og skulle nu undervise på Datalogi 1 sammen med Erik. AKA var efterhånden lidt slidt, så det virkede som en god ide at lave en radikal ændring.

Pædagogisk design

På baggrund af de efterhånden mange erfaringer med Aka udarbejdede Erik og jeg vores principper for design af et pædagogisk programmeringssprog til introducerende undervisning. De er i al enkelhed:

  1. alle de begreber, der skal indlæres, skal være direkte repræsenterede i sproget
  2. der må kun være en enkelt udgave af hver slags
  3. der må ikke være »skarpe hjørner«
  4. ingen studenter må have set sproget før.
Navnlig det sidste punkt er måske lidt kontroversielt, men det vedrørte et kritisk aspekt af ethvert førsteårs datalogikursus: den inhomogene sammensætning af studiestarterne. I midten af 80'erne væltede studenterne ind på datalogistudiet i hidtil usete mængder: i 1987 var der omkring 260 studiestartere mod kun 50 i 1979 (og 120 i år). Nogle af disse var »erfarne« Pascal- eller Modula-programmører, mens andre vitterligt aldrig havde set en computer i levende live. Det gav potentielle pædagogiske problemer, idet det langt fra var Pascal-programmørerne, der senere ville klare sig godt på studiet.

Et virksomt middel er at gøre undervisningen lige udfordrende for alle. Det skete dels gennem et initielt Rasmus-forløb, dels gennem et højt matematisk abstraktionsniveau (der senere er forsvundet), og dels gennem brugen af et særligt undervisningssprog. Dette aspekt var i sig selv et stærkt argument for at konstruere en moderne efterfølger til Aka. Problemstillingen er stadig relevant og løses på forskellig vis landet over; på Datalogi 0 på Diku, Datalogisk Institut ved Københavns Universitet, undervises der således i Lisp, ML og Emerald.

Vi traf også en meget bevidst beslutning, om at Trine ikke skulle »sælges« i nogen anden sammenhæng end introducerende datalogiundervisning. For det første havde ingen af os lyst til at ende som uforløste sprogejere, og for det andet ville ambitioner i andre retninger uværgeligt medføre kompromisser med de pædagogiskeprincipper.

Det påvirkede naturligvis også designet, at Datalogi 1 i Eriks ånd er et kursus, der lægger stor vægt på algoritmer og datastrukturer.

Sproget blev kaldt Trine (efter Eriks yngste datter). Det var i alt væsentligt identisk med den nuværende version, der danner grundlag for dProg1 i efteråret 1997. Således indeholdt den første version regulære typer (produkter, summer og lister), rekursive typer, polymorfe moduler, processer (dog kun to) og kanalkommunikation.

Trines dagbog

I et manisk forløb over sommeren 1987 blev Trine 1.0 implementeret af Poj, Ole Agesen og mig. Jeg skrev igen compileren, mens Poj og Ole implementerede en T-maskine. Der udspiller sig altid en klassisk konflikt når arbejdet deles på denne måde: begge projektgrupper er enige om at T-maskinen kun skal have en eneste T-kode, men hvor jeg foreslog »execute program« ville Poj og Ole foretrække »print result«. Et sted midt imellem fandt vi et rimeligt design. Specielt polymorfien og de rekursive typer var ikke helt trivielle at få på plads, men mirakuløst blev vi færdige til semesterstart.

Ikke overraskende var efteråret 1987 præget af endeløse panikrettelser, men både konceptet og implementationen virkede sunde. Trine blev brugt i det meste af efterårssemesteret, hvorefter Modula 2 blev introduceret.

Til efteråret 1988 var Trine pudset lidt af og de fleste fejl var forsvundne. Makrobegrebet, der tillod programmering med »ubestemte stumper«, blev indført. Typesystemet blev gjort fuldt generelt, hvilket blandt andet muliggjorde mit absolutte yndlingsprogram.

Box A(T)
   Box B
      A(List(T))
   End B

   Proc Center[t:T](n:Int)
      if n=0 -> read[t]
       | n>0 -> (+ Var L:List(T)
                   B'Center[L](n-1)
                   t:=L.(|L|/2)
                +)
      fi
   End Center
End A

Programstumpen viser, at Trines polymorfi ikke kan implementeres ved hjælp af simple templates, da ekspansionsdybden i dette eksempel er ubegrænset. Denne version blev benyttet i efterårene 1988 og 1989.

I 1990 var der en generel studierevision, der medførte, at vi splittede kurset op i to principielt uafhængige dele: dProg1 om efteråret (som jeg varetog) og dADS om foråret (som blev Eriks gebet). Kursets indhold blev også revideret, således at en del abstrakte matematiske emner (som transitionssystemer og operationel semantik) udgik af pensum. Isoleret blev dProg1 nu til et meget praktisk kursus. Samtidig vedtog vi, at Trine kunne bære også at blive brugt om foråret, så Modula-2 forsvandt helt, hvilket vi ikke selv syntes var kontroversielt. For helt at erstatte Modula-2 blev Trine ved denne lejlighed udvidet med eksplicitte pointere og pseudoreelle tal.

I 1991 indførtes det generelle procesbegreb, således at T-maskinen omfattede en multiproceskerne. Procesbegrebet er dog aldrig rigtigt blevet fulgt op i undervisningen.

I 1992 blev de gamle PCer erstattet af grafiske Sun 1 arbejdsstationer. Det medførte, at Trine-implementationen blev porteret fra Modula 2 til C, blandt andet ved hjælp af en uhyggelig krydscompiler. Af effektivitetsårsager blev T-maskinen ændret til en hybrid af C og en virtuel maskine, således at de fleste kontrolstrukturer blev afbildet direkte til C-ækvivalenter.

Udseendet af Trine fik stor gavn af dette skift: de enkelte processer blev individuelle Unix-processer med separate X-vinduer, og turtlegrafikken blev suppleret med X-lib grafikrutiner. Hver Sun 1 maskine fik naturligvis koblet tre pc'er på som terminaler, da så megen regnekraft ikke kunne spildes på blot en enkelt student.

Bortset fra minimale justeringer og fintuninger er der ikke sket nogen ændringer af Trine-sproget siden da. De synlige fremskridt er kommet automatisk gennem hurtigere og bedre maskiner, til sidst sågar med farveskærme.

Tidens tand

Trine har båret alderen med rimelig værdighed. Jeg mener faktisk, at det på udmærket vis illustrerer en række fundamentale begreber inden for programmering. Det er dog også klart, at det er modent til en omfattende revision, som hverken Erik eller jeg har den mindste lyst til at kaste os over. Og vi var nok de eneste kandidater.

Siden 1991 har jeg forsøgt at gøre efteråret mere moderne og relevant, ved at lade den obligatoriske opgave bestå i at implementere et interessant stykke software, med komponenter som parsere og fortolkere. I 1991 var det en programmerbar regnemaskine, i 1992 et højniveau grafiksprog, i 1993 en fortolker for en delmængde af Trine og i 1994 en fortolker for en delmængde af Rasmus. I 1995 fandt jeg på en meget succesfuld saltvandsindsprøjtning ved at webificere hele kurset og lade den obligatoriske opgave bestå i at implementere en fungerende web-browser. I den udgave kørte jeg kurset i 1995 og 1996, og Erik benytter samme model i 1997. Jeg er dog sikker på, at dette samtidig er Trines svanesang.

Fremtiden

Det er helt oppe i luften, hvad der fra 1998 skal ske med dProg1, dADS og flere andre kurser. Det følgende er mine helt personlige synspunkter, der på ingen måde afspejler Daimis politik. At dProg1 og dADS stadig er et sammenhængende kursus skyldes i høj grad den store gensidige forståelse mellem Erik og mig. Jeg kunne forestille mig, at de to semesterkurser fremover kunne blive helt adskilte dele ­ også eksamensmæssigt. Da studiestarterne samtidig er blevet en mere homogen og mindre forsamling, forsvinder en del af argumenterne for et undervisningssprog netop som Trine. Hvis jeg i dag skulle designe et nyt dProg1 under disse omstændigheder, ville jeg basere kurset på Java, forsynet med et simpelt, pædagogisk klassebibliotek. Mange af de samme programmeringsbegreber ville blive illustrerede, og nogle nye ville erstatte andre. Java er naturligvis ikke perfekt, men den motivation og det overbevisende eksempelmateriale, man ville få gratis gennem forbindelsen til www, ville langt overskygge eventuelle ulemper. Heldigvis vil jeg dog fremover kunne tillade mig den luksus at stå på sidelinjen og blot kigge på.


Sidste ændring: søndag d. 28. december 1997.