Cluster weist gegenber Modula folgende Abweichungen auf (ModulaII-Programme
knnen dennoch bersetzt werden):

- Funktionen knnen komplexe Typen als Rckgabewerte haben, wie
  Records oder Arrays

-Funktionen knnen sogar offene Typen wie z.B. Strings
zurckgeben, auch als Parameter an VAR-Parameter. z.B.
Str3:=Concat(Seg(str1,4,5),Seg(str2,6,7));

-Strings sind nicht nur als ARRAY OF CHAR mit einem Null-Byte am
Ende definiert, sondern als RECORDs mit der Lnge als Word
an erster Position, wobei das terminierende Null-Byte nicht in der
Lnge enthalten ist:

STRING  = RECORD
       len  : INTEGER;
       data : ARRAY OF [0..MAX] CHAR
     END

Diese Definition bietet viele Vorteile, da man, je nachdem, ob
man alle Zeichen eines Strings auf eine bestimmte weise behandeln will
(z.B. kopieren), oder ob man eine String parst (z.B. umwandlung in eine Zahl
jeweils die schnelleste Methode verwendenkann, entweder suche nach dem Null-Byte,
oder eine FOR-Schleife ber die Lnge, z.B. besonders schnelle Stringvergleiche.

-CASE wurde eliminiert und zu einem Unterfall von IF (IF KEY)
gemacht. Damit wurde auch der OF-Operator fr alle
Bedingungen zugnglich (z.B. IN IF,WHILE,REPEAT). Im gegensatz zu
Modula knnen sowohl bei IF KEY, als auch bei OF als Vergleichswerte oder
-schranken nicht nur Konstanten sondern auch Variablen verwendet werden.

-Die IF THEN END wurde um ein AND_IF erweitert, das einen
eigenen ELSE-Fall haben kann.

-Ebenfalls wurde die WHILE Struktur um ein OR_WHILE sowie ein
ELSE erweitert, womit die Verwendung von LOOP so gut wie
berflssig wird. Auerdem kann man eine WHILE-Bedingung
durch das Schlsselwort KEY wie ein CASE aufbauen, wobei der
ELSE-Fall den Aussprung aus der Schleife bewirkt. Dadurch
konnte im gesammten Kompiler ein LOOP vermieden werden.

-Module knnen nicht nur einen BEGIN-Teil sondern auch einen
CLOSE-Teil besitzen, welcher am Programmende, sowie bei
einem Absturz aufgerufen wird, somit entfallen die lstigen
TermProceduren um z.B. ein File oder ein Fenster am Ende zu
schlieen.

-Ein Punkt, der vor allem C-Programmierer bisher von Modula
abgehalten hat, nmlich die ewig Langen Importlisten am
Programmanfang, wurde entschrft, indem sich mehrere
Bezeichner in einem Definitions-Modul zu einer Importgruppe
zusammenfassen lassen, dabei kann eine Gruppe auch
Bezeichner aus fremden Modulen sowie andere Gruppen
enthalten. Importiert man von einem anderen Modul eine
Gruppe, importiert man damit auch alle darin enthaltenen
Bezeichner.
Auerdem kann man auch innerhalb Prozeduren Module
importieren.
Bei unqualifiziertem Import kann der Name des Moduls
gendert werden, so da das stereotype wiederholen eines
langen Modulnamens entfllt.

-Es besteht die Mglichkeit erweiterbare Records zu
definieren. Wobei Erweiterungen zu ihren Vtern
zuweisungskompatibel bleiben.

-Konstanten von komplexen Typen sind mglich, so kann man
beim ffnen einer Screen, direkt eine Konstante vom Typ
NewScreen an OpenScreen bergeben.

-Es knnen offene Arrays als Typen deklariert werden. Von
diesen Typen, knnen Konstanten gebildet, Zeiger darauf
definiert, Parameter von Prozeduren deklariert, oder ein
anderer Typ mit fester Elementanzahl definiert werden, wobei
dieser Typ zu dem offenen Typen kompatibel ist.

-WITH kann nicht nur auf Records angewendet werden, sondern
auch fr Pointer und Arrays. "With`t" man eine Variable
einfachen Typs, wird diese im Bereich der WITH-Anweisung in
ein Prozessorregister gelegt, was natrlich einen enormen
Geschwindigkeitsgewinn zur Folge hat.

-Variablen und Prozedur-Parameter knnen als
Registervariablen definiert werden.

-Die Conditioncodes des Prozessors knnen direkt abgefragt
werden z.B:

   REPEAT
     DEC(i)
   UNTIL = ;

Diese Schleife wird solange durchlaufen bis das ZeroFlag
gesetzt wird. Sollte man nur in Low-Level-Modulen verwenden.


-Liegt eine Pointer-Variable in einem Register, kann man
direkt den Postincrement- bzw. den Predecrement-Mode des
MC-68000 verwenden: p1+^:=p2+^. Ebenfalls besser in Low-Level-Modulen
kapseln.

-Laufzeitfehler werden mit Quelltextangabe gemeldet und
verursachen keine Abstrze.

-Automatische Variableninitalisierung, sowohl auf Modul als auch
auf Prozedurebene. Statische Variablen in Prozeduren, erlauben
ein sauberes Geheimnissprinzip.

VAR i :  INTEGER := 10;
    q := ARRAY OF INTEGER:(0,1,2,3,4,5,6,7);

-Vorinitialisierte Prozedurparameter, und Variablenbergabe durch
Schlsselwrter

PROCEDURE Bla(x,y : INTEGER := 0);
...

Bla;Bla(1);Bla(y:=10);Bla(1,2)...


-Prozeduren mit beliebiger Anzahl von bergabeparametern.

PROCEDURE Concat(REF strs : LIST OF STRING):STRING;
...

WriteString(Concat("Bla bla",Text,"Dummer Text..."));

-berladen von Aufzhlungstypelementen. Der effektive Wert wird
aus dem Kontext oder durch Qualifizierung ermittelt.

TYPE a = (Apfel,Birne,Kirsche)
     b = (Banane,Pflaume,Birne);

-Exceptionhandling durch TRY...EXCEPT und RAISE/ASSERT.

-Resourcetracking durch Contexte und TRACK...END erlaubt saubere
programmierung, ohne Gefahr und Verwalltungsberaufwand.

-Objektorientierte Elemente: Klassen, Objekte, Methoden,
Vererbung, Generizitt, dynamisches Binden, Mehrfacherben etc.


Nach dieser Aufzhlung von Abweichungen, die Sie gewi auch als
Vorteile Anerkennen werden noch ein paar Worte zu Cluster
allgemein:

-Durch Ausnutzung der obengenannten maschinennahen Elementen,
sowie durch verwendung spezieller 68XXX-Befehle (z.B.
MOVEM,CMPM), durch Peephole-Optimizing und durch optimierung
auf Short-Branches, erreicht der Compiler auf einem normalen
Amiga ,ohne Turbokarte, mit FastMem, ber 1600 Dhrystones/s.
Auf einem Amiga mit 33MHz 68030 erreicht er 13000 Dhrystones/s.

-Cluster kann reentrante Programme im kleinen Datenmodell
sowie Libraries und Devices erzeugen.

-Der Compiler ist ein schneller Single-Pass-Compiler (ca 6000
Zeilen pro Minute.

-Der Linker linkt selektiv, d.h. nur Objekte, die benutzt
werden, werden eingelinkt. Somit erhlt man trotz groer
Module sehr kompakte Programme.

-Cluster besteht aus einer integrierten Entwicklungsumgebung,
diese besteht aus einem schnellen
Editor (Macros, mehrere Textfenster, Blockfunktionen,
Iconify, eigene Tastaturbelegung, Tabindent), dem Compiler,
einem Make, sowie einem Loader. Alle Funktionen knnen
direkt aus dem Editor aufgerufen werden, man kann also aus
dem Editor Programme compilieren, maken, linken, oder
starten.

-Cluster bietet die Mglichkeit der bedingten Compilierung,
d.h. Sie knnen durch Flags festelegen, welche Programmteile
bersetzt werden sollen. Zum Beispiel wenn Sie ein Programm
in einer Englischen und einer Deutschen Verion herstellen
wollen, mssen Sie nur ein Flag umsetzen und neu
Compilieren.

Nhere Informationen entnehmen Sie bitte dem Sprachreport.