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:

- Das Programm wird im Fehlerfall sauber abgebrochen; die anderen Prozesse laufen ungestört weiter, programmfremde Speicherinhalte werden nicht zerstört. Das hat zur Konsequenz, dass der ungeliebte ,,Guru`` nicht erscheint. Ausserdem kann die Close-Phase noch durchlaufen werden um belegte Ressourcen wieder freizugeben.
- Fehler in der Programmierung können genauer lokalisiert werden, und die Fehlersuche wird kürzer und effektiver.

Diesen Vorteilen stehen aber auch Nachteile gegenüber:

- Der Kontrollcode vergrössert die Objektdatei.
- Das Programm wird langsamer.

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.

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.

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