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

Inledning

Denna laboration är avsedd att introducera programspråket Modula-2 och den programmeringsmiljö som finns för Modula 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 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.

Kompilering av programmoduler

Om hela programmet finns i en programmodul är det väldigt enkelt att producera en exekverbar fil med hjälp av kompilatorn. I kursbiblioteket /users/mdstud/naptv finns en fil sum.mod med en programmodul Sum som räknar ut summan av serien 0+1+2+...+n. Programmet är lite slarvigt skrivit så det innehåller några fel som du måste rätta innan kompilatorn producerar en exekverbar fil.

Fördefinierade moduler

Olika implementeringar av Modula 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 biblioteket /usr/lang/SC1.0/modula2/src/ (Anm: om inte detta fungerar, prova /usr/lang.old/...). 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, String och MathLib.

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 det naturligvis inte nödvändigt att kompilera om mer än den delen.

I kursbiblioteket finns ett speciellt bibliotek ModulaLib med Modula-moduler. Bland annat finns två filer som implementerar en modul Func som innehåller två funktioner som beräknar fakultet och fibonacci funktionerna. Namnet på funktionerna samt typerna på argument och result ser man i definitionsmodulen, denna finns i filen Func.def (namn på filer med definitionsmoduler skall alltid sluta på .def.) När man kompilerar en definitionsmodul så hamnar resultatet i file.sym. Implementeringen av Func-modulen finns i filen Func.mod som ni inte kan läsa(!) men ni kan läsa filen Func.o som innehåller objektkoden för modulen. Skriv en programmodul som använder funktionen i Func-modulen och skriver ut en tabell med funktionernas värde för argumenten 1 till 10!

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 Func-modulen till en exekverbar fil.

Om man importerar en modul i ett program letar kompilatorn normalt i samma bibliotek samt i ett 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.mod och lägga alla modulerna i samma bibliotek. Två flaggor till kompilatorn modifierar var kompilatorn letar efter importerade moduler:

-Mdir
Specificerar att kompilatorn även skall leta i biblioteket dir. OBS! inget mellanslag mellan M och biblioteksnamnet.
-m module:file
Specificerar att modulen module finns i filen file (dvs. i file.def, file.mod, file.sym och file.o).

Ett litet Modula-program

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