zu www.bildungsgueter.de zur Inhaltsübersicht des Kapitels vorheriger Abschnitt

Der Compiler MARST


Compilierung kleiner Programme

Beispiel 1

begin
  real x, y, z;
  outstring(1, "Berechnung der Hypotenuse eines rechtwinkligen Dreiecks\n");
  outstring(1, "Länge der ersten Kathete:  ");
  inreal(0, x);
  outstring(1, "Länge der zweiten Kathete: ");
  inreal(0, y);
  outstring(1, "Länge = ");
  outreal(1, sqrt(x ** 2 + y*y));
  outstring(1, "\n")
end

Compilierung mit:

marst main.alg -o main.c
gcc main.c -lalgol -lm -o main

Beispiel 2

Der Compiler ist in der Lage, Prozeduren und Funktionen separat zu übersetzen.

Hier wird eine Funktionsprozedur separat definiert und separat compiliert.

real procedure hyp(x, y);
   real x, y;
begin
  hyp := sqrt(x*x + y*y);
end hyp;

In der Datei, in der die separat compilierte Prozedur verwendet werden soll, wird ihre vollständige Spezifikation niedergeschrieben. Ihr Anwendungsblock wird allerdings durch das Schlüsselwort code ersetzt:

real procedure hyp(x, y);
     real x; real y;
   code;
begin

  real x, y, z;
  outstring(1, "Berechnung der Hypotenuse eines rechtwinkligen Dreiecks\n");
  outstring(1, "Länge der ersten Kathete:  ");
  inreal(0, x);
  outstring(1, "Länge der zweiten Kathete: ");
  inreal(0, y);
  outstring(1, "Länge = ");
  outreal(1, hyp(x, y));
  outstring(1, "\n")

end

Compilierung:

marst hyp.alg -o hyp.c
marst main.alg -o main.c
gcc main.c hyp.c -lalgol -lm -o main

Aufbau größerer Programme in einem Projektverzeichnis

...

Beispiel 3

Eine Projektstruktur und das zugehörige Makefile

Makefile

ALGOL       = marst
CC          = gcc
EXTENSION   = alg
SRCDIR      = src
CSRCDIR     = csrc
OBJDIR      = obj
NAME        = main
LDFLAGS     = -lalgol -lm

SOURCES  := $(shell find $(SRCDIR) -name '*.$(EXTENSION)')
CSRC     := $(SOURCES:$(SRCDIR)/%.$(EXTENSION)=$(CSRCDIR)/%.c)
OBJ      := $(SOURCES:$(SRCDIR)/%.$(EXTENSION)=$(OBJDIR)/%.o)


compile: $(NAME)

$(NAME): $(OBJ)
	$(CC) $(OBJ) -o $(NAME) $(LDFLAGS)


$(OBJDIR)/%.o: $(CSRCDIR)/%.c
	mkdir -p $(OBJDIR)
	$(CC) $(INCPATH) $(CFLAGS) -c $< -o $@


$(CSRCDIR)/%.c: $(SRCDIR)/%.$(EXTENSION)
	mkdir -p $(CSRCDIR)
	$(ALGOL)  $< -o $@


clean:
	rm -f $(OBJDIR)/*.o
	rm -f $(CSRCDIR)/*.c
	rm -f $(NAME)

.SECONDARY: $(CSRC)
.PHONY: clean

Verzeichnisse

Dateien im Verzeichnis src

main.alg

real procedure hyp(x, y);
     real x; real y;
   code;
begin

  real x, y, z;
  outstring(1, "Berechnung der Hypotenuse eines rechtwinkligen Dreiecks\n");
  outstring(1, "Länge der ersten Kathete:  ");
  inreal(0, x);
  outstring(1, "Länge der zweiten Kathete: ");
  inreal(0, y);
  outstring(1, "Länge = ");
  outreal(1, hyp(x, y));
  outstring(1, "\n")

end

hyp.alg

real procedure hyp(x, y);
   real x, y;
begin
  hyp := sqrt(x*x + y*y);
end hyp;

vorheriger Abschnitt zur Inhaltsübersicht des Kapitels