home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Global Amiga Experience
/
globalamigaexperience.iso
/
compressed
/
development
/
clusterdemo.dms
/
clusterdemo.adf
/
Sprachreport.lha
/
Cluster-Features
< prev
next >
Wrap
Text File
|
1993-03-08
|
7KB
|
181 lines
Cluster weist gegenüber Modula folgende Abweichungen auf (ModulaII-Programme
können dennoch übersetzt werden):
- Funktionen können komplexe Typen als Rückgabewerte haben, wie
Records oder Arrays
-Funktionen können sogar offene Typen wie z.B. Strings
zurückgeben, 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 Länge als Word
an erster Position, wobei das terminierende Null-Byte nicht in der
Länge 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 Länge, z.B. besonders schnelle Stringvergleiche.
-CASE wurde eliminiert und zu einem Unterfall von IF (IF KEY)
gemacht. Damit wurde auch der OF-Operator für alle
Bedingungen zugänglich (z.B. IN IF,WHILE,REPEAT). Im gegensatz zu
Modula können 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
überflüssig wird. Außerdem kann man eine WHILE-Bedingung
durch das Schlüsselwort 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 können nicht nur einen BEGIN-Teil sondern auch einen
CLOSE-Teil besitzen, welcher am Programmende, sowie bei
einem Absturz aufgerufen wird, somit entfallen die lästigen
TermProceduren um z.B. ein File oder ein Fenster am Ende zu
schließen.
-Ein Punkt, der vor allem C-Programmierer bisher von Modula
abgehalten hat, nämlich die ewig Langen Importlisten am
Programmanfang, wurde entschärft, 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.
Außerdem kann man auch innerhalb Prozeduren Module
importieren.
Bei unqualifiziertem Import kann der Name des Moduls
geändert werden, so daß das stereotype wiederholen eines
langen Modulnamens entfällt.
-Es besteht die Möglichkeit erweiterbare Records zu
definieren. Wobei Erweiterungen zu ihren Vätern
zuweisungskompatibel bleiben.
-Konstanten von komplexen Typen sind möglich, so kann man
beim öffnen einer Screen, direkt eine Konstante vom Typ
NewScreen an OpenScreen übergeben.
-Es können offene Arrays als Typen deklariert werden. Von
diesen Typen, können 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 für Pointer und Arrays. "With`t" man eine Variable
einfachen Typs, wird diese im Bereich der WITH-Anweisung in
ein Prozessorregister gelegt, was natürlich einen enormen
Geschwindigkeitsgewinn zur Folge hat.
-Variablen und Prozedur-Parameter können als
Registervariablen definiert werden.
-Die Conditioncodes des Prozessors können 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 Abstürze.
-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 Variablenübergabe durch
Schlüsselwörter
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 Aufzählungstypelementen. 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 Verwalltungsüberaufwand.
-Objektorientierte Elemente: Klassen, Objekte, Methoden,
Vererbung, Generizität, dynamisches Binden, Mehrfacherben etc.
Nach dieser Aufzählung 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 erhält man trotz großer
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 können
direkt aus dem Editor aufgerufen werden, man kann also aus
dem Editor Programme compilieren, maken, linken, oder
starten.
-Cluster bietet die Möglichkeit der bedingten Compilierung,
d.h. Sie können durch Flags festelegen, welche Programmteile
übersetzt werden sollen. Zum Beispiel wenn Sie ein Programm
in einer Englischen und einer Deutschen Verion herstellen
wollen, müssen Sie nur ein Flag umsetzen und neu
Compilieren.
Nähere Informationen entnehmen Sie bitte dem Sprachreport.