Der ewige Kampf gegen Redundanzen

Formelübersetzung

Anfangs dominierten technisch-wissenschaftliche Berechnungen die Computeranwendungen. Wie wir in den Wörtern 2050.2053 des Z22-Beispiels sehen, benötigte jedoch schon eine einfache Addition drei Befehle. Für die Formel (a+b)*(a-b) wären schon ungefähr sieben Befehle nötig. Daher entstand schnell der Bedarf, Formelberechnungen zu vereinfachen. Es entstanden Formeln mit Variablenbuchstaben, Konstanten, Operatorzeichen, Operatorprioritäten und Klammern. Die Programmiersprache Fortran hat daher ihren Namen (Formula Translator). Fortran I wurde 1956 definiert. Es gab damals jedoch noch keine Möglichkeit, eigene Operatoren zu definieren.

Unterprogramme

Wenn eine Befehlsfolge mehrfach identisch benötigt wurde, konnte man bei der Zuse 22 von verschiedenen Programmstellen aus mittels des Rufbefehls F dorthin springen. Neben dem eigentlichen Sprung lud dieser Befehl auch einen Rücksprungbefehl in das Register 5. Daher musste man ein Unterprogramm damit beginnen, den Inhalt von Register 5 mittels U ans Ende des Unterprogramms zu speichern, sodass beim Erreichen des Endes automatisch zur Aufrufstelle zurückgesprungen würde. Oft jedoch wird keine identische, sondern nur ähnliche Verarbeitung benötigt. In diesem Fall galt im Freiburger Code die Konvention, vor dem Unterprogramm Zellen für zu übergebende Argumente und Ergebnisse freizuhalten. Sie mussten vom Aufrufer vor dem Rufbefehl gefüllt beziehungsweise danach abgeholt werden. Dann musste er zum ersten Befehl des Unterprogramms springen, der immer B5 gefolgt von U mit der Adresse der letzten Befehlszelle des Unterprogramms sein musste. Das Programm aus Listing 1 als Zuse23-Unterprogramm mit der Einsprungsadresse SUMIR zur Aufsummierung der Ganzzahlen von 1 bis n lautet also wie in Listing 2.

Listing 2
T2048T
(N) 10'
(SUMME) 0'
(SUMIR) B5
U(RUECK)
B(SUMME)
A(N)
U(SUMME)
B(N)
SC1
U(N)
PPE(SUMIR)
(RUECK)Z0

Um die Summe der Zahlen von 1 bis 20 auszudrucken, könnte man SUMIR wie folgt aufrufen: BC20 U(N) F(SUMIR) B(SUMME) D. Was hier als Konvention beachtet werden musste, ist heute mit dem Konzept des Unterprogrammaufrufs mit Argumentliste und Rückgabewert in allen höheren Programmiersprachen automatisiert. Fortran II und Algol führten das Konzept benannter, parametrierter Unterprogramme etwa zeitgleich 1958 ein. Die Möglichkeiten zur Redundanzvermeidung waren enorm und führten zum Stil der prozeduralen Programmierung. Ein Unterprogramm in Fortran II zur Summierung der Zahlen von1 bis n mittels einer Zählschleife ist in Listing 3 zu sehen. (Regeln: Bezeichner maximal 6 Zeichen, der Anfangsbuchstabe bestimmt den Typ, Schlüsselwörter hier sind FUNCTION, DO, RETURN und END.)

Listing 3
C     LIEFERT SUMME DER ZAHLEN VON 1 BIS N
      FUNCTION ISUMUP(N)
      ISUM = 0
      DO 99 I = 1, N
  99  ISUM = ISUM + I
      ISUMUP = ISUM
      RETURN
      END
Steuerstrukturen

Das Bauelement, mit dem Programme ihre hohe Flexibilität und Wiederverwendbarkeit erhielten, waren bedingte Sprünge wie der PPE-Befehl von der Zuse 22. Durch bedingte Vorwärtssprünge konnten Fallunterscheidungen realisiert werden. Durch einen bedingten Rückwärtssprung konnte man eine irgendwann abbrechende Wiederholung programmieren. Durch die Kombination dieser Möglichkeiten ließen sich im Prinzip beliebig komplexe Algorithmen formulieren. Da Fallunterscheidungen und abbrechbare Wiederholungen mit oder ohne Laufvariable äußerst häufig benötigt wurden, führten die vorherrschenden Programmiersprachen entsprechende Konstrukte ein. In Fortran I (1957) konnte man die Ganzzahlen von 1 bis n mittels folgender Zählschleife aufsummieren:

      ISUMME = 0
      DO 99 I = 1, N
   99 ISUMME = ISUMME + I
C  HIER ENTHAELT ISUMME DIE SUMME DER ZAHLEN VON 1 BIS N

Fortran hatte eine halbsymbolische Adressierung. Eine Anweisung konnte mit einer frei wählbaren Zahl markiert sein, einer so genannten Marke (Label). Die Anweisung DO 99 I = 1, N zählte die Laufvariable I von 1 bis N, wobei alle Anweisungen bis einschließlich der mit 99 markierten wiederholt wurden. Für Fallunterscheidungen stand das Arithmetische IF zur Verfügung: IF (expression) negativeLabel,zeroLabel,positiveLabel. Je nach dem Vorzeichen des Ausdrucksergebnisses wurde zu einer der drei aufgezählten Marken gesprungen. In Algol 60 tauchten schon heutzutage übliche Steuerstrukturen auf (Schlüsselwörter üblicherweise in Apostrophe eingeschlossen):

  1. Das zu Vielfachverzweigungen kaskadierbare IF: ‚if‚ cond ‚then‚ expr ‚else‚ expr
  2. Eine universelle Schleife mit Laufvariable, zum Beispiel: for‚ i := 1 ‚step‚ 1 ‚until‚ 100 ‚do‚ print(i) gibt die Zahlen von 1 bis 100 aus. for‚ i := 1, i*2 ‚while‚ ido‘ print(i) gibt die Zweierpotenzen von 1 bis 1024 aus.

Moderne Steuerstrukturen mit dem Ziel, auf Sprunganweisungen ganz verzichten zu können, wurden von Pascal (1970) eingeführt. Pascal unterschied insbesondere die vorprüfende WHILE-Schleife, die nachprüfende REPEAT-Schleife und die Zählschleife. Dennoch enthielt Pascal noch die GOTO-Anweisung, da nichtlokale Schleifenabbrüche ohne diese nicht möglich waren. Die WHILE-Schleife, gedacht für Wiederholungen, bei denen die Anzahl der Durchläufe nicht von vornherein bekannt ist, führt jedoch zu Redundanzen im folgenden, äußerst praxisrelevanten Fall: Es soll eine vorher unbekannte Anzahl von Elementen, möglicherweise auch 0 Elemente verarbeitet werden. In Listing 4 werden positive Zahlen eingelesen und es wird deren Summe ausgegeben. Die Prozedur lesen liefere -1, wenn sie keine weitere Zahl finden kann. Die Schlüsselwörter sind hier groß geschrieben, obwohl das in Pascal irrelevant ist. Wir sehen, dass die Prozedur lesen redundant aufgerufen werden muss: einmal vor der WHILE-Schleife, zum anderen am Ende des Schleifenrumpfes, damit die Variable x für die nächste Fortsetzungsprüfung vorbereitet ist.

Listing 4
VAR
    x: integer;
    summe: integer := 0;
BEGIN
    lesen(x);
    WHILE x>0 DO BEGIN
        summe := summe + x;
        lesen(x);
    END;
    writeln;
    writeln('Die Summe ist ', summe, '.');
END
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.