Programmering för Naturvetare, vt-95
Institutionen för Datavetenskap, CTH & GU
Thomas Hallgren

Laboration 4: Modula-2, Kompilering och Länkning

Denna laboration innehåller en uppgift som ska redovisas.

Inledning

Denna laboration är avsedd att introducera programspråket Modula-2 och den programmeringsmiljö som finns för Modula-2 på MC:s arbetsstationer. Ni skall få se hur kompilatorn och länkaren fungerar samt skriva ett mycket enkelt Modula-2 program.

De saker som är helt nya från ML-delen är naturligtvis språket Modula-2 samt användandet av en kompilator. Redigering av program emacs och Unix i allmänhet förutsätter jag vara skåpmat.

Information om Modula-2-kompilatorn och länkaren finns i DATORHANDBOK FÖR DATORANVÄNDARE VID MATEMATISKT CENTRUM samt i manualbladen. (En utförlig beskriving finns i användarmanualen till kompilatorn.)

1. Kompilering av programmoduler

Redigerar man programmet i emacs är det väldigt enkelt att producera en körbar fil. När man öppnar Modula-2-filer får man tillgång till diverse knapptryckningar för kompilering mm: I biblioteket ~naptv/Modula2 finns en fil sum.mi med en programmodul Sum som räknar ut summan av serien 0+1+2+...+n. Programmet är lite slarvigt skrivet så det innehåller några fel som du måste rätta innan kompilatorn producerar en körbar fil.

2. Fördefinierade moduler

Olika implementeringar av Modula-2 innehåller olika fördefinierade moduler som man kan importera och använda. För att se vilka funktioner, procedurer och variabler som dessa fördefinierade moduler innehåller kan man titta i motsvarande definitionsmoduler. De fördefinierade definitionsmodulerna för den implementering som vi använder finns i biblioteken /usr/lic/Mocka/lib och /usr/lic/Mocka/reuse Titta vilka fördefinierade moduler som finns och vilka funktioner och procedurer dessa innehåller. Se bland annat efter vilka funktioner och procedurer som definieras i modulerna InOut, Strings och MathLib.

3. Separatkompilering av moduler

Om ett program finns utspritt i flera moduler är det lite mer arbete att tillverka en exekverbar fil. Alla delarna måste nu översättas till objektkod innan man kan länka ihop dem till en exekverbar fil. Om man upptäcker fel i någon del så räcker det att kompilera om mer än den delen. Kompilatorn håller själv reda på detta och kompilerar inte fler moduler än nödvändigt.

I kursbiblioteket finns ett speciellt bibliotek ModulaLib med Modula-moduler. Bland annat finns det filer som implementerar en modul Pizza som innehåller en procedur som skriver ut pizzor med omsorgsfullt utvalda ingredienser. Namnet på proceduren samt typerna på argument och resultat ser man i definitionsmodulen, denna finns i filen Pizza.md (namn på filer med definitionsmoduler skall alltid sluta på .md.) När man kompilerar en definitionsmodul så hamnar resultatet i file.d. Implementeringen av Pizza-modulen finns i filen Pizza.mi som ni inte kan läsa(!) men ni kan "läsa" filen Pizza.o som innehåller objektkoden för modulen.

Uppgift: Skriv en programmodul som använder proceduren i Pizza-modulen och skriver några pizzor.

Separatkompilera er programmodul så att ni får en .o-fil och när programmet blivit felfritt länkar ni ihop de separat översatta delarna med objektkod för programmet och Pizza-modulen till en exekverbar fil.

Om man importerar en modul i ett program letar kompilatorn normalt i samma bibliotek samt några standardbibliotek efter en fil som heter samma som modulen. Det är därför lämpligt att alltid spara en modul som heter namn i en fil namn.mi och lägga alla modulerna i samma bibliotek.

Med de inställningar som gjort för denna kurs leter kompilatorn automatiskt i biblioteken /usr/lic/Mocka/lib, /usr/lic/Mocka/reuse samt ~naptv/ModulaLib.

Redovisning

(Detta är den enda uppgiften som behöver redovisas i denna lab.) Kör ditt pizza-program som du tillverkat i uppgiften ovan. Lägg in de utskrivna pizzorna dokumentationsfilen i inlämningskatalogen och rapportera med kommandot rapportera 4.

Eftersom denna uppgift är ganska liten, och för att du ska få svar snabbt, rättas denna uppgift av en helt datoriserad, och därför tyvärr lite petig, labrättare. Det är därför viktigt att pizzautskrifterna tas med i dokumentationsfilen precis som de skrivs ut av programmet. Den först utskrivna pizzan är viktigast och måste stå först.

4. Ett litet Modula-program

Skriv ett litet Modula-program för att lösa någon eller några av följande problem: