Prokrustes’ Wechselstube

Christoph Karl Walter Grein

Alexeus der Tapfere, ein Handelsreisender, beladen mit vielen wertvollen Bits

kommt auf seinen Reisen durch Ada-Land weit herum und muss daher manchmal seine Bits in die landestypische Form wechseln. So kommt er einst an eine Grenze, woselbst der listige Prokrustes eine Wechselstube betreibt. Er legt unserem Freund Alexeus folgenden Wechselvertrag vor:

mit der Fremdwährung

Im Kleingedruckten des Wechselvertrags findet sich ein Hinweis:

Achten Sie darauf, dass Ihre Quell- und Zielobjekte stets die gleiche Größe haben.

"Klar, geht in Ordnung", denkt sich Alexeus, wechselt also an der Grenze bei Prokrustes seine Bits, reist durch das Land und macht gute Geschäfte. Am Ende kommt er wieder zu Prokrustes und will sein Guthaben in seine Heimatwährung zurücktauschen.

Prokrustes hat allerdings, schlau wie er ist (er stammt ja schließlich aus einer uralten Räuberfamilie), inzwischen den Wechselapparat gegen den eines anderen Herstellers ausgetauscht. Als Alexeus nachzählt, traut er seinen Augen nicht: Prokrustes hat unseren armen Handlungsreisenden um die Hälfte seiner Bits betrogen (gemäß der Devise: Wer wird denn eine Bank überfallen, wenn das Gründen und Betreiben einer solchen doch so viel einfacher und ertragreicher ist).

Was ist da geschehen? Wir wollen uns die beiden Wechselmaschinen einmal genauer anschauen. Nennen wir die bei der Einreise verwendete Compiler_1, die bei der Ausreise Compiler_2 *.

Compiler_1:       Compiler_2:
  Wechseln (5) = (0, 5)  -- Einreise
  Wechseln ((0, 5)) = 5
     
  Wechseln (5) = (0, 10)
  Wechseln ((0, 10)) = 5  -- Ausreise

Compiler_1 arbeitet, wie es der naive Alexeus erwartet; dagegen verdoppelt bzw. halbiert Compiler_2 die Werte. (Prokrustes weiß natürlich genau, wann er welche Maschine verwenden muss, nämlich Compiler_1 bei der Einreise, Compiler_2 bei der Ausreise.)

Hätte Alexeus doch bloß auf die Warnung gehört. Sein Guthaben ist nämlich nicht-negativ, benötigt also nur 15 Bits, das 16. ist das Vorzeichen: Guthaben'Size = 15, und genau das versuchten die Compiler in ihren Warnungen zu sagen (dem Kleingedruckten in unserer Geschichte).

Alexeus mag das sogar bewusst gewesen sein, aber er sagte sich: "Blödsinn, der Compiler spinnt doch; Objekte des Subtyps Guthaben haben trotzdem 16 Bits." Da hat er sogar recht (für allein stehende Objekte), nur für die ungeprüfte Typumwandlung gilt eben eine Sonderregelung, die bitgenaues Abgreifen ermöglicht. Allerdings ist sein Irrtum entschuldbar, denn er verwendet immer noch Ada83, und da ist das RM nicht so klar, wie man es sich wünschte [RM_83 13.7.2(5), 13.10.2(2)]. Insgesamt ist Ada95 hier wesentlich ausführlicher [RM_95 13.3(45,47), 13.9(6)].

Die erste Maschine greift nun die Bits nach dem LSB ausgerichtet ab, die andere nach dem MSB, wobei das LSB verloren geht, was einer Ganzzahldivision durch 2 entspricht. Beides ist erlaubt, da das RM nur vorschreibt, was bei gleicher Größe der Subtypen zu geschehen hat; alles andere ist implementierungsabhängig.

Zurück zu unserer Geschichte.

Alexeus, dem in vielen Raubzügen gestählten Prokrustes nicht gewachsen, läuft schnurstracks und fuchsteufelswild zu seinem alten Freund Theseus, einem mächtigen Anwalt, der den üblen Prokrustes zwingt, einen neuen Wechselvertrag zu unterzeichnen:

Und schon hat Alexeus sein Geld wieder (na ja, bis auf das horrende Honorar, das er dem modernen Raubritter Theseus zu zahlen hat).


* Ich nenne hier keine Hersteller, aber es gibt die beiden.


Erschienen in SWTT 27.3 (August 2007).


Ada Magica
Inhaltsverzeichnis
       © Copyright 2005, 2007 C.K.W. Grein