Kommentare innerhalb eines Pascalprogrammes dürfen beliebige Zeichenfolgen enthalten. In Pascal 2.0 haben Kommentare, die direkt nach der öffnenden Kommentarklammer mit einem Dollarzeichen beginnen, eine Steuerfunktion für den Übersetzungsvorgang:
(* $ Dies ist ein normaler Kommentar *) (*$R+ Dieser Kommentar schaltet die Bereichsüberprüfung ein *)
Ein aktiver Kommentar kann auch mehrere Optionen ein- und ausschalten. Dazu müssen die Schlüsselbuchstaben durch Kommata (ohne Leerstellen) getrennt aufgeführt werden:
(*$R+,C-,P+ range-check ein, post-mortem-chain aus, parameter-check ein *)
Die Wirkung eines aktiven Kommentars gilt für alle nachfolgenden Quelltextzeilen (auch innerhalb von Include-Files), bis ein gegenteiliger aktiver Kommentar gelesen wird.
Bei Stringzuweisungen, Parameterübergabe von Strings und allen Parametern der Standardprozeduren wird immer eine Bereichsüberprüfung auf gültige Werte vorgenommen. Auch die Ergebnisse arithmetische Operationen mit reellen und ganzen Zahlen werden immer auf Überschreitung des darstellbaren Zahlenbereiches geprüft.
Der Compiler besitzt einen Schalter, mit dem die Erzeugung von Code für zusätzliche Laufzeittestes gesteuert werden kann. Beim Beginn der Übersetzung ist der Schalter standardmäßig auf aus gestellt. Nach einem aktiven Kommentar der Form
(*$R+ *)
Beispiel: Bei Zuweisungen von Werten des Typs INTEGER an die Variable
X wird geprüft, ob der Wert außerhalb des Bereiches 1900 bis
1986 liegt:
werden auf gültige Werte von A und B (d.h. ORD(A) und ORD(B) aus
dem Bereich 0 bis 95) geprüft.
Beispiel:
Beispiel:
Beispiel:
Tritt in einem dieser Fälle ein ungültiger Wert auf, so wird
die Programmausführung mit der Fehlermeldung
abgebrochen. Dabei stellen x, low und high die Ordinalwert des fehlerhaften
Wertes, der unteren und der oberen Bereichsgrenze dar.
Beispiel:Nach der obigen Deklaration der Variablen WOTAG wird bei
der ungültigen Zuweisung WOTAG:= SAMSTAG folgende Fehlermeldung ausgegeben:
Es gilt nämlich:ORD(SAMSTAG) = 5
ORD(MONTAG) = 0
ORD(FREITAG) = 4
Durch das Einschalten der Bereichsüberprüfungsoption wächst
die Codegröße und Programmlaufzeit nur minimal. Zumindest während
der Programmentwicklung sollten Sie daher diese Option wählen, um verborgene
illegale Zuweisungen festzustellen.
Nach dem aktiven Kommentar
wird die standardmäßig eingeschaltete Typüberprüfung
für Stringvariablenparameter so gelockert, daß aktuelle Parameter
länger als die formalen Parameterstrings sein dürfen. Um wieder kompatibel
zum report zu sein, kann die Parameterüberprüfung anschließend
wieder mit
eingeschaltet werden.
Beispiel:
Standardmäßig erzeugt der Compiler Pascal 2.0 für jeden
Block Code, um im Falle einer Fehlermeldung zur Programmlaufzeit die dynamische
Aufrufkette (dynamic chain) anzuzeigen. In Abschnitt 4.3.3 wurde folgendes
Beispiel einer Laufzeitfehlermeldung gegeben.
Für jeden Block (Hauptprogramm, Prozedur, Funktion) wird ihr Name einmal
gespeichert. Möchten Sie diesen Speicherplatz einsparen, oder einem Benutzer
Ihrer übersetzten Programme keinen Einblick in die Programmstruktur geben,
so können Sie den Schalter zur Speicherung der Namen auf aus
stellen:
Dieser aktive Kommentar muß vor dem Programm-, Prozedur- oder Funktionskopf
stehen, um für einen Block gültig zu sein. Sie können den Schalter
auch selektiv für einzelne Blöcke ein- und ausschalten, dann treten
in der dynamic-chain teilweise Fragezeichen »?« als Blocknamen
auf:
Beispiel:
Die Division durch Null führt zur folgenden Fehlermeldung:
Wie bereits in den vorangegangenen Abschnitten erwähnt, kann der Compiler
Teile des Quelltextes bei der Übersetzung von Diskette lesen. Dies ist
immer dann notwendig, wenn die Größe des Quelltextes eine Größe
von 22 KByte überschreitet. Aber auch um logisch zusammengehörige
Teile zusammenzufassen, oder um den Quelltext überschaubar zu halten, bietet
sich die Auslagerung von Texten in Include-Files an.
Um Include-Files effizient zur Modularisierung von Programmen einsetzen zu
können, ist in Pascal 2.0 die Reihenfolge der Deklarationsteile
beliebig. Außerdem kann jeder Deklarationsteil beliebig oft auftreten.
Somit können Sie im Vereinbarungsteil des Hauptprogrammes Include-Files
aufrufen, die jeweils Konstanten, Typen, Variablen und Prozeduren exportieren..
Erreicht der Compiler bei der Übersetzung einen aktiven Kommentar, der
direkt nach dem Dollarzeichen einen Filenamen in Anführungszeichen enthält,
so wird das Ende dieser Zeile ignoriert und ab dieser Stelle der Programmtext
von dem File »TURTLE.INC« auf der eingelegten Diskette gelesen.
Am Dateiende setzt der Compiler die Übersetzung mit der Folgezeile im Arbeitsspeicher
fort.
Include-Files sind normale Quelltexte, die mit den primary- commands
SAVE oder END des Editors auf Diskette gespeichert wurden. In einem Programm
können beliebig viele Include-Files aufgerufen werden. Außerdem kann
auch in einem Include-File ein anderes Include-File aufgerufen werden. Jedoch
sind keine Schachtelungen möglich, da der Compiler am Ende eines Files
immer zur Übersetzung aus dem Speicher zurückkehrt.
Der Schalter für Bereichsüberprüfung kann mit dem folgenden
aktiven Kommentar wieder auf aus geschaltet werden:
VAR X,Y: 1900..1986;
(*$R+ *)
X:= X + 30;(* Ergebnis wird geprüft *)
X:= 2000; (* --> Laufzeitfehler *)
READ(X); (* Eingabe wird geprüft *)
X:= Y; (* keine Prüfung *)
FOR X:= X+4 TO Y DO
(* nur der Startwert wird *)
(* geprüft *)
(*$R- *)
X:= 2000;(* keine Prüfung *)
[A] [A..B] und B IN X
VAR S,T: SET OF CHAR;
C : CHAR;
(*$R+ *)
S:= ['A'..'Z'];(* wird überprüft *)
S:= S + ['a'..'z'];(* --> Laufzeitfehler, da *)
(* ORD('a')>96 ist *)
S:= [CH];(* wird überprüft *)
IF CH IN S THEN ...(* CH wird überprüft *)
(*$R- *)
IF 'a' IN S THEN ...(* wird nicht überprüft, *)
(* das Ergebnis ist FALSE *)
TYPE INDEX: -30..30;
VAR F: ARRAY[INDEX] OF CHAR;
S: STRING;
T: STRING[30];
X: INTEGER;
I: INDEX;
(*$R+ *)
F[3]:= 'X'; (* wird geprüft *)
WRITE(F[I]); (* keine Prüfung *)
IF F[X]='1' THEN ...(* X wird geprüft *)
F[50]:= F[1];(* --> Laufzeitfehler *)
S[80]:= 'c';(* wird geprüft (OK) *)
S[I]:= CHR(5);(* wird geprüft *)
T[80]:= 'c'; (* --> Laufzeitfehler *)
VAR TAG: (MONTAG,DIENSTAG,MITTWOCH,DONNERSTAG,FREITAG,
SAMSTAG,SONNTAG);
WOTAG: MONTAG..FREITAG;
X : INTEGER;
(*$R+ *)
TAG:=SUCC(TAG)); (* wird geprüft *)
WOTAG:= TAG;(* wird geprüft *)
WOTAG:= SUCC(WOTAG);(* wird geprüft *)
TAG:= SUCC(WOTAG);(* wird geprüft *)
X:= SUCC(X);(* Zuweisung wird geprüft *)
VALUE OUT OF BOUNDS: xlowhigh
VALUE OUT OF BOUNDS: 5 0 4
(*$R- *)
4.4.6.2 Parameterüberprüfung
Pascal 2.0 erlaubt eine Lockerung der Typüberprüfung für
Variablenparameter des Typs STRING. Durch die Speicherungsform von Strings ist
es nämlich sinnvoll, an eine Prozedur oder Funktion als aktuellen Parameter
eine Stringvariable größerer Maximallänge als der zugehörige
formale Parameter zu übergeben. Dies widerspricht jedoch den im report
vereinbarten Typkompatibilitäts- regeln, nach denen aktuelle Variablenparameter
den selben Typ wie der formale Parameter besitzen müssen.
(*$P- *)
(*$P+ *)
PROGRAM STRINGPARAMETER(INPUT,OUTPUT);
VAR LONGSTRING: STRING[132];
PROCEDURE UPCASE(S: STRING);
(* wandele S in Großbuchstaben *)
VAR L: INTEGER;
BEGIN
FOR L:= 1 TO LENGTH(S) DO
S[L]:= CHR(ORD(S[L]) AND 127);
END; (* UPCASE *)
BEGIN
UPCASE(LONGSTRING);(* Fehlermeldung *)
(*$P- *)
UPCASE(LONGSTRING);(* keine Fehlermeldung *)
(*$P+ *)
UPCASE(LONGSTRING);(* Fehlermeldung *)
END.
4.4.6.3 Chain-Option
DIVISION BY ZERO
ERROR AT 7437 IN KEHRWERT
CALLED AT 7453 IN P
CALLED AT 7469 IN LAUFZEITFEHLER
(*$C- *)
(*$C- *)
PROGRAM LAUFZEITFEHLER(INPUT,OUTPUT);
FUNCTION KEHRWERT(X: INTEGER): REAL;
BEGIN
KEHRWERT:= 1 / X;
END; (* KEHRWERT *)
(*$C+ *)
PROCEDURE P;
BEGIN
WRITELN(KEHRWERT(0));
END; (* P *)
BEGIN
P
END.
DIVISION BY ZERO
ERROR AT 7437 IN ?
CALLED AT 7453 IN P
CALLED AT 7469 IN ?
Die Chain-Option hat keinerlei Auswirkung auf die Ausführungsgeschwindigkeit
übersetzter Pascal-Programme.
4.4.6.4 Include-Files
PROGRAM INCLUDES(INPUT,OUTPUT);
(*$"TURTLE.INC" *)
(*$"STRINGS.INC" *)
BEGIN
END.