RC/NIB/kap04
Kurserne i Dask kodning
Af Ole Møller
I efteråret 1955 blev der gives bevilling til bygning af Dask under ATV-instituttet »Dansk institut for matematikmaskiner«. Formanden for bestyrelsen, professor Richard Petersen, besluttede, at kendskabet til kodning skulle udbredes, for at så mange som muligt ville være i stand til at udnytte Dask, når den efter planen stod klar i begyndelsen af 1958, og derfor startedes en række kurser i kodning.
De tre første sæsoner, dvs. perioden 1955-58, udgjorde en begyndelsesfase for hele Regnecentralens virksomhed, hvor man lagde grunden til den meget omfattende og betydningsfulde programmeludvikling, der senere affødte Algol-kurser, kurser i Gier-kodning og meget andet.
Den første sæson strakte sig fra november 1955 til maj 1956, og der blev afholdt tre parallelle kurser ledet af Chr. Andersen, Niels Ivar Bech og mig selv. Vi havde alle tre fast ansættelse udenfor ATV instituttet, henholdsvis som adjunkt ved Ingrid Jespersens skole, beregner ved KTAS og leder af beregningsafdelingen ved Søkortarkivet. Selvom der overvejende var tale om fritidsarbejde, måtte der selvfølgelig vises forståelse fra vore overordnedes side, og personlig havde jeg i den daværende direktør for Søkortarkivet, Kommandør P. S. Jensen, en chef, der stærkt gik ind for, at de ansatte fik frihed til at lære nye ting. Vor baggrund for at lede et sådant kursus var, at vi alle havde gennemgået et tilsvarende kodekursus for Besk ved Matematikmaskinnämden i Stockholm. Det første Besk-kursus blev holdt i foråret 1954, og af danske deltagere var der dengang Niels Ivar Bech, Hans Brøns, Bent Scharøe Petersen og Aage Winther. Disse kurser var koncentreret til to ugers heldagskursus. Ved kurset i efteråret 1955, der var det tredje, deltog fra Danmark Chr. Andersen, Thøger Busk, Aksel Wiin Nielsen og jeg selv. Prøver vi at skønne over antallet af danskere, der i 1955 havde kendskab til kodning og støtter os til, at Besk-kurserne må have været det dominerende lærested, når vi til et lille tocifret tal: måske tityve Besk-kodere og tityve fra andre steder. Jeg har her ikke medtaget den form for kodning, der blev udført i tilknytning til visse af IBM's hulkortanlæg, som f. eks. ved Geodætisk Institut, hvor et sådant anlæg i begyndelsen af halvtredserne blev benyttet til beregninger af Torben Krarup og Bjarner Svejgaard.
Kursusdeltagernes antal det første år kendes ikke nøjagtigt længere, men det har været over halvtreds og antagelig tæt ved de hundrede. Tænker man på kundekredsen omkring moderne datamater, var i en vis forstand alle kategorier repræsenteret allerede dengang. Foruden den naturlige søgning fra universitets- og ingeniørkredse var der et tydeligt islæt fra handels- og kontorvirksomheder. Tager vi alle tre sæsoner under et, kan det nævnes, at der var deltagere fra forsikringsselskabet Danmark, Meteorologisk Institut, Atomenergikommissionen, Post- og Telegrafvæsenet, Dansk Esso, De forenede Papirfabrikker, Carlsberg, Tuborg, Philips, D.D.S.F., Persil, Kryolitselskabet, Crome & Goldschmidt, Haldor Topsøe A/S, Hafnia, KTAS, NESA o.m.a.
Den store tilgang fra firmaerne kom i 1957-58 og skyldtes, at Regnecentralen på Bechs initiativ oprettede en abonnementsordning, som sikrede firmaerne køretid på Dask, når den blev færdig. Deltagerne kom ofte fra ledende stillinger, antagelig for ved selvsyn at vurdere mulighederne i dette nye, tekniske hjælpemiddel og måske også udfra en opfattelse af, at man her stod overfor et arbejde af den typiske gør-det-selv slags. Der kan være visse tidkrævende beregninger en leder »godt kunne tænke sig selv at sidde med«, og nu øjnede man chancen for, at det lod sig gøre. Men kodning, som den der her er på tale, indeholder detaljer i så stort et omfang, at det langt overgår, hvad den almindelige bruger, der også har andet arbejde, kan engagere sig i at lære.
Deltagerne har næppe heft de moderne datamaters avancerede udnyttelse i erhvervslivet i tankerne, dengang de satte sig på bænkene i Læreanstaltens gamle auditorier på Sølvtorvet. Det var almindelige regnestykker, man tænkte på, hvad enten det gjaldt matematiske udtryk eller bogføring. Og der skal nu, som det måske væsentligste indhold af nærværende artikel, fortælles om, hvordan kurserne forsøgte at lære deltagerne at regne på en datamat. Det vil da blive klart, at de kun gav udbytte til de meget teknisk indstillede, som var motiverede for at kende og beskæftige sig i de mindste detaljer med det at regne og at gøre gangen i en regneproces »automatisk«.
Kurserne løb over det meste af en vinter med to timer ugentlig. I 1955 blev der begyndt sidst i november og fortsat til hen i maj, og der har i 1955-56 været afholdt 30-40 kursustimer, og de følgende år ca. 50. Formen bestod i forelæsninger efter en lærebog og gennemgang på tavle af eksempler, hvortil kom at deltagerne, der for det meste var delt ind i mindre grupper, præsterede et stort hjemmearbejde med kodning af egne eller forelagte opgaver. Denne ganske store indsats, som jeg ser den, havde altså som eneste mål at lære at tilrettelægge og kode regneopgaver i maskinkode. I 1955-56 drejede det sig om Besk-maskinkode, hvortil der forelå et trykt kompendium (MNA, 1955). Årsagen var, at Dask's maskinkode endnu ikke var fuldstændig fastlagt, men den ville komme til at ligge tæt op ad Besk-koden (Dask var bygget med Besk som forbillede). For dem, der kender et eller flere højere programmeringssprog, men aldrig har prøvet at kode på dette niveau, vil der være flere ting at lægge mærke til. Jeg skal trække nogle få af de vigtigste frem.
På baggrund af de programmeringssprog, vi kender idag, var Besk's kodesprog yderst besværligt. Al mnemoteknik fra dagligsprog eller matematik, som kunne pege på hvad der foregik, var væk. Hver ordre (instruktion) blev nedskrevet som et femcifret tal i 16-talsystemet, hvis symbolrække var: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. En ordre kunne f.eks. se sådan ud: lA670. De tre forreste cifre, 1A6, kaldtes adressedelen eller blot adressen og angav nummeret på en lagercelle med tilknytning til det, ordren skulle udføre. Skrevet i 10-talsystemet ville dette nummer være 1·(16)2 + 10·(16) + 6 = 272. De to bageste cifre, 70, angav, hvori operationen bestod, og i dette tilfælde at det drejede sig om en transport over i maskinens regneværk af tallet i den lagercelle, adressedelen viste hen til. Her kunne det så ved næste ordre f.eks. blive ganget med et andet tal. Stod der således 0.125 i lagercelle nummer 272, ville ordren lA670 forberede, at 0.125 kunne komme til at indgå i en følgende regneproces. I Dask's kodesprog indførtes, at adressen blev skrevet i 10-talsystemet, og man blev derved skånet for mange trivielle men tidsrøvende fejl. Desuden indførtes et ekstra bogstav (indexregisterangivelsen) efter adressedelen. Dette bevirkede, at adressen blev forøget med et fast tal, hvis værdi man selv bestemte, d.v.s. den blev »relativ« til dette tal. Denne fleksibilitet i retning af hvilke lagerceller, en serie adresser kunne vise hen til, betød et stort fremskridt. En Dask-ordre kunne herefter have følgende udseende: 72B40, hvor 72 er adressen, B indeksregisterangivelsen og 40 operationsdelen (svarer til 70 ved Besk). Hvis koderen har fastsat, at B lader adressen forøge med 200, er denne ordre helt ensbetydende med Besk-ordren ovenfor. Da adressen kunne blive firecifret, bestod en Dask-ordre af op til syv tegn. Det kunne nok være svært at huske den præcise betydning af disse »ord«, som en ordre kaldtes, men man blev dog hurtig klar over, at den egentlige vanskelighed bestod i arbejdet med at skaffe sig overblik over den proces, de skabte i samspil med hinanden.
Vi er her ved et forhold, hvor forskellen mellem Dask-kode og et højere sprog gør sig stærkt gældende, idet nøglen til dette overblik var ordrens adressedel. Adressen udpegede lagercellen med det tal, der skulle bruges, men kunne også - i forbindelse med en hopordre - henvise til en anden programdel, der skulle udføres. At skulle holde rede på alt dette ved hjælp af firecifrede numre vil hos langt de fleste mennesker føre til fejl og besværligt korrekturarbejde i et helt andet omfang, end når arbejdet udføres med enkle og memotekniske symboler. Intet »go to« eller »if ... then« hjalp på sporet af, hvad der var i vejen, eller hvor de gale ting skete; kun en minutiøs gennemgang af hver enkelt ordre kunne afsløre de fejl, der var begået. (Et hjælpemiddel som diagnosticering med udskrift af syntaktiske fejl eksisterede ifølge sagene natur ikke.)
Et andet vigtigt forhold var overløb (»spild«). Det drejer sig her om, at alle tal, såvel dem der indlæstes som dem, der opstod i maskinen under regningerne, skulle holdes numerisk under en bestemt grænse (da tallets forreste cifre ellers ville forsvinde ud i ingenting). I Dask gjaldt at - 1 < tal < + l; samtidig ville alle tal numerisk mindre end ca. 10-14 ikke kunne skelnes fra 0, alt en følge af at en celle i Dask var begrænset til 40 2-talscifre. Man klarede at overholde dette krav ved at anbringe skalafaktorer på tallene efter en nøje gennemtænkt plan, der eventuelt omfattede omskalering undervejs i regningerne. Nutidens programmører vil kun sjældent have været i berøring med, hvad det vil sige at skulle holde alle forekommende tal i et blot jævnt stort regnestykke indenfor et fast område, som dækkes af kun 14 betydende, decimale cifre. Det var indførelsen af »flydende« regning, der fjernede denne vanskelighed. Det skete ved hjælp af programmer til flydende udførelse af de fire regningsarter, altså en løsning ved hjælp af programmer. Ved Dask blev disse programmer lavet omkring 1958. Senere blev flydende regning indført blandt maskinernes indbyggede ordrer (Gier). Det er ganske interessant at tænke på, at der ved indførelsen af den programmerede flydende regning var røster, der gav udtryk for betænkelighed. Jeg må selv regne mig blandt disse, og tankegangen var, at den beregner der ikke nøje fulgte og beherskede størrelsen af alle opståede mellemresultater, næppe havde fuld kontrol over, hvad hans program lavede. Denne strenge og puritanske holdning var naturligvis dømt til at lide nederlag når undtages visse specielle anvendelser. Fastkommaregning med skalafaktor lader kun koderen spilde kræfterne; for i henseende til at beherske regningerne er det den numeriske analyse, der skal vise vej ved at undersøge de algoritmer, der bruges, når disse frit udfolder sig over et næsten ubegrænset talinterval.
Den sidste karakteristiske ting ved maskinkodning, jeg vil omtale, er det, der var så fascinerende, da man så det første gang, nemlig at det tal, der står for en ordre, selv kunne gøres til genstand for almindelig regning, hvorved en ordre fra måske at have lagt tal sammen kunne ændres til at trække dem fra hinanden. Det er klart, at man ved at regne på en ordre i almindelighed får helt forkerte ting ud af det, men ved omtanke kunne man nu og da skyde en genvej. Om det på langt sigt betaler sig med for udpræget trick-kodning kan betvivles; detaljer i trick'et kan glemmes, og man kan komme til at spænde ben for sig selv, hvis noget senere skal ændres. Men trick-kodning blev bl.a. fremtvunget af de ældre maskiners stærkt begrænsede lagerkapacitet. Den mangel på plads man kæmpede med medførte, at enhver koder ønskede en så kompakt og kort kode som mulig; man blev det, der i jargon'en hed »halvcellejæger« (fordi en ordre optog en halv lagercelle). Derudspandt sig mange fornøjelige dueller mellem Regnecentralens topkodere, når det gjaldt at forkorte en bestemt ordresekvens med en halvcelle eller to. Det måske bedst kendte eksempel på at ordrer kunne opfattes som tal, har man i det, der hed Wheeler-hoppet (efter David Wheeler i Cambridge). Det drejer sig om, at man i den manøvre, hvor man hopper til et underprogram (eller blot en ordregruppe et andet sted i programmet), lader en ordre opfatte sig selv som et tal, d.v.s. den giver besked via sin egen adressedel om at hente tallet, der står på den plads, den selv er lagret i, og dette tal bringer man fikst med sig og får på den måde oplyst ankomststedet om, hvor man kom fra (NB: beskrivelsen her er ikke udtømmende). Man kan derved hoppe til en programdel, uden at denne på forhånd ved, hvor man kommer fra, og dog blive bragt tilbage igen. Dvs. Wheeler-hoppet kan bruges til at hoppe fra alle mulige steder hen til en og samme standardsekvens; denne får hver gang besked om, hvortil tilbagehoppet skal ske. Dette princip blev i stærkt udviklet form videreført til sekvenshopordren i Gier (hvis maskinkode blev udformet af Krarup og Svejgaard). Mange vil nok til det, der her er skitseret, sige: nå ja, - hvad særligt er der ved det. Men den gang var det lidt af en oplevelse at blive sat ind i, hvordan en automatisk mekanisme på denne elegante måde skaffedes tilveje.
Et særligt kapitel i udviklingen var kompendiet, Lærebog i Kodning for Dask (Chr. Andersen, 1958). Allerede i den sidste del af foråret 1956 var træk fra den fastlagte Dask-kode ved at trænge frem i undervisningen, og det var klart, at fra efteråret 1956 ville der kun blive undervist i Daskkode. I sommeren 1956 så Bech nødvendigheden af, at man hurtigst muligt begyndte at producere materiale til kurset, der skulle starte i september. Han foreslog, at det blev de tre ledere fra den første sæson, der påtog sig arbejdet. Der var noget typisk over optakten hertil. Jeg gik en feriedag ude på Sjælland i en have mellem frodige marker og arbejdede, da Chr. Andersen kom i sin folkevogn med Bech ved siden. Mens jeg endnu støttede mig til redskaberne, og kaffevand blev sat over, og vi talte om, hvor rart alt så ud sådan en sommerdag, kom Bech med sit forslag om, at vi burde tage på os at lave et Dask-kompendium, og at vi nok måtte igang snarest. Jeg mumlede noget om at få tid. Men få, der kender energien hos de to, der stod foran mig, og dertil Bechs specielle overtalelsesevne, er i tvivl om, hvad der blev af en sådan indvending. I august få uger efter holdt vi det første møde og drøftede arbejdets fordeling. Arbejdet strakte sig over 1-2 år, i begyndelsen med ugentlige aftenmøder, hvor vi sammen drøftede, hvad den enkelte havde skrevet. Der blev lagt megen energi i at prøve at gøre ordrelisten så præcis og enkel som mulig; adskillige formuleringer er blevet endevendt under Chr. Andersens ubønhørlige krav til pædagogisk klarhed. Der blev også i fælleskab udfoldet store anstrengelser for at trænge grundigt til bunds i maskinens måde at repræsentere tal på, dens algoritmer for de fire regnearter og ikke mindst problemerne omkring overløb. For eksempel skulle man før hver division prøve, om nævner var numerisk større end tæller, så resultatet numerisk blev mindre end 1. En dag kom Bech og fremsatte den formodning, at resultatet af en division a/b. hvor tæller er numerisk større end nævner, ville blive +(1-|a|)/(1-|b|), hvor fortegnet er det samme som brøken (a/b)'s eget. (Eksempel: (+0.6)/(-0.2) bliver med Dask's divisionsprocedure regnet ud til -0.4/0.8 = -0.5). Det var klart også for Bech selv, at forholdet næppe ville kunne udnyttes fornuftigt i kodningsøjemed. Hvordan denne tanke var opstået, ved jeg ikke, men den viste sig at være korrekt. Jeg har på fornemmelsen, at denne lille divisionsovervejelse var et af de sidste mere matematisk-abstrakte problemer, Bech fik tid til. Han blev mere og mere optaget af ledelsen af Regnecentralen, og i de seneste faser af arbejdet med lærebogen var hans tid i virkeligheden næsten helt helliget andre initiativer og kontakten med den hurtigt voksende stab af faste medarbejdere. Lærebogen blev i løsark benyttet ved kodekurserne 1957-58, men forelå først trykt i september 1958.
Det mest betydningsfulde resultat af den programmeringsaktivitet, der var opstået omkring Dask, var nok »Studiekredsen« (ikke at forveksle med »Studiegruppen for numerisk analyse«, som i 1959 blev startet på Bechs initiativ). Studiekredsen udsprang af Bechs første kodehold og bestod af en gruppe særligt interesserede deltagere, der opmuntret af Bech gik i gang med at udarbejde de på længere sigt uundværlige »hjælpeprogrammer« til Dask. Det drejede sig om matematiske standardprogrammer for kvadratrod, exponential-, logaritme- og cirkulære funktioner etc., og desuden om programmer for flydende regning, der også måtte omfatte programmer til omregning fra fastkomma-tal til flydende tal og tilbage igen. En del af dette programmer udgjorde et kompleks, der ved en ubehjælpsom fordanskning af det svenske »normalläge« betegnedes »Dask Normalleje 1«. Studiekredsen bestod af frivillige, der vederlagsfrit brugte betydelige mængder af fritid på arbejdet, og den omfattede det meste af Regnecentralens senere elite. Jeg nævner i flæng: Jørn Jensen, Per Mondrup, H. B. Hansen og Willy Heise. En af de meget aktive var gruppens alderspræsident, direktør Th. Franck fra NESA. Denne kim til Regnecentralens senere så store programmørstab har sammen med hardwaregruppen æren for, at Danmark, som et af de få lande, har kunnet hævde sig over for edb-giganterne og gennemføre en selvstændig udvikling.
Der er ofte i tekniske og videnskabelige kredse en angst for at komme til at dublere nyskabelser og udviklingsarbejde, og det kan ressourcemæssigt være forståeligt nok. Dette kan have fået selv indsigtsfulde kredse til at sætte spørgsmålstegn ved det rigtige i at give støtte til at lade en selvstændig dansk data-industri vokse op. Her kan jeg ikke tilbageholde min personlige mening om denne filosofi. Hvis dansk edb kun skulle baseres på, hvad der skabes og udvikles hos udenlandske firmaer, måtte alle unge med evner og interesse for faget vælge mellem at drage udenlands for at være med, hvor der virkelig sker noget, eller blive hjemme og nøjes med at forvalte og småforbedre det, der allerede er lavet. Og her er ikke blot tale om den enkeltes personlige tilfredsstillelse. Der ville nemlig samtidig ske det, at man på hjemlig grund ikke havde folk med virkelig dybtgående indsigt, og når alvorlige vanskeligheder opstod, måtte hjælpen hentes langt herfra. Alle med erfaring ved, hvilken kvalitetsforringelse det fører til, at skulle kommunikere over store afstande, fremfor dagligt at omgås eksperterne. Det er nødvendigt i et vist omfang selv at være med i udviklingsarbejdet, hvis man ikke skal blive en provins.
Bechs store indsats for en selvstændig dansk edb-udvikling kan næppe overvurderes. De første spirer hertil var arbejdet omkring kodekurserne, men virkningerne kan idag ses mange steder; f.eks. finder man ved landets uddannelses- og forskningscentre et bemærkelsesværdigt stort antal personer fra kredsen omkring Bech, noget der vidner om rækkevidden af hans virke.