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:
- C-c C-c Kompilerar en modul.
(Motsvarande UNIX-kommando är
mcc
modul.)
- C-c C-l Kompilerar och länkar ett program.
Gå först till programmodulen om programmet består av flera moduler.
(Motsvarande UNIX-kommando är
mcp
programmodul.)
- C-c C-e Flyttar markören till nästa fel, om det blev fel
i kompileringen.
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.
- Kopiera filen till ditt bibliotek.
- Kompilera programmet.
- Rätta felen.
- Kompilera om programmet.
- Kör programmet för några olika indata.
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:
- Skriv ett program som läser tre heltal och avgör om
ett av talen är summan av de andra.
Programmet skall ge utskriften ingen summa! om inget
av talen är summan av de andra och till exempel
23 + 45 = 68 om 23, 45 och 68 är de
tre heltalen.
- Skriv ett program som läser ett heltal och avgör om
detta är ett primtal.
- Skriv ett program som skriver ut alla tal mindre än 200 som
är primtal.
- Skriv ett program som ritar en brownsk rörelse. Man får en
sådan genom upprepade gånger gå rakt fram en slumpmässig
sträcka och svänga en slumpmässig vinkel.
Tips: för att
rita linjer kan man använda modulen TurtleGraphics som
beskrivs i Appendix F i läroboken. För att få slumpmässiga
tal kan man använda modulen RandomModule. Båda modulerna
finns i biblioteket /users/mdstud/naptv/ModulaLib.
Märk: när man länkar program som använder modulen
TurtleGraphics måste man lägga till -lX11 sist
på kommandoraden.
Märk: TurtleGraphics-modulen
fungerar tyvärr inte för närvarande (950403).
- Skriv ett program som spelar spelet Hi-Lo.
I detta spel spelar en användare mot datorn.
Datorn väljer slumpvis
(Tips: Titta efter en biblioteksmodul
RandomModule
i biblioteket
/usr/lic/Mocka/reuse
ett tal mellan 1 och 100, och
användaren skall på så få gissningar som
möjligt ta reda på talet.
Efter varje gissning meddelar datorn om man gissade rätt,
för lågt eller för högt.
En körning av programmet kan se ut på följande
sätt:
Välkommen till spelet HI-LO.
Jag tänker på ett tal mellan 1 och 100. Vilket? 50
50 är för stort, försök igen! 25
25 är för litet, försök igen! 37
37 är korrekt!! Du behövde 3 gissningar.
Med en optimal strategi behöver man inte så många gissningar
för att komma fram till rätt svar. Hur många? Varför?