next up previous
Nächste Seite: Anordnung von Typen und Aufwärts: Laufzeitumgebung Vorherige Seite: Offene Feldparameter

Kontrollcode

Der Quelltext eines -Programmes wird vom Compiler bereits auf grösstmögliche Fehlerfreiheit kontrolliert. Der Compiler prüft, ob die Syntax des Programmes korrekt ist. Einige Fehler sind jedoch erst zur Laufzeit des Programmes feststellbar.

Für diese Fehler wird vom Compiler (bei entsprechend eingeschalteten Optionen!) Kontrollcode erzeugt, der bei Eintritt bestimmter Fehlerzustände durchlaufen wird und zum Programmabbruch mit einem Laufzeitfehler-Requester führt. Dies bringt dem Programmierer zwei entscheidende Vorteile:

Diesen Vorteilen stehen aber auch Nachteile gegenüber:


\begin{warning}
Trotz des intensiven vom Compiler erzeugten Pr\uml {u}fcodes is...
...) oder
der fehlerhafte Aufruf von Prozeduren des Betriebssystems.
\end{warning}

Die genauen Bedingungen für Laufzeitfehler können Sie im Abschnitt 5.4.3 ab Seite [*] nachlesen, an dieser Stelle wollen wir lediglich einige Beispiele für den erzeugten Prüfcode und seine Auswirkung auf die Geschwindigkeit geben. Der Prüfcode ist in den Beispielen jeweils durch einen Pfeil gekennzeichnet.

Bei Prozessoren vom 68020 an aufwärts wird für RangeCheck und NilCheck jeweils kürzerer und schnellerer Prüfcode generiert, weil die auf diesen Prozessoren verfügbaren Befehle ,,TRAPcc`` und ,,CHK.L`` benutzt werden und somit der kurze Sprung ,,drumherum`` unnötig ist.


\begin{example}
\begin{verbatim}CONST
Count = 1000000;PROCEDURE RangeCheck;...
...OVE.L D7,(A3)(*$ POP NilChk *)
END;
END NilCheck;\end{verbatim}\end{example}

Bereichs-, Überlaufs- und NIL-Prüfung benötigen wenig zusätzlichen Code. In diesen Prozeduren wurde nur jeweils eine bis maximal drei Anweisungen eingefügt (2 bis 6 Byte).

Anders verhält es sich mit der Stapelüberlauf-Prüfung. Beim Eingangscode einer Prozedur müssen zwei Befehle eingefügt werden (jenachdem, ob der Wert in ein Byte passt, ergibt dies 6 oder 10 Byte). Der eingefügte Code ruft eine Prozedur im Modul Arts auf, die überprüft, ob die benötigte Anzahl Byte auf dem Stapel noch verfügbar ist.

Alle Überprüfungen kosten nicht nur Speicherplatz, sondern auch Ausführungszeit:


Tabelle 5.5: Ausührungszeit mit Überprüfungscode
Überprüfung ausgeschaltet eingeschaltet Zunahme
RangeCheck 17.0s 18.8s 11%
RangeCheckLong 17.8s 21.3s 20%
OverflowCheck 16.0s 16.6s 4%
StackCheck 15.2s 39.5s 160%
NilCheck 14.9s 17.1s 15%


Wie man sieht, ist also die Stapelüberprüfung die grösste ,,Bremse``. Sollte ein Programmteil nicht schnell genug laufen, empfiehlt es sich, als erstes die Stapelüberlaufprüfung auszuschalten, weil man damit das Programm am ehesten beschleunigen kann.


next up previous
Nächste Seite: Anordnung von Typen und Aufwärts: Laufzeitumgebung Vorherige Seite: Offene Feldparameter
Claudio Nieder 2000-11-12