home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mod201j.zip / modula2.exe / os2doc / mod-gr.inf (.txt) < prev    next >
OS/2 Help File  |  1996-03-29  |  221KB  |  6,299 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. Hinweise zu dieser Version ΓòÉΓòÉΓòÉ
  3.  
  4. Willkommen zu dieser Beta-Version 2.01J. Dieser ╨¬bersetzer ist Betaware. Diese 
  5. Software ist keine Shareware und auch keine Freeware! 
  6.  
  7. Bitte lesen Sie die folgenden Sektionen BEVOR Sie den ╨¬bersetzer benutzen: 
  8.  
  9.  - Lizenz-Vereinbarung
  10.  - Kontakte zum Autor
  11.  - Was noch zu tun ist
  12.  
  13.  
  14. ΓòÉΓòÉΓòÉ 1.1. Lizenz-Vereinbarung ΓòÉΓòÉΓòÉ
  15.  
  16. WENN SIE DIESES PROGRAMM KOPIEREN ODER NUTZEN,ERKL╨₧REN SIE SICH MIT DEN 
  17. FOLGENDEN NUTZUNGSBEDINGUNGEN EINVERSTANDEN. 
  18.  
  19. Der Autor ╨æberl╨ö╤üt Ihnen das Recht,"Canterbury-MODULA-2 Beta 2.01J" als ein 
  20. Beta-Tester zu nutzen. Dieses Paket enth╨ölt Programme, Quelltexte und 
  21. Dokumentation, im folgendem als "die Programme" bezeichnet. Die Programme sind 
  22. Demo- bzw. Beta-Test Versionen. Die Programme sind somit in Ihrem 
  23. Nutzungsumfang eingeschr╨önkt. Die Vollversion kann stark von dieser 
  24. Demo-Version abweichen. 
  25.  
  26. Die Programme sind urheberrechtlich gesch╨ætzt. Weitergehende Rechte als die,wie 
  27. sie hier festgehalten sind, werden nicht ╨æbertragen. Wenn Sie mit den folgenden 
  28. Nutzungsbestimmungen ganz oder teilweise nicht einverstanden sind, erlischt die 
  29. Nutzungserlaubnis der Programme. 
  30.  
  31.     Die Nutzung wird unter folgenden Vorraussetzungen gew╨öhrt: 
  32.  
  33.         1. Sie k╨ñnnen die Programme auf einer oder mehreren Maschinen nutzen. 
  34.  
  35.         2. Sie k╨ñnnen f╨ær Backup-Zwecke Kopien der Programme anlegen. 
  36.  
  37.         3. Und Sie k╨ñnnen Kopien der Original-Dateien an Dritte weitergeben, 
  38.         vorrausgesetzt, dass eine Kopie dieser Lizenzvereinbaring ebenfalls 
  39.         weitergegeben wird und der Empf╨önger ausdr╨æcklich auf die hier 
  40.         genannten Bestimmungen hingewiesen wurde. 
  41.  
  42.     Jede Kopie oder Teilkopie der Programme mu╤ü den Original Copyright Vermerk 
  43.     enthalten. 
  44.  
  45.      Auf keinen Fall d╨ærfen Sie: 
  46.  
  47.         1. Die Programme vermieten oder verleasen. 
  48.  
  49.         2. Die Programme decompilieren, reassemblieren oder auf sonstige Weise 
  50.         r╨æck╨æbersetzen. 
  51.  
  52.         3. Die Programme f╨ær milit╨örische Zwecke nutzen. 
  53.  
  54.     Der Autor ist auf keinen Fall verantwortlich f╨ær: 
  55.  
  56.         1. Klagen Dritter gegen Sie wegen Sch╨öden oder Verlusten 
  57.  
  58.         2. Datenverlust oder 
  59.  
  60.         3. ╨⌐konomische Sch╨öden, selbst wenn der Autor sich deren M╨ñglichkeit 
  61.         bewu╤üt ist. 
  62.  
  63.     Sollten Teile dieser Lizenzvereinbaring juristisch anfechtbar sein, so 
  64.     beeinflussen sie nicht die Geltung der gesamten Vereinbarung. 
  65.  
  66.     Der Autor garantiert kein fehlerfreies Arbeiten der Programme. 
  67.  
  68.     WENN SIE DIESES PROGRAMM KOPIEREN ODER NUTZEN, ERKL╨₧REN SIE SICH MIT DEN 
  69.     NUTZUNGSBEDINGUNGEN EINVERSTANDEN. 
  70.  
  71.     DER AUTOR ╨¬BERNIMMT KEINERLEI HAFTUNGEN, WEDER AUSDR╨¬CKLICH NOCH IM 
  72.     BESONDEREN F╨¬R DIE EIGNUNG DIESER PROGRAMME F╨¬R EINEN BESTIMMTEN ZWECK. 
  73.  
  74.     Sie k╨ñnnen diese Lizenzvereinbarung zu jeder Zeit k╨ændigen. Der Autor kann 
  75.     diese Lizenzvereinbarung aufheben, wenn Sie gegen die Bestimmungen, wie sie 
  76.     hier festgehalten sind, versto╤üen, oder aber, sobald die Vollversion dieses 
  77.     Programmpaketes erscheint. In allen F╨öllen m╨æssen Sie alle Kopien der 
  78.     Programme vernichten und sind nicht l╨önger berechtigt, die Programme zu 
  79.     nutzen. 
  80.  
  81.     Sie k╨ñnnen die Rechte an dieser Lizenzvereinbarung nicht teilweise an 
  82.     Dritte weitergeben. Eine Weitergabe ist nur in Verbindung mit dem gesamten 
  83.     Programmpaket m╨ñglich. In diesem Fall m╨æssen Sie alle Kopien der Programme 
  84.     vernichten. 
  85.  
  86.     Diese Lizenzvereinbarung beruht auf dem Recht des Landes, in welchem Sie 
  87.     das Programmpaket erwerben. 
  88.  
  89.  
  90. ΓòÉΓòÉΓòÉ 1.2. Kontakte zum Autor ΓòÉΓòÉΓòÉ
  91.  
  92. Bitte f╨æhlen Sie sich frei, Fehlerhinweise, Kommentare oder 
  93. Verbesserungsvorschl╨öge an den Autor Juergen Neuhoff zu senden. Am schnellsten 
  94. geht das via CompuServe E-Mail (dies ist auch die bevorzugte Art): 
  95.  
  96.  CompuServe 76721,303 
  97.  
  98. Dieser Compiler wird demn╨öchst von folgender Firma vermarktet: 
  99.  
  100.  Mill Hill & Canterbury Group, Ltd. 
  101.  P.O. BOX 1277 
  102.  Peralta NM 87042 
  103.  U.S.A. 
  104.  CompuServe 73261,1622 
  105.  
  106. Falls Sie diese Software aus einer CompuServe Forum-Bibliothek herunterluden, 
  107. k╨ñnnen Sie auch ╨ñffentliche Nachrichten zum Forum senden. Dadurch k╨ñnnen auch 
  108. andere Beta-Tester aus Ihren Erfahrungen Nutzen ziehen. 
  109.  
  110.  
  111. ΓòÉΓòÉΓòÉ 1.3. Was noch zu tun ist ΓòÉΓòÉΓòÉ
  112.  
  113. Dieser Compiler ist noch eine fr╨æhe Beta-Fassung. Deshalb gibt es noch viele 
  114. Dinge zu tun. K╨ænftige Versionen m╨ñgen z.B. folgendes hinzubekommen: 
  115.  
  116.   - Volle symbolische Debugger-Unterst╨ætzung f╨ær IPMD oder SD386:
  117.   Dieser Compiler genereriert volle HLL3-kompatible Debug-Infos.
  118.   Diese sollten laut IBM sowohl von SD386 als auch von IPMD
  119.   unterst╨ætzt werden. Leider sind beide IBM Debugger fehlerhaft.
  120.   Diese Version unterst╨ætzt Source-Line-Level Debugging und f╨ær
  121.   SD386 (3.04) teilweise Symbole.
  122.  - Fehlerkorrekturen
  123.  - "Direct-to-SOM" Feature
  124.  - Modula-2 nach IDL Umwandlung
  125.  - Klassen-Bibliotheken
  126.  - IDE und/oder engere Integration in die WPS
  127.   Eine IDE wird gegenw╨örtig entwickelt.
  128.  - Modula-╨öhnliche Resourcen-Editoren
  129.   Ein visualler Interface Designer wird f╨ær M2 adaptiert.
  130.  - COMPLEX Datentyp
  131.  - Bereichs╨æberpr╨æfung w╨öhrend Laufzeit
  132.  - 32-16-Bit-Schnittstelle f╨ær fremde Bibliotheken
  133.   mit verschiedenen Namen und/oder Linker-Konventionen
  134.  - Assembler-Listing
  135.  
  136.  
  137. ΓòÉΓòÉΓòÉ 2. Einf╨æhrung ΓòÉΓòÉΓòÉ
  138.  
  139. Modula-2 ist eine allgemeine Programmiersprache, welche von Pascal 
  140. weiterentwickelt wurde. Wie der Name 'Modula' es schon andeutet, ist das 
  141. Modul-Konzept ein bedeutendes Merkmal dieser Programmiersprache. Von Pascal ist 
  142. eine revidierte, systematischere Synatx ╨æbernommen worden. Dies schliesst 
  143. insbesondere Datenstrukturen wie zum Beispiel Reihungen, Verbunde, Varianten, 
  144. Mengen und Zeiger ein. Strukturierte Anweisungen schliessen u.a. die vertrauten 
  145. if-, case-, repeat-, while-, for-, und with-Anweisungen ein. 
  146.  
  147. Dieser Sprach╨æbersetzer ist eine Implementierung von Modula-2 f╨ær OS/2 2.x/3.0. 
  148. Er basiert auf den Beschreibungen des Buches 'Programmierung in Modula-2' von 
  149. N.Wirth, vierte Ausgabe. Diese Dokumentation ist nicht als eine Einf╨æhrung in 
  150. die Programmierung gedacht. Sie ist daher absichtlich knapp gehalten, weil sie 
  151. nur als eine Referenz dienen soll. Dieser Modula-2-╨¬bersetzer ist f╨ær jene 
  152. Programmierer gedacht, welche effiziente Software schreiben m╨ñchten, die unter 
  153. dem Betriebssystem OS/2 2.x/3.0 laufen soll. 
  154.  
  155.  
  156. ΓòÉΓòÉΓòÉ 2.1. Ein erstes Beispiel ΓòÉΓòÉΓòÉ
  157.  
  158. Dieser Sprach╨æbersetzer ist eine OS/2 - Anwendung im Textmodus. Er wird von der 
  159. Kommandozeile in einem OS/2-Gesamtbildschirm oder einem OS/2-Textfenster 
  160. gestartet. Er kann weder unter DOS oder dem Presentation Manager laufen. Der 
  161. Sprach╨æbersetzer wird durch Eintippen des Befehls 'MOD' aufgerufen. 
  162.  
  163. Als Beispiel wollen wir ein einfaches Programm nehmen, welches nichts weiter 
  164. als die Anzeige einer Nachricht 'Hallo Welt' bewirkt. Der OS/2 2.x/3.0 
  165. System-Editor kann benutzt werden, um eine entsprechende Quelldatei in Modula-2 
  166. zu erstellen. Der Inhalt solch einer Quelldatei mag in etwa folgendermassen 
  167. aussehen: 
  168.  
  169.  
  170.   MODULE HELLO;
  171.   IMPORT InOut;
  172.   BEGIN
  173.     InOut.WriteString( "Hallo Welt" );
  174.     InOut.WriteLn();
  175.   END HELLO.
  176.  
  177. Tippen Sie folgende Befehle ein, um dieses Programmbeispiel erstellen, 
  178. ╨æbersetzen, binden, und schliesslich ablaufen lassen zu k╨ñnnen, und zwar von 
  179. einem OS/2 Gesamtbildschirm oder von einem Textfenster: 
  180.  
  181.   E HELLO.MOD         <enter>
  182.   MOD HELLO -o -m -p  <enter>
  183.   LINK386 @HELLO.RSP  <enter>
  184.   HELLO               <enter>
  185.  
  186. Die Ausgabe von dem Beispielprogramm sieht wie folgt aus: 
  187.  
  188.   Hallo Welt
  189.  
  190. Die notwendige Antwortdatei HELLO.RSP f╨ær den Binder wird automatisch vom 
  191. Modula-2 ╨¬bersetzer erstellt. Dies wird durch den '-m' -Schalter bewirkt. Der 
  192. ╨¬bersetzer erstellt Objekt-Dateien in einem Format, welches f╨ær das OS/2 
  193. 2.x/3.0 Binder-Programm LINK386.EXE verwertbar ist. LINK386.EXE erzeugt 
  194. schliesslich die ausf╨æhrbare Programmdatei HELLO.EXE. Der Befehlsschalter '-p' 
  195. bewirkt eine ausf╨æhrliche Bildschirmprotokollierung aller zu ╨æbersetzenden 
  196. Programmtexte einschliesslich m╨ñglicher Fehlermeldungen mit Aufforderungen zur 
  197. Antwort. Der Schalter '-o' veranlasst den ╨¬bersetzer, eine volle 
  198. Code-Optimierung durchzuf╨æhren. 
  199.  
  200.  
  201. ΓòÉΓòÉΓòÉ 2.2. Merkmale der ╨¬bersetzer-Version 2.01 ΓòÉΓòÉΓòÉ
  202.  
  203. Dieser ╨¬bersetzer bietet die folgenden Hauptmerkmale: 
  204.  
  205.   - Ziel-Betriebssystem:
  206.    - 32-bit OS/2 2.x/3.0
  207.    - 16-bit OS/2 1.x
  208.    - 16-bit MS-Windows 3.x
  209.    - 16-bit DOS
  210.    Anmerkung: Die Modula-Bibliotheken sind zur Zeit nur
  211.    f╨ær 32-bit OS/2 2.x/3.0 verf╨ægbar. Zuk╨ænftige Versionen werden
  212.    auch die Bibliothken f╨ær die anderen Zielsysteme enthalten.
  213.  
  214.   - Ausgabedateien vom ╨¬bersetzer:
  215.    - 16- oder 32-bit Objekt-Dateien, verwendbar f╨ær
  216.     LINK.EXE oder LINK386.EXE.
  217.    - Antwortdatei(en) f╨ær den Binder
  218.    - Definitionsdateien f╨ær den Binder
  219.  
  220.   - Integrierte 'Make' oder 'Build' -Einrichtung:
  221.    - 'Make' ╨æbersetzt auch ge╨önderte, abh╨öngige Module.
  222.    - 'Build' ╨æbersetzt auch alle abh╨öngige Module.
  223.  
  224.   - Elementare Typen und Funktionen mit verschiedenen Gr╨ñssen:
  225.    - 1-, 2- und 4-byte 'cardinal'- und 'integer' -Typen
  226.    - 4- und 8-byte 'real' -Typen
  227.  
  228.   - Mengentypen mit bis zu 256 Elementen:
  229.    - z.B. TYPE CharSet = SET OF CHAR;
  230.  
  231.   - M╨öchtige Spracherweiterungen:
  232.    - Unterstreichungszeichen '_' erlaubt f╨ær Namen
  233.     (wie in OS/2 APIs)
  234.    - Bitweise Operatoren 'AND' 'OR' 'XOR' 'SHL' 'SHR' 'NOT'
  235.    - Neuer logischer Operator 'XOR'
  236.    - Objekt-Orientierung ╨öhnlich der Sprache Oberon
  237.    - System Object Model unter OS/2 unterst╨ætzt
  238.    - Initialisierte Variablen, ausgedr╨æckt als typisierte Konstanten
  239.    - Multidimensionale offene Reihungen
  240.    - Symbolischer INLINE Assemblierer
  241.    - NEAR oder FAR Schl╨æsselw╨ñrter f╨ær
  242.     INTEL 80x86 Segmentierung
  243.    - Erweiterte Importe
  244.  
  245.   - Entwicklung dynamischer Binder-Bibliotheken f╨ær OS/2 2.x/3.0
  246.  
  247.   - Definitions-Module f╨ær externe .OBJ .DLL .LIB -Dateien
  248.    - OS/2 2.x/3.0 Schnittstelle f╨ær Control Program
  249.    - OS/2 2.x/3.0 Schnittstelle f╨ær Graphics Program
  250.    - OS/2 2.x/3.0 Schnittstelle f╨ær Presentation Manager
  251.    - OS/2 2.x/3.0 Schnittstelle f╨ær Workplace Shell
  252.    - OS/2 2.x/3.0 Schnittstelle f╨ær Tastatur
  253.    - OS/2 2.x/3.0 Schnittstelle f╨ær Bildschirm
  254.    - OS/2 2.x/3.0 Schnittstelle f╨ær Maus
  255.  
  256.  
  257. ΓòÉΓòÉΓòÉ 3. Syntax ΓòÉΓòÉΓòÉ
  258.  
  259. Eine Sprache ist eine unbegrenzte Menge von S╨ötzen, wobei diese nach den Regeln 
  260. der Sprachsyntax geformt sein m╨æssen. In Modula-2 werden diese S╨ötze insgesamt 
  261. als ╨¬bersetzungseinheit bezeichnet. Jede ╨¬bersetzungseinheit besteht aus einem 
  262. Progamm- oder Definitions- Modul und wird in einer Quellendatei gespeichert. 
  263. Jede Einheit ist eine endliche Sequenz von Symbolen aus einem endlichen 
  264. Vokabular. Das Vokabular von Modula-2 besteht aus Namen, Zahlen, Zeichenketten, 
  265. Operatoren, Begrenzern und Kommentaren. Sie werden lexikalische Symbole genannt 
  266. und bestehen aus Zeichensequenzen. 
  267.  
  268. Zur Beschreibung der Sprachsyntax wird ein Formalismus in Anlehnung an 
  269. Backus-Naur gebraucht. Die eckigen Klammern '[' und ']' geben eine optionalen 
  270. syntaktischen Eintrag an, und die geschweiften Klammern '{' und '}' geben deren 
  271. wiederholten Eintrag an (null oder mehr). Ein '|' Zeichen bedeutet eine Wahl 
  272. zwischen zwei Eintr╨ögen. Syntaktische Eintr╨öge werden von der Menge der 
  273. lexikalischen Modula-2 -Symbole gebildet. Sie werden als nicht-terminierende 
  274. Symbole bezeichnet und werden durch englische W╨ñrter angegeben, um ihre 
  275. intuitative Bedeutung auszudr╨æcken. Die Symbole vom Vokabular der Sprache 
  276. selbst, die sogenannten terminierenden Symbole, werden durch in 
  277. Anf╨æhrungszeichen eingeschlossene Zeichenketten oder durch W╨ñrter in 
  278. Grossbuchstaben, den sogenannten reservierten W╨ñrtern, angegeben. 
  279. Nicht-terminierende Symbole werden aus terminierenden und nicht-terminierenden 
  280. Symbolen gebildet. Dabei werden Produktionen nach festen syntaktischen Regeln 
  281. benutzt. Produktionen werden durch das Gleichheitszeichen '=' angedeutet. 
  282.  
  283. Beispiel 1: 
  284.  
  285.   Decl = VAR { VarDecl ";" }
  286.  
  287. Eine Deklaration (Decl) f╨öngt mit dem reservierten Schl╨æsselwort VAR an und 
  288. wird von einer (m╨ñglicherwiese leeren) Liste von Variable-Deklarationen 
  289. (VarDecl), getrennt durch Semikolons, gefolgt. 
  290.  
  291. Beispiel 2: 
  292.  
  293.   Stmt = RETURN [ Expr ] | EXIT
  294.  
  295. Eine Anweisung (Stmt) kann aus einem RETURN bestehen, welcher m╨ñglicherweise 
  296. durch einen Ausdruck (Expr) gefolgt wird. Oder sie kann aus einem EXIT 
  297. bestehen. 
  298.  
  299.  
  300. ΓòÉΓòÉΓòÉ 4. Vokabular und dessen Darstellung ΓòÉΓòÉΓòÉ
  301.  
  302. Die Darstellung von Symbolen geschieht durch definierte Zeichen aus dem 
  303. ASCII-Zeichensatz. Symbole bestehen aus Namen, Zahlen, Zeichenketten, 
  304. Zeichen-Konstanten, Operatoren und Begrenzern, und Kommentaren. Leerzeichen 
  305. sowie Zeilenumbr╨æche d╨ærfen nicht innerhalb von Symbolen erscheinen ( ausser in 
  306. Kommentaren, und im Falle von Leerzeichen auch in Zeichenketten ). Sie werden 
  307. gew╨ñhnlich ignoriert, es sei denn, sie werden zur Trennung zweier 
  308. aufeinanderfolgender Symbole gebraucht. Gross- und Klein-Buchstaben werden als 
  309. unterschiedlich betrachtet. 
  310.  
  311.  
  312. ΓòÉΓòÉΓòÉ 4.1. Namen ΓòÉΓòÉΓòÉ
  313.  
  314. ΓûÉ Ident       = FirstLetter { "_" | Letter | Digit }
  315. ΓûÉ FirstLetter = "_" | Letter
  316.  
  317. Namen (Identifiers) sind Folgen von Buchstaben und Ziffern. Das erste Zeichen 
  318. darf jedoch nicht aus einer Ziffer bestehen. Wenn die Spracherweiterungen 
  319. akitiviert sind, dann ist auch das Unterstreichungszeichen '_' f╨ær Namen 
  320. erlaubt. Dieses wird manchmal f╨ær Namen von OS/2 2.x/3.0 APIs ben╨ñtigt. 
  321. Ansonsten sollte sich der Programmierer davon zur╨æckhalten, freiz╨ægig vom 
  322. Unterstreichungszeichen Gebrauch zu machen f╨ær seine eigenen Namen. 
  323.  
  324. Beispiele beinhalten: 
  325.  
  326.   x scan Modula GetSymbol
  327.  
  328. Beispiele mit erlaubten Unterstreichnungszeichen: 
  329.  
  330.   FILE_READONLY  OPEN_SHARE_DENYWRITE  vector_graphics
  331.  
  332.  
  333. ΓòÉΓòÉΓòÉ 4.2. Zahlen ΓòÉΓòÉΓòÉ
  334.  
  335. ΓûÉ Number      = Integer | Real
  336. ΓûÉ Integer     = Digit { Digit } | OctalDigit { OctalDigit } "B" |
  337. ΓûÉ               Digit { HexDigit } "H"
  338. ΓûÉ Real        = Digit { Digit } "." { Digit } [ ScaleFactor ]
  339. ΓûÉ ScaleFactor = "E" [ "+" | "-" ] Digit { Digit }
  340. ΓûÉ HexDigit    = Digit | "A" | "B" | "C" | "D" | "E" | "F"
  341. ΓûÉ Digit       = "0"  | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
  342. ΓûÉ OctalDigit  = "0"  | "1" | "2" | "3" | "4" | "5" | "6" | "7"
  343.  
  344. Zahlen sind vorzeichenlose ganze Zahlen (Integer) und Gleitkommawerte (Real). 
  345. Ganze Zahlen sind Folgen von Ziffern. Wird die Zahl von dem Buchstaben 'B' 
  346. gefolgt, dann handelt es sich um eine Oktalzahl; Wenn sie von dem Buchstaben 
  347. 'H' gefolgt wird, handelt es sich um eine hexadezimale Zahl. 
  348.  
  349. Der angenommene Typ einer ganzen Zahl wird aus den folgenden Wertebereichen 
  350. ermittelt: 
  351.  
  352.   SHORTINT          0 ............ 127
  353.   INTEGER         128 ......... 32 767
  354.   LONGINT      32 768 .. 2 147 483 647
  355.  
  356.   SHORTCARD         0 ............ 255
  357.   CARDINAL        255 ......... 65 535
  358.   LONGCARD     65 536 .. 4 294 967 296
  359.  
  360. Das bedeutet, dass ein gegebener Wert 1 oder 2 Typen haben kann. Der Wert 128 
  361. zum Beispiel besteht sowohl aus dem Typ INTEGER als auch aus dem Typ SHORTCARD. 
  362. Das sieht komplizierter aus als es tats╨öchlich ist, weil SHORTINT und INTEGER 
  363. und LONGINT untereinander kompatibel sind, und SHORTCARD und CARDINAL und 
  364. LONGCARD ebenfalls untereinander kompatibel sind. 
  365.  
  366. Eine Gleitkommazahl besteht aus einer Folge von Dezimalziffern mit einem 
  367. Dezimalpunkt. Sie kann von einem dezimalen Skalierungsfaktor gefolgt werden. 
  368. Der Skalierungsfaktor wird durch den Buchstaben 'E' eingef╨æhrt und einem 
  369. m╨ñglichen '+' oder '-' -Zeichen, gefolgt von den eigentlichen Ziffern des 
  370. Skalierungsfaktors. Der einf╨æhrende Buchstabe 'E' ist als Zehnerexponent zu 
  371. verstehen. Eine Gleitkommazahl wird intern immer als LONGREAL gespeichert. Der 
  372. dezimale Wertebereich und die Genauigkeit sind f╨ær bis zu 15 signifikante 
  373. Stellen und einer Zehnerpotenz im Bereich von -307 bis +308 garantiert. Sind 
  374. nur bis zu 6 signifikante Stellen und eine Zehnerpotenz im Bereich von -37 bis 
  375. +38 vorhanden, dann kann die Gleitkommazahl auch als SHORTREAL behandelt 
  376. werden. 
  377.  
  378. Beispiele f╨ær ganze Zahlem: 
  379.  
  380.   1980 3764B 7BCH 0FFFFFFFFH
  381.  
  382. Beispiele f╨ær Gleitkommazahlen: 
  383.  
  384.   123456789012.345E-307  12345.   12.3
  385.  
  386.  
  387. ΓòÉΓòÉΓòÉ 4.3. Zeichenketten ΓòÉΓòÉΓòÉ
  388.  
  389. ΓûÉ String      = "'" { Character } "'" | """ { Character } """
  390.  
  391. Zeichenketten bestehen aus Folgen von Zeichen, welche in Anf╨æhrungszeichen 
  392. eingeschlossen sind. Die Anf╨æhrungszeichen k╨ñnnen doppelt oder einfach sein. 
  393. Die ╨ñffnenden und abschliessenden Anf╨æhrungszeichen m╨æssen sich jedoch 
  394. gleichen, und sie d╨ærfen nicht innerhalb der Zeichenkette erscheinen. Eine 
  395. Zeichenkette kann nicht auf der n╨öchsten Zeile fortgesetzt werden. Dieser 
  396. ╨¬bersetzer f╨ægt immer ein abschliessendes Null-Zeichen an den internen Speicher 
  397. f╨ær die Zeichenkette an, obwohl dies nicht explizit vorgeschrieben wird im 
  398. Wirth'schen Standard. Eine Zeichenkette namens 's' kann einer Reihung 'a', 
  399. bestehend aus Zeichen, zugewiesen werden, vorrausgesetzt, die L╨önge von 's' ist 
  400. strikt kleiner als die Anzahl der Elemente von 'a'. Dadurch wird 
  401. sichergestellt, dass das interne abschliessende Null-Zeichen immer dem 
  402. resultierenden 'a' angeh╨öngt werden kann. Der Zweck ist die Vereinfachung von 
  403. m╨ñglichen Tests nach dem Ende einer Zeichenkette. 
  404.  
  405. Beispiele f╨ær Zeichenketten: 
  406.  
  407.   "MODULA"  "Don't worry"  'codeword "Barbarossa"'
  408.  
  409.  
  410. ΓòÉΓòÉΓòÉ 4.4. Zeichen ΓòÉΓòÉΓòÉ
  411.  
  412. ΓûÉ CharConst   = "'" Character "'" |
  413. ΓûÉ               OctalDigit { OctalDigit } "C" |
  414. ΓûÉ               Digit { HexDigit } "X"
  415.  
  416. Eine Zeichenkonstante stellt ein ASCII-Zeichen dar. Sie werden entweder durch 
  417. ein einzelnes Zeichen angegeben, welches in einfachen Anf╨æhrungszeichen 
  418. eingeschlossen wird, oder durch die Ordnungszahl des Zeichens in oktaler 
  419. Schreibweise, gefolgt durch den Buchstaben 'C'. Wenn die Spracherweiterungen 
  420. aktiviert sind, erlaubt dieser ╨¬bersetzer auch eine hexadizimale Schreibweise, 
  421. gefolgt vom Buchstaben 'X', f╨ær die Ordnungszahl des Zeichens. Das tats╨öchliche 
  422. Aussehen und die Bedeutung der einzelnen Zeichen h╨öngen von den aktiven OS/2 
  423. 2.x/3.0 Code-Seiten und Schrifttypen ab. 
  424.  
  425.  
  426. ΓòÉΓòÉΓòÉ 4.5. Operatoren und Begrenzer ΓòÉΓòÉΓòÉ
  427.  
  428. Zu den Operatoren und Begrenzern geh╨ñren Sonderzeichen, Zeichenpaare und 
  429. reservierte W╨ñrter. Die reservierten W╨ñrter bestehen ausschliesslich aus 
  430. Grossbuchstaben und d╨ærfen nicht die Rolle von Namen ╨æbernehmen. Die Symbole 
  431. '#' and '<>' haben die gleiche Bedeutung, desgleichen '&' und 'AND', sowie '~' 
  432. und 'NOT'. 
  433.  
  434.  
  435. ΓòÉΓòÉΓòÉ 4.5.1. Sonderzeichen ΓòÉΓòÉΓòÉ
  436.  
  437.   +   -   *   /   &   |   ~
  438.  
  439.   .   ,   ;   ^   ..  :   :=
  440.  
  441.   =   #   <   >   <>  <=  >=
  442.  
  443.   (   )   [   ]   {   }
  444.  
  445.   "   '
  446.  
  447.  
  448. ΓòÉΓòÉΓòÉ 4.5.2. Reservierte W╨ñrter ΓòÉΓòÉΓòÉ
  449.  
  450. Die folgenden Namen werden als reservierte W╨ñrter behandelt. Sie k╨ñnnen nicht 
  451. f╨ær Benutzernamen verwendet werden. 
  452.  
  453.  AND            DO             IF             OF             SET
  454.  ARRAY          ELSE           IMPLEMENTATION OR             THEN
  455.  BEGIN          ELSIF          IMPORT         POINTER        TO
  456.  BY             END            IN             PROCEDURE      TYPE
  457.  CASE           EXIT           LOOP           QUALIFIED      UNTIL
  458.  CONST          EXPORT         MOD            RECORD         VAR
  459.  DEFINITION     FOR            MODULE         REPEAT         WHILE
  460.  DIV            FROM           NOT            RETURN         WITH
  461.  
  462. Dieser ╨¬bersetzer betrachtet einige weitere Namen als erweiterte reservierte 
  463. W╨ñrter f╨ær Modula-2 Spracherweiterungen. 
  464.  
  465.  
  466. ΓòÉΓòÉΓòÉ 4.5.3. Erweiterte reservierte W╨ñrter ΓòÉΓòÉΓòÉ
  467.  
  468. Wenn die Spracherweiterungen aktiviert sind, dann werden die folgenden Namen 
  469. ebenfalls als reservierte W╨ñrter behandelt. Sie k╨ñnnen dann nicht f╨ær 
  470. Benutzernamen verwendet werden. 
  471.  
  472.    FAR
  473.    IS
  474.    NEAR
  475.    SHL
  476.    SHR
  477.    XOR
  478.  
  479.  
  480. ΓòÉΓòÉΓòÉ 4.6. Kommentare ΓòÉΓòÉΓòÉ
  481.  
  482. Kommentare k╨ñnnen ╨æberall im Programm zwischen zwei Symbolen eingef╨ægt werden. 
  483. Jede Zeichensequenz, welche in den Klammern '(*' und '*)' eingeschlossen ist, 
  484. bildet einen Kommentar. Kommentare k╨ñnnen geschachtelt sein. Sie ╨öndern nicht 
  485. die Bedeutung des Programms. Kommentare k╨ñnnen auch ╨¬bersetzer-Direktiven. 
  486. enthalten. 
  487.  
  488. Kommentare werden vom ╨¬bersetzer ╨æbergangen. Sie dienen lediglich als 
  489. zus╨ötzliche Informationen f╨ær den menschlichen Betrachter. Der 
  490. INLINE-Assemblierer behandelt auch ein ';' als den Beginn eines Kommentars, 
  491. welcher bis zum Ende einer Zeile reicht. 
  492.  
  493.  
  494. ΓòÉΓòÉΓòÉ 5. Sichtbarkeitsbereich f╨ær Deklarationen ΓòÉΓòÉΓòÉ
  495.  
  496. Jeder Name, der im Programm vorkommt, muss durch eine Deklaration eingef╨æhrt 
  497. werden, es sei denn, es handelt sich um einen Standard-Namen. Letzterer wird 
  498. als vordeklariert betrachtet. Dieser ╨¬bersetzer h╨ölt die Vordeklarationen in 
  499. einem Pseudo-Definitions-Modul, welches SYSTEM genannt wird. Diese 
  500. Standard-Namen sind in allen Bereichen eines Programms g╨æltig. Sie sind 
  501. sozusagen durchl╨össig. 
  502.  
  503. Deklarationen dienen auch dazu, bestimmte permanente Eigenschaften eines 
  504. Objekts festzulegen, zum Beispiel, ob es sich um eine Konstante, einen Typ, 
  505. eine Variable, eine Prozedur oder einen Modul handelt. Der Name wird dann dazu 
  506. benutzt, um sich auf das entsprechende Objekt zu beziehen. Solch eine 
  507. Bezugnahme ist jedoch nur in den Programmbereichen m╨ñglich, welche im 
  508. sogenannten Sichtbarkeitsbereich der Deklaration liegen. Kein Name darf 
  509. innerhalb eines gegebenen Sichtbarkeitsbereichs mehr als ein Objekt angeben. 
  510. Der Sichtbarkeitsbereich erstreckt sich textuell von der Stelle der Deklaration 
  511. bis zum Ende des Blocks der Prozedur oder des Moduls, zu welchem die 
  512. Deklaration geh╨ñrt und zu welchem sie demzufolge lokal ist. Die 
  513. Sichtbarkeitsregel wird um folgende Punkte erweitert: 
  514.  
  515.           (1) Wenn ein Typ P als ein Zeigertyp definiert ist, z.B. P = POINTER 
  516.           TO T, dann kann der Name T auch erst nach der Deklaration von P, aber 
  517.           innerhalb des gleichen Sichtbarkeitsbereichs, deklariert werden. 
  518.  
  519.           (2) Feldnamen von einem Verbundtyp sind nur in Feldbezeichnern und in 
  520.           with-Anweisungen, welche auf eine Variable dieses Verbundtyps Bezug 
  521.           nehmen, erlaubt. 
  522.  
  523.           (3) Wenn ein Name, der im Modul M1 definiert ist, exportiert wird, 
  524.           dann erweitert sich der Sichtbarkeitsbereich bis zum Ende des Blocks, 
  525.           welcher M1 enth╨ölt. Wenn M1 eine ╨¬bersetzungseinheit darstellt, 
  526.           erweitert sich der Sichtbarkeitsbereich auf alle Einheiten, die M1 
  527.           importieren. 
  528.  
  529.  
  530. ΓòÉΓòÉΓòÉ 5.1. Qualifikation von Namen ΓòÉΓòÉΓòÉ
  531.  
  532. ΓûÉ Qualident        = { Qualifier "." } Ident
  533. ΓûÉ Qualifier        = Ident
  534.  
  535. Ein Name kann qualifiziert sein. In diesem Falle wird ein Name vorangestellt, 
  536. welcher den Modul einer lokalen Modul-Deklaration bezeichnet, oder welcher eine 
  537. globale ╨¬bersetzungseinheit bezeichnet, die den Namen definiert und exportiert. 
  538. Das Pr╨öfix und der Name sind durch einen Punkt getrennt. Standard-Namen haben 
  539. alle ihren Ursprung im SYSTEM Modul f╨ær diesen ╨¬bersetzer. Sie sind sozusagen 
  540. durchl╨össig. Daher m╨æssen sie nicht qualifiziert werden. 
  541.  
  542.  
  543. ΓòÉΓòÉΓòÉ 5.2. Standard-Namen ΓòÉΓòÉΓòÉ
  544.  
  545. Einige der Standard-Namen f╨ær diesen ╨¬bersetzer m╨ñgen nicht unbedingt bei 
  546. ╨¬bersetzern von anderen Herstellern verf╨ægbar sein. Sie sind mit einem Stern 
  547. markiert. Zu ihnen geh╨ñren NEW, DISPOSE, LONG... und SHORT..., und sie werden 
  548. durch diesen ╨¬bersetzer wie Standard-Namen behandelt, weil die Elementar-Typen 
  549. verschieden Gr╨ñssen haben k╨ñnnen und weil eine dynamische Speicherverwaltung 
  550. unterst╨ætzt werden soll. 
  551.  
  552.   ABS           FLOAT         LONGREAL     *SHORTCARD
  553.   BITSET        HALT         *LONGTRUNC    *SHORTFLOAT
  554.   BOOLEAN       HIGH          MAX          *SHORTINT
  555.   CAP           INC           MIN          *SHORTNIL
  556.   CARDINAL      INCL         *NEW          *SHORTREAL
  557.   CHAR          INTEGER       NIL          *SHORTTRUNC
  558.   CHR          *LONG          ODD           SIZE
  559.   DEC          *LONGCARD      ORD           TRUE
  560.  *DISPOSE      *LONGFLOAT     PROC          TRUNC
  561.   EXCL          LONGINT       REAL          VAL
  562.   FALSE        *LONGNIL      *SHORT
  563.  
  564.  
  565. ΓòÉΓòÉΓòÉ 6. Deklarationen ΓòÉΓòÉΓòÉ
  566.  
  567. ΓûÉ Decl          = CONST { ConstDecl ";" } | TYPE { TypeDecl ";" } |
  568. ΓûÉ                 VAR { VarDecl ";" } | ProcedureDecl | ModuleDecl
  569.  
  570. Jedes Objekt, welches in einem Programm vorkommt, wie zum Beispiel Typen, 
  571. Variablen, oder Prozeduren, muss durch eine Deklaration eingef╨æhrt werden. 
  572. Durch eine Deklaration werden bestimmte permanente Eigenschaften eines Objekts 
  573. gekennzeichnet. Die folgenden Arten von Objekte k╨ñnnen als Benutzernamen 
  574. deklariert werden: 
  575.  
  576.  - Konstanten
  577.  - Typen
  578.  - Variablen
  579.  - Prozeduren
  580.  - Module
  581.  
  582.  
  583. ΓòÉΓòÉΓòÉ 6.1. Konstanten-Deklarationen ΓòÉΓòÉΓòÉ
  584.  
  585. ΓûÉ ConstDecl     = ConstDef | ConstVarDecl "=" TypedConst
  586. ΓûÉ ConstVarDecl  = Ident ":" FormalType
  587. ΓûÉ ConstDef      = Ident "=" ConstExpr
  588. ΓûÉ ConstExpr     = Expr
  589.  
  590. Eine Konstanten-Deklaration bringt einen Namen mit einem konstanten Wert in 
  591. Verbindung. Ein konstanter Ausdruck ist ein Ausdruck, der schon beim textuellen 
  592. Einlesen ausgewertet wird und nicht erst w╨öhrend der Programmausf╨æhrung. Seine 
  593. Operanden sind Konstanten. 
  594.  
  595. Beispiele f╨ær Konstanten-Deklarationen: 
  596.  
  597.   CONST
  598.     N     = 100;
  599.     limit = 2*N - 1;
  600.     all   = {0..WordSize-1};
  601.     bound = MAX(INTEGER) - N;
  602.  
  603. Dieser ╨¬bersetzer unterst╨ætzt auch die Deklarationen von initialsierten 
  604. Variablen durch den Gebrauch von sogenannten typisierten Konstanten. Diese 
  605. Besonderheit ist nur dann verf╨ægbar, wenn die Spracherweiterungen aktiviert 
  606. worden sind. 
  607.  
  608.  
  609. ΓòÉΓòÉΓòÉ 6.2. Typ-Deklarationen ΓòÉΓòÉΓòÉ
  610.  
  611. ΓûÉ TypeDecl      = Ident = Type
  612. ΓûÉ Type          = SimpleType | ArrayType | RecordType | SetType |
  613. ΓûÉ                 PointerType | ProcedureType
  614. ΓûÉ SimpleType    = Qualident | Enumeration | SubrangeType
  615.  
  616. Ein Datentyp bestimmt die Menge der Werte, die Variablen dieses Typs annehmen 
  617. d╨ærfen, sowie die dazugeh╨ñrigen Operatoren. Eine Typ-Deklaration dient dazu, 
  618. einen Namen mit dem Typ in Verbindung zu bringen. Solch eine Verbindung kann 
  619. mit unstrukturierten Typen bestehen, wie z.B.: 
  620.  
  621.  - Elementar-Typen
  622.  - Aufz╨öhlungen
  623.  - Unterbereiche
  624.  - Zeigertypen
  625.  - Prozedur-Typen
  626.  
  627. Oder die Verbindung kann auch mit strukturierten Typen bestehen. In diesem Fall 
  628. beschreibt sie die Strukuren von Variablen diesen Typs, und demzufolge auch die 
  629. Operatoren, welche auf die Komponenten anwendbar sind. Es gibt drei verschieden 
  630. Arten von Strukturen: 
  631.  
  632.  - Verbunde
  633.  - Reihungen
  634.  - Mengen
  635.  
  636. Beispiele f╨ær Typ-Deklarationen: 
  637.  
  638.   TYPE
  639.     Color      = (red, green, blue);
  640.     Index      = [1..80];
  641.     Card       = ARRAY Index OF CHAR;
  642.     Node       = RECORD
  643.       key        : CARDINAL;
  644.       left,right : TreePtr;
  645.                  END;
  646.     Tint       = SET OF Color;
  647.     TrrePtr    = POINTER TO Node;
  648.     Function   = PROCEDURE( CARDINAL ) : CARDINAL;
  649.  
  650.  
  651. ΓòÉΓòÉΓòÉ 6.2.1. Elementare Typen ΓòÉΓòÉΓòÉ
  652.  
  653. Die folgenden elementaren Typen werden durch vordeklarierte Standardnamen 
  654. angegeben. Die Werte von den Elementar-Typen und ihre Anzahl von Bytes, die sie 
  655. im Speicher belegen, sind wie folgt: 
  656.  
  657.   SHORTINT               -128 ...           127      1 byte
  658.   INTEGER             -32 768 ...        32 767      2 bytes
  659.   LONGINT      -2 147 483 648 ... 2 147 483 647      4 bytes
  660.  
  661.   SHORTCARD                 0 ...           255      1 byte
  662.   CARDINAL                  0 ...        65 535      2 bytes
  663.   LONGCARD                  0 ... 4 294 967 296      4 bytes
  664.  
  665.   BOOLEAN      FALSE und TRUE                        1 byte
  666.  
  667.   CHAR         die Zeichen vom erweiterten 8-bit     1 byte
  668.                ASCII set (0X ... 0FFX).
  669.  
  670.   SHORTREAL    [+|-] 1.17E-38  ... 3.37E+38          4 bytes
  671.   LONGREAL     [+|-] 2.23E-308 ... 1.67E+308         8 bytes
  672.  
  673.   REAL         standardm╨össig wie LONGREAL, oder     8 bytes
  674.                wenn Schalter '-R8' gesetzt ist, oder
  675.                wenn Direktive (*$R8*) gesetzt ist.
  676.  
  677.                wie SHORTREAL                         4 bytes
  678.                wenn Schalter '-R4' gesetzt ist, oder
  679.                wenn Direktive (*$R4*) gesetzt ist.
  680.  
  681.  
  682. ΓòÉΓòÉΓòÉ 6.2.2. Aufz╨öhlungen ΓòÉΓòÉΓòÉ
  683.  
  684. ΓûÉ Enumeration    = "(" IdentList ")"
  685. ΓûÉ IdentList       = Ident { "," Ident }
  686.  
  687. Eine Aufz╨öhlung ist eine Liste von Namen, welche die m╨ñglichen Werte angeben, 
  688. den ein Datentyp ausmacht. Diese Namen werden als Konstante im Programm 
  689. benutzt. Nur sie, und keine anderen Werte sonst, geh╨ñren zu diesem Typ. Die 
  690. Werte sind geordnet, und die Ordnungsbeziehung wird durch ihre Reihenfolge in 
  691. der Aufz╨öhlung definiert. Die Ordnungszahl des ersten Wertes ist 0. Eine 
  692. Aufz╨öhlung mit nicht mehr als 256 Werten belegt nur einen Byte im Speicher, 
  693. sonst 2 Bytes. 
  694.  
  695. Beispiele f╨ær Aufz╨öhlungen: 
  696.  
  697.   (red, green, blue)
  698.   (club, diamond, heart, spade)
  699.   (Monday, Tueday, Wednesday, Thursday, Friday, Saturday, Sunday)
  700.  
  701.  
  702. ΓòÉΓòÉΓòÉ 6.2.3. Unterbereichstypen ΓòÉΓòÉΓòÉ
  703.  
  704. ΓûÉ SubrangeType   = [ BaseType ] "[" ConstExpr ".." ConstExpr "]"
  705. ΓûÉ BaseType       = Qualident
  706.  
  707. Ein Typ T kann als ein Unterbereich eines anderen, elementaren Typs oder 
  708. Aufz╨öhlungstyps T1 (ausser Gleitkommas) definiert werden, indem der niedrigste 
  709. und h╨ñchste Wert des Unterbereichs angegeben wird. Die erste Konstante gibt die 
  710. Untergrenze an, und sie darf nicht gr╨ñsser als die Obergrenze sein. Der Typ T1 
  711. dieser Bereichsgrenzen wird auch Basistyp von T genannt, und alle Operatoren, 
  712. die auf Operanden mit Typ T1 anwendbar sind, sind auch anwendbar auf Operanden 
  713. vom Typ T. Ein Wert, der einer Variablen mit einem Unterbereichstyp zugewiesen 
  714. werden soll, muss jedoch innerhalb des angegebenen Intervalls liegen. Der 
  715. Basistyp kann durch einen Namen angegeben werden, welcher dann vor den 
  716. Grenzwerten steht. Er kann in diesem ╨¬bersetzer sogar qualifiziert sein. Wenn 
  717. er weggelassen wird, und wenn die Untergrenze eine nicht negative Zahl ist, 
  718. dann ist der Baistyp ein Kardinaltyp (in diesem ╨¬bersetzer LONGCARD f╨ær 32-bit 
  719. Speichermodelle wie OS/2 2.x/3.0, oder CARDINAL f╨ær 16-bit Modelle); wenn er 
  720. eine negative Zahl ist, dann ist er ein Integer-Typ (in diesem ╨¬bersetzer 
  721. LONGINT f╨ær 32-bit Modelle wie OS/2 2.x/3.0, oder INTEGER f╨ær 16-bit Modelle). 
  722.  
  723. Man sagt, dass ein Typ T1 kompatibel mit einem Typ T0 ist, wenn er entweder als 
  724. T1 = T0 oder als einen Unterbereich von T0 deklariert ist, oder wenn T0 ein 
  725. Unterbereich von T1 ist, oder wenn T0 und T1 beide Unterbereiche vom 
  726. identischen Basistyp sind. 
  727.  
  728. Beispiele f╨ær Unterbereichstypen: 
  729.  
  730.   [ 0 .. N-1 ]
  731.   Color [red .. green]
  732.   [ 'A' .. 'Z' ]
  733.   [ Monday .. Friday ]
  734.  
  735.  
  736. ΓòÉΓòÉΓòÉ 6.2.4. Reihungstypen ΓòÉΓòÉΓòÉ
  737.  
  738. ΓûÉ ArrayType      = ARRAY IndexType { "," IndexType } OF Type
  739. ΓûÉ IndexType      = SimpleType
  740.  
  741. EinReihungstyp ist eine Struktur, welche aus einer festen Anzahl von Elementen 
  742. besteht, die alle gleichen Typs, n╨ömlich dem Komponententyp, sind. Die Elemente 
  743. der Reihung werden durch Indizes bezeichnet, d.h. durch Werte, die zum Indextyp 
  744. geh╨ñren. Die Deklaration eines Reihungstyps gibt sowohl den Komponententyp als 
  745. auch den Indextyp an. Letzterer muss eine Aufz╨öhlung, Unterbereichstyp, oder 
  746. einer der Elementar-Typen BOOLEAN oder CHAR sein. 
  747.  
  748. Eine Deklaration der Form 
  749.  
  750.   ARRAY T1, T2, ... , Tn OF T
  751.  
  752. mit den Indextypen T1 ... Tn ist als eine Abk╨ærzung f╨ær die Deklaration 
  753.  
  754.   ARRAY T1 OF
  755.     ARRAY T2 OF
  756.       ...
  757.       ARRAY Tn OF T
  758.  
  759. zu verstehen. 
  760.  
  761. Beispiele f╨ær Reihungstypen: 
  762.  
  763.   ARRAY [0..N-1] OF CARDINAL
  764.   ARRAY [1..10], [1..20] OF [0..99]
  765.   ARRAY [-10..+10] OF BOOLEAN
  766.   ARRAY WeedDay OF Color
  767.   ARRAY Color OF WeekDay
  768.  
  769.  
  770. ΓòÉΓòÉΓòÉ 6.2.5. Verbundtypen ΓòÉΓòÉΓòÉ
  771.  
  772. ΓûÉ RecordType     = RECORD [ "(" RecordBase ")" ] FieldListSeq END
  773. ΓûÉ RecordBase     = Qualident
  774. ΓûÉ FieldListSeq   = FieldList { ";" FieldList }
  775. ΓûÉ FieldList      = [ IdentList ":" Type | Variants ]
  776. ΓûÉ Variants       = CASE [ Ident ":" ] Qualident
  777. ΓûÉ                  OF VariantList ElseVariant END
  778. ΓûÉ VariantList    = Variant { "|" Variant }
  779. ΓûÉ ElseVariant    = ELSE FieldListSeq
  780. ΓûÉ Variant        = CaseLabelList ":" FieldListSeq
  781. ΓûÉ CaseLabelList  = CaseLabels { "," CaseLabels }
  782. ΓûÉ CaseLabels     = ConstExpr [ ".." ConstExpr ]
  783.  
  784. Ein Verbundtyp (record type) ist eine Struktur, die aus einer festen Anzahl von 
  785. Elementen mit m╨ñglicherweise verschiedenen Datentypen besteht. Die Deklaration 
  786. eines Verbundtyps gibt f╨ær jedes Element, auch Feld oder Mitglied genannt, 
  787. seinen Typ an, ausserdem einen Namen, welcher das Feld angibt. Der 
  788. Sichtbarkeitsbereich dieser Felder liegt innerhalb der Verbunddefinition 
  789. selbst. Aber die Felder sind auch durch Feldbezeichner, welche sich auf 
  790. Elemente von Verbundvariablen beziehen, sichtbar, sowie innerhalb von 
  791. with-Anweisungen. 
  792.  
  793. Ein Verbundtyp kann auch verschiedene variante Sektionen enthalten, von denen 
  794. jede den gleichen Speicher belegt. Der Wert eines Erkennungstyps gibt dabei an, 
  795. um welche Variante der Sektionen es sich dabei handelt. Es ist auch m╨ñglich, 
  796. ein Erkennungsfeld zu benutzen, welches, sofern es mit einem Erkennungsnamen 
  797. und Erkennungstyp deklariert worden ist, den Erkennungswert w╨öhrend der 
  798. Programmlaufzeit speichert. Individuelle variante Strukturen werden durch 
  799. Fallmarken identifiziert. Diese Marken sind Konstanten f╨ær den Erkennungstyp, 
  800. und sie sind m╨ñglicherweise durch ein Erkennungsfeld representiert. 
  801.  
  802. Dieser ╨¬bersetzer bietet in Verbindung mit Verbundtypen auch Objekt-orientierte 
  803. Besonderheiten an, ╨öhnlich der neuen Sprache OBERON. N╨öheres hierr╨æber ist in 
  804. den folgenden Sektionen dieser Dokumentation zu finden: 
  805.  
  806.   - Objekt-orientierte Merkmale
  807.   - Erweiterungen von Verbundtypen
  808.   - Testen dynamischer Verbundtypen
  809.   - Typenschutz-Selektoren
  810.   - Regionaler Typenschutz
  811.   - Typ-gebundene Prozeduren
  812.   - System Object Model
  813.  
  814. Diese Objekt-orientierten Besonderheiten sind nur dann verf╨ægbar, wenn die 
  815. Spracherweiterungen aktiviert sind. 
  816.  
  817.  
  818. ΓòÉΓòÉΓòÉ 6.2.6. Mengentypen ΓòÉΓòÉΓòÉ
  819.  
  820. ΓûÉ SetType        = SET OF SimpleType
  821. ΓûÉ SimpleType     = Qualident | Enumeration | SubrangeType
  822.  
  823. Ein Mengentyp (set type) wird durch ein SET OF T definiert. Er umfasst alle 
  824. Mengen von Werten gem╨öss ihrem Basistyp T. Der Basistyp muss ein Unterbereich 
  825. der ganzen Zahlen zwischen 0 und N-1 sein, oder er muss aus einem Unterbereich 
  826. einer Aufz╨öhlung bestehen, mit h╨ñchstens N Werten. Dabei ist N die maximale 
  827. Anzahl der Elemente. Dieser ╨¬bersetzer akzeptiert bis zu 256 Elemente. Deshalb 
  828. ist auch der Typ SET OF CHAR zul╨össig. 
  829.  
  830. Der vordeklarierte Typ BITSET = SET OF [0..15] ist in allen Programmteilen 
  831. g╨æltig, weil er zu den Standardnamen geh╨ñrt und als solcher automatisch vom 
  832. Modul SYSTEM exportiert wird. 
  833.  
  834.  
  835. ΓòÉΓòÉΓòÉ 6.2.7. Zeigertypen ΓòÉΓòÉΓòÉ
  836.  
  837. ΓûÉ PointerType    = [ NEAR | FAR ] POINTER TO Type
  838.  
  839. Variablen mit einem Zeigertyp (pointer type) P enthalten als Werte Zeiger auf 
  840. Variablen mit einem Typ T. Man sagt, dass der Zeigertyp P an T gebunden ist, 
  841. und dass T der Baistyp vom Zeiger ist. Wenn p eine Variable mit dem Typ P = 
  842. POINTER TO T ist, dann kann sein Wert durch den Aufruf einer Prozedur zur 
  843. Speicheranforderung erzeugt werden, wobei solch eine Prozedur typischerweise in 
  844. einem Modul zur Speicherverwaltung implementiert ist. 
  845.  
  846. Der Aufruf der Standardprozedur NEW(p) wird zu einem ALLOCATE(p,SIZE(T)) 
  847. ╨æbersetzt und sollte vorrangig immer dann benutzt werden, wenn es um die 
  848. Anforderung von dynamischen Speicher geht. Der Aufruf der Standardprozedur 
  849. DISPOSE(p) wird zu einem DEALLOCATE(p) ╨æbersetzt, und sollte vorrangig immer 
  850. dann benutzt werden, wenn ein Zeigerwert mit seinem zugeordneten Speicher 
  851. wieder frei werden soll. Der dahinterstehende Speicher steht danach f╨ær andere 
  852. Anforderungen zur Verf╨ægung. 
  853.  
  854. Wenn die Spracherweiterungen aktiviert sind, kann die angenommene Gr╨ñsse f╨ær 
  855. eine Deklaration eines Zeigertyps durch die Schl╨æsselw╨ñrter NEAR oder FAR 
  856. ╨æberschrieben werden. Dies ist besonders dann n╨ætzlich, wenn man separate 
  857. Speichersegmente ausserhalb vom Speichersegment DGROUP ansprechen m╨ñchte. Die 
  858. voreingestelle Gr╨ñsse von Zeigertypen (NEAR oder FAR) h╨öngt vom Speichermodell 
  859. ab. Sie ist NEAR f╨ær das flache (lineare) Speichermodell von OS/2 2.x/3.0. 
  860.  
  861. Ausser den o.g. Werten kann eine Zeigervariable auch den Wert NIL annehmen, 
  862. wodurch angedeutet werden soll, dass auf keine Variable gezeigt wird. Wenn die 
  863. Spracherweiterungen aktiviert sind, dann k╨ñnnen auch LONGNIL f╨ær FAR Zeiger 
  864. bzw. SHORTNIL f╨ær NEAR Zeiger benutzt werden. 
  865.  
  866.  
  867. ΓòÉΓòÉΓòÉ 6.2.8. Prozedur-Typen ΓòÉΓòÉΓòÉ
  868.  
  869. ΓûÉ ProcedureType  = [ NEAR | FAR ] PROCEDURE [ FormalTypeList ]
  870. ΓûÉ FormalTypeList = "(" FTSectionList ")" [ ":" Qualident ]
  871. ΓûÉ FTSectionList  = [ FTSection { "," FTSection } ]
  872. ΓûÉ FTSection      = [ [ NEAR | FAR ] VAR ] FormalType
  873. ΓûÉ FormalType       = { ARRAY OF } Qualident
  874.  
  875. Variablen eines Prozedur-Typs T k╨ñnnen einen Zeiger auf eine Prozedur P als 
  876. ihren Wert annehmen. Die Typen der formalen Parameter von P m╨æssen dieselben 
  877. sein wie jene aus der formalen Typliste von T. Das gleiche gilt f╨ær den 
  878. Ergebnistyp f╨ær den Fall einer Funktions-Prozedur. P darf weder lokal zu einer 
  879. anderen Prozedur deklariert werden, noch darf sie eine generische 
  880. Standard-Prozedur sein. 
  881.  
  882. Wenn die Spracherweiterungen aktiviert sind, k╨ñnnen die Attribute NEAR oder FAR 
  883. benutzt. FAR gibt zum Beispiel an, dass der Prozedur-Zeiger als Werte 
  884. Prozeduren, die in einem anderen Code-Segment deklariert sind, annehmen kann. 
  885. Im Falle von formalen Parametern deutet FAR VAR an, dass der Parameter als 
  886. Referenz zu einer Variablen aus einem anderen Datensegment (m╨ñglicherweise 
  887. ausserhalb von DGROUP) aufzufassen ist. Dies ist besonders bei 
  888. Speicher-Modellen mit vielen Code- oder Daten-Segmenten n╨ætzlich. 
  889.  
  890.  
  891. ΓòÉΓòÉΓòÉ 6.3. Deklaration von Variablen ΓòÉΓòÉΓòÉ
  892.  
  893. ΓûÉ VarDecl          = VarIdent { "," VarIdent } ":" Type
  894. ΓûÉ VarIdent         = Ident [ FarPointerConst ]
  895. ΓûÉ FarPointerConst  = "[" ConstExpr ":" ConstExpr "]"
  896.  
  897. Die Deklaration von Variablen (variable declaration) dient dazu, neue Variablen 
  898. einzuf╨æhren und sie mit Namen in Verbindung zu bringen. Die Namen m╨æssen dabei 
  899. innerhalb des gegebenen Sichtbarkeitsbereichs eindeutig sein. Durch 
  900. Deklarationen werden auch feste Datentypen mit den Variablen in Verbindung 
  901. gebracht. Alle Variablen, deren Namen innerhalb einer Deklaration in der 
  902. gleichen Liste stehen, haben den selben Typ. 
  903.  
  904. Beispiele f╨ær Deklarationen von Variablen (siehe Beispiele in der Sektion ╨æber 
  905. Typ-Deklarationen): 
  906.  
  907.   i,j,k : INTEGER;
  908.   x,y   : REAL;
  909.   p,q   : BOOLEAN;
  910.   s     : BITSET;
  911.   FUNC  : PROCEDURE( VAR INTEGER, LONGINT ) : BOOLEAN;
  912.   f     : FUNC;
  913.   a     : ARRAY Index OF CARDINAL;
  914.   w     : ARRAY [0..7] OF RECORD
  915.             ch    : CHAR;
  916.             count : CARDINAL;
  917.           END;
  918.   t     : TreePtr;
  919.  
  920. Wenn die Spracherweiterungen aktiviert sind, dann k╨ñnnen Variablen eines 
  921. Zeigertyps nach T0 und VAR-Parameter eines Verbundtyps T0 auch Werte annehmen, 
  922. deren Typ T1 eine Verbund-Erweiterung vom urspr╨ænglich deklarierten Typ T0 
  923. darstellen. 
  924.  
  925.  
  926. ΓòÉΓòÉΓòÉ 6.4. Prozedur-Deklarationen ΓòÉΓòÉΓòÉ
  927.  
  928. ΓûÉ ProcedureDecl    = ProcedureHeading ";" Block Ident |
  929. ΓûÉ                    ProcedureHeading ";" FORWARD
  930. ΓûÉ ProcedureHeading = [ NEAR | FAR ] PROCEDURE
  931. ΓûÉ                    [ Receiver ] Ident [ FormalParameters ]
  932. ΓûÉ Receiver         = "(" [ [ NEAR | FAR ] VAR ] Ident : Ident ")"
  933. ΓûÉ Block            = { Decl } [ BEGIN StmtSeq ] END
  934. ΓûÉ Decl             = CONST { ConstDecl ";" } | TYPE { TypeDecl ";" } |
  935. ΓûÉ                    VAR { VarDecl ";" } | ProcedureDecl | ModuleDecl
  936.  
  937. Prozedur-Deklarationen bestehen aus einem Prozedur-Kopf und einem Block, 
  938. welcher auch Prozedur-K╨ñrper genannt wird. Der Kopf gibt den Namen der Prozedur 
  939. an, ferner enth╨ölt er die formalen Parameter sowie, soweit vorhanden, den 
  940. Ergebnistyp. Der K╨ñrper enth╨ölt Deklarationen und Anweisungen. Der Name der 
  941. Prozedur wird am Ende der Prozedur-Deklaration wiederholt. Wenn die 
  942. Spracherweiterungen eingeschaltet sind, dann darf auch ein optionaler Empf╨önger 
  943. (engl. Receiver) angegeben werden. Der Empf╨önger ist ein erster formaler 
  944. Parameter f╨ær ein Zielobjekt, auf dem die Prozedur angewendet werden soll. Er 
  945. wird nur f╨ær Typ-gebundene Prozeduren gebraucht. Und er ╨öhnelt sehr dem Konzept 
  946. f╨ær Klassen und Methoden aus der neuen Programmiersprache Oberon-2. 
  947.  
  948. Es gibt zwei Arten von Prozeduren, n╨ömlich eigentliche Prozeduren und 
  949. Funktions-Prozeduren. Letztere werden durch einen Funktions-Bezeichner 
  950. innerhalb eines Ausdrucks aktiviert und produzieren ein Ergebnis, dass als ein 
  951. Operand in dem Ausdruck dient. Eigentliche Prozeduren werden durch einen 
  952. Prozedur-Aufruf aktiviert. Die Funktions-Prozedur ist durch Angabe eines 
  953. Resultattyps am Ende der Parameterliste der Deklaration gekennzeichnet. Ihr 
  954. K╨ñrper muss mindestens eine RETURN-Anweisung enthalten, welche das Ergebnis der 
  955. Funktions-Prozedur liefert. 
  956.  
  957. Der K╨ñrper einer Prozedur kann auch als FORWARD deklariert werden. Dadurch wird 
  958. es f╨ær Prozeduren m╨ñglich, sich gegenseitig rekursiv aufzurufen. Eine mit 
  959. FORWARD vordeklarierte Prozedur muss aber sp╨öter im gleichen 
  960. Sichtbarkeitsbereich voll deklariert werden. Dabei muss der Prozedur-Kopf voll 
  961. wiederholt werden, gefolgt von einer vollst╨öndigen Deklaration des 
  962. Prozedur-Blocks. 
  963.  
  964. Wenn die Spracherweiterungen aktiviert sind, dann k╨ñnnen durch die W╨ñrter FAR 
  965. oder NEAR angezeigt werden, ob die Prozeduren im gleichen oder in einem 
  966. separaten Code-Segment liegen. Dies ist f╨ær 16-bit APIs wie jene von MS-Windows 
  967. 3.x von besonderer Bedeutung. Unter OS/2 2.x/3.0 selbst besteht keine 
  968. Notwendigkeit, das dort standardm╨össig angenommene NEAR Attribut zu 
  969. ╨æberschreiben, weil ein 32-bit lineares 'Flat' Speicher-Modell benutzt wird. 
  970.  
  971. Alle Konstanten, Variablen, Typen, Module und Prozeduren, die innerhalb des 
  972. Blocks, d.h. den Prozedur-K╨ñrper, deklariert worden sind, sind lexikalisch als 
  973. lokal zur Prozedur zu betrachten. Die Werte von lokalen Variablen, 
  974. einschliesslich solcher aus lokalen Modulen, sind beim Eintritt der Prozedur 
  975. undefiniert. Denn die lokalen Variablen befinden sich auf dem Stapelspeicher 
  976. (stack). Jedesmal, wenn die Prozedur aufgerufen wird, wird ein neuer Rahmen auf 
  977. dem Stapelspeicher eingerichtet, um die lokalen Variablen aufzunehmen. Sie 
  978. verbleiben dort solange, bis der Prozeduraufruf abgeschlossen ist. Weil auch 
  979. Prozeduren als lokale Objekte deklariert werden k╨ñnnen, d╨ærfen sie geschachtelt 
  980. sein. Jedes Objekt wird auf einer sogenannten Schachtelungsebene deklariert. 
  981. Wenn es zum Beispiel lokal zu einer Prozedur aus der Schachtelungsebene k 
  982. deklariert wird, befindet es sich selbst auf der Schachtelungsebene k+1. 
  983. Objekte, die in dem Modul, das eine ╨¬bersetzungseinheit darstellt, deklariert 
  984. sind, sind per Definition auf der ╨öussersten Schachtelungsebene 0 angesiedelt 
  985. und werden als statische Variablen betrachtet. 
  986.  
  987. Neben den formalen Parametern und den lokalen Objekten sind auch die bisherigen 
  988. Objekte aus der Umgebung der Prozedur, d.h. aus dem Sichtbarkeitsbereich 
  989. auserhalb der Prozedur, f╨ær die Prozedur sichtbar, es sei denn, sie haben 
  990. gleiche Namen wie die lokalen Objekte. 
  991.  
  992. Der Gebrauch eines Prozedur-Namens f╨ær einen Aufruf innerhalb der eigenen 
  993. Deklaration bewirkt eine rekursive Aktivierung der Prozedur, einschliesslich 
  994. der Einrichtung eines neuen Rahmens im Stapelspeicher f╨ær die lokalen 
  995. Variablen. 
  996.  
  997.  
  998. ΓòÉΓòÉΓòÉ 6.4.1. Formale Parameter ΓòÉΓòÉΓòÉ
  999.  
  1000. ΓûÉ FormalParameters = "(" FPSectionList ")" [ ":" Qualident ]
  1001. ΓûÉ FPSectionList    = [ FPSection { ";" FPSection } ]
  1002. ΓûÉ FPSection        = [ [ NEAR | FAR ] VAR ] IdentList ":" FormalType
  1003. ΓûÉ FormalType       = { ARRAY OF } Qualident
  1004.  
  1005. Formale Parameter sind Namen, welche in einem Prozedur-Aufruf die 
  1006. entsprechenden aktuellen Parameter angeben. Der Zusammenhang zwischen den 
  1007. formalen und aktuellen Parametern wird zum Zeitpunkt des Aufrufs einer Prozedur 
  1008. hergestellt. Es gibt zwei Arten von Parametern, n╨ömlich Wert- und 
  1009. Variable-Parameter. Die Art wird in der formalen Parameterliste angegeben. 
  1010. Wert-Parameter stehen f╨ær lokale Variablen, welchen das ausgewertete Ergebnis 
  1011. vom entsprechenden aktuellen Parameter als ihren Anfangswert zugewiesen 
  1012. bekommen. Variable-Parameter haben ihre Entsprechung zu aktuellen Parametern, 
  1013. die Variablen sind, und stehen f╨ær diese Variablen. Sie werden per Referenz 
  1014. weitergereicht, und nicht durch einen Wert. Dabei werden ihre Adressen benutzt. 
  1015. W╨öhrend Variable-Parameter durch das Symbol VAR angedeutet werden, werden 
  1016. Wert-Parameter ohne diesem Symbol eingef╨æhrt. 
  1017.  
  1018. Wenn die Spracherweiterungen aktiviert sind, k╨ñnnen die Variable-Parameter als 
  1019. NEAR oder FAR deklariert sein. Dies dient als einen Hinweis f╨ær die Prozedur, 
  1020. um auf die entsprechenden aktuellen Variablen in einem NEAR Datensegment 
  1021. (namens DGROUP f╨ær diesen ╨¬bersetzer) oder in einem separaten FAR Datensegment 
  1022. zuzugreifen. 
  1023.  
  1024. Formale Parameter sind lokal zu der Prozedur. Das heisst, dass ihr 
  1025. Sichtbarkeitsbereich den Programmtext, welcher die Deklaration der Prozedur 
  1026. ausmacht, umfasst. 
  1027.  
  1028. Der Typ eines jeden formalen Parameters wird in der Parameterliste angegeben. 
  1029. F╨ær Variable-Parameter muss er mit dem entsprechenden aktuellen Parametertyp 
  1030. identisch sein, ausser im Falle eines Verbundtyps bei gleichzeitig aktivierten 
  1031. Spracherweiterungen, wo er dann der Basistyp des entsprechenden aktuellen 
  1032. Parametertyps sein muss. Hinsichtlich der Wert-Parameter gelten die Regeln der 
  1033. Zuweisung. 
  1034.  
  1035. Wenn der formale Parametertyp als ARRAY OF T festgelegt wird, dann spricht man 
  1036. von einem Parameter einer offenen Reihung. Der entsprechende aktuelle Parameter 
  1037. darf dann jede Reihung mit Elementtyp T sein. Wenn die Spracherweiterungen 
  1038. aktiviert sind, kann der Parametertyp sogar aus einer multidimensionalen 
  1039. offenen Reihung bestehen. Ein Parameter einer offenen Reihung kann nur 
  1040. elementweise angesprochen werden, mit einem Indexbereich zwischen 0 und N-1, 
  1041. wobei N die akuelle Anzahl der Elemente bedeutet. Die formale Reihung kann auch 
  1042. als ganzes in einem aktuellen Parameter, dessen formaler Parameter selbst eine 
  1043. offene Reihung ist, auftreten. 
  1044.  
  1045. Eine Funktions-Prozedur ohne Parameter hat eine leere Parameterliste. Sie muss 
  1046. durch einen Bezeichner f╨ær die Funktion mit einer ebenfalls leeren 
  1047. Parameterliste, allerdings mit Klammern, aufgerufen werden. Wenn ein formaler 
  1048. Parameter einen Prozedurtyp bezeichnet, dann muss der entsprechende aktuelle 
  1049. Parameter eine auf der globalen Null-Ebene deklarierte Prozedur sein, oder er 
  1050. muss eine Variable oder ein Parameter dieses Prozedurtyps sein. Er darf nicht 
  1051. eine generische Standard-Prozedur sein. 
  1052.  
  1053. Dieser ╨¬bersetzer akzeptiert auch strukturierte Ergebnistypen. 
  1054.  
  1055.  
  1056. ΓòÉΓòÉΓòÉ 6.4.2. Standard-Prozeduren ΓòÉΓòÉΓòÉ
  1057.  
  1058. Standard-Prozeduren sind (f╨ær diesen ╨¬bersetzer im SYSTEM-Modul) vordefiniert. 
  1059. Einige von ihnen sind lediglich generische Prozeduren, welche nicht explizit 
  1060. deklariert werden k╨ñnnen, und sie gelten f╨ær ganze Klassen von Operandtypen 
  1061. oder sie haben verschiedene m╨ñgliche Formen von Parameterlisten. 
  1062.  
  1063. Die folgenden Standard-Funktionen sind f╨ær diesen ╨¬bersetzer verf╨ægbar: 
  1064.  
  1065.  Prozedur-Name            Beschreibung 
  1066.  
  1067.  ABS( x )                 absoluter Wert; Ergebnistyp = Argumenttyp 
  1068.  
  1069.  CAP( x )                 wenn ch ein Kleinbuchstabe ist: der entsprechende 
  1070.                           Grossbuchstabe. Sonst der gleiche Buchstabe. 
  1071.  
  1072.  CHR( x )                 der Buchstabe mit Ordnungszahl x; CHR(x)=VAL(CHAR,x) 
  1073.  
  1074.  FLOAT( x )               x vom Typ SHORTINT, INTEGER, LONGINT, SHORTCARD, 
  1075.                           CARDINAL, oder LONGCARD, dargestellt als ein Wert vom 
  1076.                           Typ REAL 
  1077.  
  1078.  LONGFLOAT( x )           x vom Typ SHORTINT, INTEGER, LONGINT, SHORTCARD, 
  1079.                           CARDINAL, oder LONGCARD, dargestellt als ein Wert vom 
  1080.                           Typ LONGREAL 
  1081.  
  1082.  SHORTFLOAT( x )          x vom Typ SHORTINT, INTEGER, LONGINT, SHORTCARD, 
  1083.                           CARDINAL, oder LONGCARD, dargestellt als ein Wert vom 
  1084.                           Typ SHORTREAL 
  1085.  
  1086.  HIGH( a )                H╨ñchster Indexwert einer Reihung a 
  1087.  
  1088.  MAX( T )                 der Maximalwert vom Typ T, wobei T einen Elementartyp 
  1089.                           (ausser Gleitkomma), eine Aufz╨öhlung oder einen 
  1090.                           Unterbereichstyp darstellt. 
  1091.  
  1092.  MIN( T )                 der Minimalwert vom Typ T, wobei T einen Elementartyp 
  1093.                           (ausser Gleitkomma), eine Aufz╨öhlung oder einen 
  1094.                           Unterbereichstyp darstellt. 
  1095.  
  1096.  ODD( x )                 x MOD 2 <> 0 
  1097.  
  1098.  ORD( x )                 Ordnungszahl (eines ganzzahligen (cardinal) Typs mit 
  1099.                           gleicher Gr╨ñsse wie x) in der Menge von Werten, 
  1100.                           welche durch Typ T von x definiert sind. T kann jede 
  1101.                           Aufz╨öhlung, CHAR, SHORTINT, INTEGER, LONGINT, 
  1102.                           SHORTCARD, CARDINAL, oder LONGCARD sein. 
  1103.  
  1104.  SIZE( T )                Anzahl der Bytes f╨ær einen angegebenen Typ T. 
  1105.  
  1106.  SIZE( x )                Anzahl der durch eine Variable belegten Bytes f╨ær 
  1107.                           seinen Typ. 
  1108.  
  1109.  TRUNC( x )               Ganzzahliger Anteil (des Typs INTEGER) der 
  1110.                           Gleitkommazahl x (mit Typ REAL, SHORTREAL oder 
  1111.                           LONGREAL). 
  1112.  
  1113.  LONGTRUNC( x )           Ganzzahliger Anteil (des Typs LONGINT) der 
  1114.                           Gleitkommazahl x (mit Typ REAL, SHORTREAL oder 
  1115.                           LONGREAL). 
  1116.  
  1117.  SHORTTRUNC( x )          Ganzzahliger Anteil (des Typs SHORTINT) der 
  1118.                           Gleitkommazahl x (mit Typ REAL, SHORTREAL oder 
  1119.                           LONGREAL). 
  1120.  
  1121.  LONG( x )                In der Gr╨ñsse erweiteter Wert von x, wobei x ein 
  1122.                           Integer-, Cardinal- oder Real- Ausdruck ist, gem╨öss 
  1123.                           den folgenden Regeln: 
  1124.                           SHORTINT->INTEGER, 
  1125.                           INTEGER->LONGINT, 
  1126.                           LONGINT->LONGINT, 
  1127.                           SHORTCARD->CARDINAL, 
  1128.                           CARDINAL->LONGCARD, 
  1129.                           LONGCARD->LONGCARD, 
  1130.                           SHORTREAL->LONGREAL, 
  1131.                           LONGREAL->LONGREAL, 
  1132.                           REAL->LONGREAL 
  1133.  
  1134.  SHORT( x )               In der Gr╨ñsse gek╨ærzter Wert von x, wobei x ein 
  1135.                           Integer-, Cardinal- oder Real- Ausdruck ist, gem╨öss 
  1136.                           den folgenden Regeln: 
  1137.                           LONGINT->INTEGER, 
  1138.                           INTEGER->SHORTINT, 
  1139.                           SHORTINT->SHORTINT, 
  1140.                           LONGCARD->CARDINAL, 
  1141.                           CARDINAL->SHORTCARD, 
  1142.                           SHORTCARD->SHORTCARD, 
  1143.                           LONGREAL->SHORTREAL, 
  1144.                           SHORTREAL->SHORTREAL, 
  1145.                           REAL->SHORTREAL 
  1146.  
  1147.  VAL( T, x )              Der Wert mit der Ordnungszahl x und dem Typ T. T ist 
  1148.                           jede Aufz╨öhlung, CHAR, SHORTINT, INTEGER, LONGINT, 
  1149.                           SHORTCARD, CARDINAL, oder LONGCARD. Es gilt 
  1150.                           VAL(T,ORD(x))=x, wenn x vom Typ T ist. 
  1151.  
  1152.  Die folgenden eigentlichen Standard-Prozeduren sind mit diesem ╨¬bersetzer 
  1153.  verf╨ægbar: 
  1154.  
  1155.  Prozedur-Name            Beschreibung 
  1156.  
  1157.  DEC( x )                 x := x - 1, wobei x als Variable den Typ SHORTINT, 
  1158.                           INTEGER, LONGINT, SHORTCARD, CARDINAL, LONGCARD, 
  1159.                           CHAR, Aufz╨öhlung oder Unterbereich hat. 
  1160.  
  1161.  DEC( x, n )              x := x - 1, wobei x als Variable den Typ SHORTINT, 
  1162.                           INTEGER, LONGINT, SHORTCARD, CARDINAL, LONGCARD, 
  1163.                           CHAR, Aufz╨öhlung oder Unterbereich hat. n muss ein 
  1164.                           kardinaler Ausdruck sein. 
  1165.  
  1166.  EXCL( s, i )             s := s - { i } 
  1167.  
  1168.  HALT                     Terminiere Programmausf╨æhrung 
  1169.  
  1170.  INC( x )                 x := x + 1, wobei x als Variable den Typ SHORTINT, 
  1171.                           INTEGER, LONGINT, SHORTCARD, CARDINAL, LONGCARD, 
  1172.                           CHAR, Aufz╨öhlung oder Unterbereich hat. 
  1173.  
  1174.  INC( x, n )              x := x + 1, wobei x als Variable den Typ SHORTINT, 
  1175.                           INTEGER, LONGINT, SHORTCARD, CARDINAL, LONGCARD, 
  1176.                           CHAR, Aufz╨öhlung oder Unterbereich hat. n muss ein 
  1177.                           kardinaler Ausdruck sein. 
  1178.  
  1179.  INCL( s, i )             s := s - { i } 
  1180.  
  1181.  NEW( p )                 ALLOCATE(p,SIZE(T)); Fordere dynamischen Speicher an 
  1182.                           und weise seine Adresse einem Zeiger p zu. 
  1183.  
  1184.  DISPOSE( p )             DEALLOCATE(p,SIZE(T)); Gebe dynamischen Speicher 
  1185.                           wieder frei und setze p auf NIL. 
  1186.  
  1187.  
  1188. ΓòÉΓòÉΓòÉ 6.5. Module ΓòÉΓòÉΓòÉ
  1189.  
  1190. ΓûÉ ModuleDecl    = MODULE Ident [ Priority ] { Import } [ Export ]
  1191. ΓûÉ                 Block Ident
  1192. ΓûÉ Priority      = [ "[" ConstExpr "]" ]
  1193. ΓûÉ Import        = [ FROM Ident ] IMPORT IdentList ";"
  1194. ΓûÉ Export        = EXPORT [ QUALIFIED ] IdentList ";"
  1195. ΓûÉ IdentList     = Ident { "," Ident }
  1196.  
  1197. Ein Modul ist eine Sammlung von Deklarationen f╨ær Konstanten, Typen, Variablen, 
  1198. Modulen und Prozeduren, und eine Anweisungsfolge. Sie werden durch MODULE und 
  1199. END eingeschlossen. Der Modulkopf enth╨ölt den Modulnamen und m╨ñglicherweise 
  1200. eine Anzahl von Importlisten und eine Exportliste. Eine Importliste bestimmt 
  1201. alle Namen von Objekten, welche ausserhalb deklariert sind, aber innerhalb vom 
  1202. Modul benutzt werden, und daher importiert werden m╨æssen. Die Exportliste 
  1203. bestimmt alle Namen von Objekten, die innerhalb des Moduls deklariert worden 
  1204. sind, aber ausserhalb gebraucht werden. Man kann also sagen, dass ein Modul 
  1205. eine Mauer der Sichtbarkeit seiner lokalen Objekte darstellt, die nach aussen 
  1206. hin streng vom Programmierer kontrolliert wird. 
  1207.  
  1208. Objekte, die lokal zu einem Modul existieren, befinden sich auf der gleichen 
  1209. Schachtelungsebene wie das Modul selbst. Sie k╨ñnnen als lokal zu der Prozedur, 
  1210. welche das Modul umschliesst, betrachtet werden, jedoch mit einer 
  1211. restriktiveren Sichtbarkeit. Der Modulname wird am Ende der Deklaration 
  1212. wiederholt. 
  1213.  
  1214.  
  1215. ΓòÉΓòÉΓòÉ 6.5.1. Zweck lokaler Module ΓòÉΓòÉΓòÉ
  1216.  
  1217. Die Anweisungsfolge, welche den Modulk╨ñrper ausmachen, wird ausgef╨æhrt, wenn 
  1218. die Prozedur oder ╨¬bersetzungseinheit, zu welcher das Modul lokal ist, 
  1219. aufgerufen wird. Sind mehrere Module deklariert, werden diese K╨ñrper in der 
  1220. Reihenfolge ihres Auftretens ausgef╨æhrt. Diese K╨ñrper dienen dazu, lokale 
  1221. Variablen zu initialisieren, und m╨æssen als Prefixe zum Anweisungsteil der sie 
  1222. umschliessenden Prozedur oder ╨¬bersetzungseinheit betrachtet werden. 
  1223.  
  1224. Erscheint ein Name in der Liste der Importe (oder des Exports), darf das 
  1225. angegebene Objekt innerhalb (ausserhalb) des Moduls benutzt werden, so als ob 
  1226. die Modulmauern nicht existierten. Wenn jedoch das Symbol EXPORT durch das 
  1227. Symbol QUALIFIED gefolgt wird, dann m╨æssen die aufgelisteten Namen mit dem 
  1228. Pr╨öfix des Modulnamens versehen werden, um ausserhalb vom Modul benutzt werden 
  1229. zu k╨ñnnen. Solch ein qualifizierter Export tr╨ögt zur Vermeidung von Konflikten 
  1230. mit identischen Namen, welche von anderen Modulen exportiert werden und meist 
  1231. andere Objekte angeben, bei. 
  1232.  
  1233. Ein Modul kann mehrere Importlisten enthalten. Jede von ihnen wird durch eine 
  1234. FROM-Klausel und einem Modulnamen eingeleitet. Die FROM-Klausel bewirkt eine 
  1235. Ausschaltung der ansonsten notwendigen Qualifizierung der importierten Namen. 
  1236. Diese Namen k╨ñnnen nun im Modul so gebraucht werden, als ob sie in einer 
  1237. normalen, nicht qualifizierenden Weise, exportiert worden w╨ören. 
  1238.  
  1239. Wenn ein Verbundtyp exportiert wird, dann werden auch alle seine Felder 
  1240. exportiert. Das gleiche gilt f╨ær die Namen von Konstanten im Falle einer 
  1241. Aufz╨öhlung. 
  1242.  
  1243.  
  1244. ΓòÉΓòÉΓòÉ 6.5.2. Modul-Priorit╨öt ΓòÉΓòÉΓòÉ
  1245.  
  1246. Ein klassiches Problem der gleichzeitigen Abarbeitung mehrerer Aufgaben ist der 
  1247. Austausch von Daten unter verschiedenen Prozessen, zum Beispiel im Rahmen einer 
  1248. Kommunikation unter ihnen. Gew╨ñhnlich werden gemeinsame Variablen zum 
  1249. Datenaustausch unter den Prozessen benutzt. Daraus ergibt sich die Problematik 
  1250. einer harmonierenden Kooperation. Kein Prozess sollte auf gemeinsame Variablen 
  1251. zugreifen, w╨öhrend ein anderer noch eine kritische Aktion mit ihnen durchf╨æhrt. 
  1252. Ein vern╨ænftiger L╨ñsungsansatz zu diesem Problem besteht darin, die gemeinsamen 
  1253. Variablen in einem Modul, welches den wechselseitigen Ausschluss der Prozesse 
  1254. garantiert, einzukapseln. Solch ein Modul ist auch als ein Monitor bekannt. Der 
  1255. Zugriff auf seine lokalen Daten wird, weil sie verborgen sind, auf die 
  1256. Anweisungen der Prozeduren vom Monitor begrenzt. Diese Prozeduren k╨ñnnen 
  1257. exportiert werden. Ein Modul wird durch die Angabe einer Priorit╨öt in seinem 
  1258. Kopf zu einem Monitor erkl╨ört. Die Priorit╨öt ist ein ganzzahliger, kardinaler 
  1259. Wert. 
  1260.  
  1261. Unter OS/2 2.x/3.0 gibt es bis zu 32 verschiedene Priorit╨öten von 0 bis 31. 
  1262. Jede Priorit╨öt hat einen entsprechenden OS/2 Mutex-Semaphor. Durch letzteren 
  1263. werden alle Prozeduren innerhalb  vom Monitor-Modul gegen gleichzeitige 
  1264. Zugriffe von anderen OS/2-Threads gesch╨ætzt. Dieser ╨¬bersetzer bildet Modula's 
  1265. Prozesse auf OS/2-Threads, das heisst den grundlegenden und durch Zeitscheiben 
  1266. gesteuerten Ausf╨æhrungseinheiten, ab. 
  1267.  
  1268.  
  1269. ΓòÉΓòÉΓòÉ 7. Ausdr╨æcke ΓòÉΓòÉΓòÉ
  1270.  
  1271. ΓûÉ Expr            = SimpleExpr [ Relation SimpleExpr ]
  1272. ΓûÉ SimpleExpr      = [ "+" | "-" ] Term { AddOperator Term }
  1273. ΓûÉ Term            = Factor { MulOperator Factor }
  1274. ΓûÉ Factor          = CharConst | Number | String | Set |
  1275. ΓûÉ                   Designator [ ActualParams ] | "(" Expr ")" |
  1276. ΓûÉ                   Not Factor
  1277. ΓûÉ Set             = Qualident "{" [ ElemList ] "}"
  1278. ΓûÉ ElemList        = Elem { "," Elem }
  1279. ΓûÉ Elem            = Expr { ".." Elem }
  1280. ΓûÉ ActualParams    = "(" [ Expr { "," Expr } ] ")"
  1281.  
  1282. Ausdr╨æcke (expressions) sind Konstrukte, die die Regeln der Abarbeitung 
  1283. angeben, wobei Konstanten and laufende Werte von Variablen kombiniert werden 
  1284. d╨ærfen, um durch die Anwendung von Operatoren und Funktions-Prozeduren andere 
  1285. Werte zu erhalten. Ausdr╨æcke bestehen aus Operanden and Operatoren. Klammern 
  1286. d╨ærfen benutzt werden, um abweichende Assoziationen von Operatoren und 
  1287. Operanden auszudr╨æcken. 
  1288.  
  1289. Beispiele f╨ær Ausdr╨æcke (vergleiche Beispiele aus der Sektion ╨æber 
  1290. Variable-Deklarationen): 
  1291.  
  1292.   expression:          denoted type:
  1293.     1980                 CARDINAL
  1294.     k DIV 3              INTEGER
  1295.     NOT p OR q           BOOLEAN
  1296.     (i+j) * (i-j)        CARDINAL
  1297.     s - {8,9,13}         BITSET
  1298.     a[i] + a[j]          CARDINAL
  1299.     a[i+j] * a[i-j]      CARDINAL
  1300.     (0<=k) & (k<100)     BOOLEAN
  1301.     t^.key = 0           BOOLEAN
  1302.     {13..15} <= s        BOOLEAN
  1303.     i IN {0,5..8,15}     BOOLEAN
  1304.  
  1305.  
  1306. ΓòÉΓòÉΓòÉ 7.1. Operanden ΓòÉΓòÉΓòÉ
  1307.  
  1308. ΓûÉ Designator  = Qualident { Selector }
  1309. ΓûÉ Selector    = "." Ident | "[" IndexList "]" | "^" | TypeGuard
  1310. ΓûÉ IndexList   = Expr { "," Expr }
  1311. ΓûÉ TypeGuard   = "(" Qualident ")"
  1312.  
  1313. Mit der Ausnahme literaler Konstanten, das heisst Zahlen, Zeichenketten, 
  1314. Zeichen und Mengen, werden Operanden durch Bezeichner (designator) angegeben. 
  1315. Ein Bezeichner besteht aus einem Namen, der sich auf die Konstante, Variable, 
  1316. oder Prozedur bezieht. Solch ein Name kann auch durch Modulnamen qualifiziert 
  1317. sein, und er kann, falls sich das bezeichnete Objekt auf ein Element einer 
  1318. Struktur bezieht, durch Selektoren gefolgt werden. 
  1319.  
  1320. Wenn die Struktur eine Reihung A ist, dann gibt der Bezeichner A[E] diejenige 
  1321. Komponente an, dessen Index der augenblickliche Wert vom Ausdruck E ist. Der 
  1322. Indextyp von A muss mit dem Typ von E zuweisungskompatibel sein. Ein Bezeichner 
  1323. der Form A[E1,E2,...,En] steht als eine Abk╨ærzung f╨ær A[E1][E2]...[En]. 
  1324.  
  1325. Der Bezeichner P^ gibt die Variable, auf die durch den Zeiger P Bezug genommen 
  1326. wird, an. 
  1327.  
  1328. Wenn R eine strukturierte Variable eines Verbundtyps ist, dann gibt der 
  1329. Bezeichner R.f das Feld f vom Verbund R an. Wenn die Spracherweiterungen 
  1330. aktiviert sind und eine Prozedur m ist mit einem formalen Empf╨öngertyp f╨ær den 
  1331. Typ des Verbunds R deklariert, dann gibt R.m die Typ-gebundene Prozedur an. 
  1332. Ebenfalls, wenn die Spracherweiterungen aktiviert sind, wird durch den 
  1333. Typenschutz v(T0) die Variable v zu einem Ausdruck mit dem Typ T0. Das heisst, 
  1334. dass die Programmausf╨æhrung (in diesem ╨¬bersetzer mit dem R╨æckgabewert 3) 
  1335. abgebrochen wird, wenn der aktuelle Typ nicht T0 ist. Dieser Schutz is 
  1336. anwendbar, wenn 
  1337.      (1) T eine Erweiterung des deklarierten Typs T0 von v ist, und 
  1338.      (2) v ein Variable-Parameter eines Verbundtyps oder v ein Verbundzeiger 
  1339.      ist. 
  1340.  
  1341.  Ist das bezeichnete Objekt eine Variable, dann bezieht der Bezeichner auf den 
  1342.  laufenden Wert der Variablen. Wenn das Objekt eine Funktions-Prozedur ohne 
  1343.  Parameterliste bezeichnet, dann bezieht sich der Bezeichner auf diese 
  1344.  Prozedur. Falls der Bezeichner von einer, m╨ñglicherweise leeren, 
  1345.  Parameterliste gefolgt wird, dann bewirkt der Bezeichner eine Aktivierung der 
  1346.  Prozedur und steht f╨ær den R╨æckgabewert, der sich aus der Ausf╨æhrung der 
  1347.  Prozedur ergibt. Die Typen dieser aktuellen Parameter m╨æssen den formalen 
  1348.  Parametern entsprechen, so wie sie in der Prozedur-Deklaration. beschrieben 
  1349.  sind. 
  1350.  
  1351.  Beispiele f╨ær Bezeichner (siehe Beispiele in der Sektion ╨æber 
  1352.  Variable-Deklarationen): 
  1353.  
  1354.     Designator:     Denoted type:
  1355.       k               INTEGER
  1356.       a[i]            CARDINAL
  1357.       w[3].ch         CHAR
  1358.       t^.key          CARDINAL
  1359.       t^.left^.right  TreePtr
  1360.  
  1361.  
  1362. ΓòÉΓòÉΓòÉ 7.2. Operatoren ΓòÉΓòÉΓòÉ
  1363.  
  1364. ΓûÉ Relation        = "=" | "<>" | "#" | "<" | "<=" | ">" | ">=" | IN | IS
  1365. ΓûÉ AddOperator     = "+" | "-" | OR | XOR
  1366. ΓûÉ MulOperator     = "*" | "/" | DIV | MOD | AND | "&" | SHL | SHR
  1367. ΓûÉ Not             = NOT | "~"
  1368.  
  1369. Die Syntax von Ausdr╨æcken unterscheidet zwischen vier Klassen von Operatoren 
  1370. mit entsprechenden Vorrangregelungen. Die Operatoren '~' und NOT haben den 
  1371. h╨ñchsten Vorrang, gefolgt von Multiplikations-Operatoren, Additions-Operatoren 
  1372. und den Relationen. Operatoren der gleichen Klasse haben eine Assozierung von 
  1373. links nach rechts. Zum Beispiel steht x-y-z f╨ær (x-y)-z. 
  1374.  
  1375.  
  1376. ΓòÉΓòÉΓòÉ 7.2.1. Arithmetische Operatoren ΓòÉΓòÉΓòÉ
  1377.  
  1378. Die folgenden Operatoren sind im Standard-Sprachumfang von Modula-2 definiert: 
  1379.  
  1380.      +         Addition oder Un╨öre Identit╨öt 
  1381.      -         Subtraktion oder un╨öre Vorzeichenumkehr 
  1382.      *         Multiplikation 
  1383.      /         Gleitkomma-Division 
  1384.      DIV       Ganzzahlige Division 
  1385.      MOD       Modulus 
  1386.  
  1387.  Die arithmetischen Operatoren (ausser /) k╨ñnnen auf Operanden der Typen 
  1388.  SHORTINT, INTEGER, LONGINT, SHORTCARD, CARDINAL, oder LONGCARD, oder deren 
  1389.  Unterbereiche angewandt werden. Beide Operanden m╨æssen entweder zu einem 
  1390.  Cardinal-Typ geh╨ñren, oder sie m╨æssen beide zu einem der Integer-Typen 
  1391.  geh╨ñren. Der Ergebnistyp ist immer LONGINT, INTEGER oder SHORTINT, wenn beide 
  1392.  Operanden zu einem Integer-Typ geh╨ñren, und richten sich nach dem gr╨ñssten 
  1393.  Operandentyp. Sonst ist der Ergebnistyp LONGCARD, CARDINAL oder SHORTCARD, 
  1394.  wenn beide Operanden zu den Cardinal-Typen geh╨ñren, und richten sich nach dem 
  1395.  gr╨ñssten Operand. 
  1396.  
  1397.  Die Operatoren '+', '-', und '*' finden auch f╨ær Gleitkomma-Operanden 
  1398.  Anwendung. In diesem Fall m╨æssem beide Operanden zu einem Real-Typ geh╨ñren, 
  1399.  und das Ergebnis ist ein LONGREAL oder SHORTREAL, und richten sich nach dem 
  1400.  gr╨ñssten Operand. Der Divisions-Operator '/' wird nur f╨ær Gleitkomma-Operanden 
  1401.  gebraucht. Die Operatoren '+' und '-' sind auch f╨ær un╨öre Operanden g╨æltig, 
  1402.  und zwar jeweils nur f╨ær einen einzigen Operand. In solchen F╨öllen gibt '-' 
  1403.  die Vorzeichenumkehr an, w╨öhrend '+' einfach die Identit╨öts-Operation 
  1404.  bedeutet, d.h. ohne besondere Berechnungen. Die Vorzeichenumkehr kann auf 
  1405.  Integer- oder Real-Operanden angewandt werden. Die Operatoren DIV und MOD sind 
  1406.  durch folgende Regeln definiert: 
  1407.  
  1408.    x DIV y ist gleich dem ganzzahligen Anteil des Quotienten x / y
  1409.    x MOD y ist gleich dem Rest der Division x DIV y (f╨ær y > 0)
  1410.    x = (x DIV y) * y + (x MOD y), 0 <= (x MOD y) < y
  1411.  
  1412.  Wenn die Spracherweiterungen aktiviert sind, dann k╨ñnnen die folgenden 
  1413.  bit-Operatoren f╨ær Cardinal- oder Integer-Operanden benutzt werden: 
  1414.  
  1415.      OR        Bit-weises Oder 
  1416.      XOR       Bit-weises exklusives Oder 
  1417.      AND       Bit-weises Und 
  1418.      &         Bit-weises Und, wie AND 
  1419.      SHL       Bit-weises Schieben nach links 
  1420.      SHR       Bit-weises Schieben nach rechts 
  1421.      NOT       Un╨öre bit-weise Negierung 
  1422.      ~         Un╨öre bit-weise Negierung 
  1423.  
  1424.  
  1425. ΓòÉΓòÉΓòÉ 7.2.2. Logische Operatoren ΓòÉΓòÉΓòÉ
  1426.  
  1427. Die folgenden logischen Operatoren sind f╨ær den Standard-Sprachumfang von 
  1428. Modula-2 verf╨ægbar. Sie sie f╨ær Bool'sche Operanden anwendbar und produzieren 
  1429. wiederum ein Bool'sches Ergebnis. 
  1430.  
  1431.      OR        logische Konjunktion 
  1432.                p OR q bedeutet "wenn p dann TRUE, sonst q" 
  1433.      AND       logische Disjunktion 
  1434.                p AND q bedeutet "wenn p dann q, sonst FALSE" 
  1435.      &         logische Disjunktion, wie AND 
  1436.                p & q bedeutet "wenn p dann q, sonst FALSE" 
  1437.      NOT       uun╨öre logische Negation 
  1438.  
  1439.  Wenn die Spracherweiterungen aktiviert sind, dann steht auch der folgende 
  1440.  logische Operator f╨ær Bool'sche Operanden zur Verf╨ægung: 
  1441.  
  1442.      XOR       logische exklusive Konjunktion 
  1443.                p XOR q bedeutet "wenn p dann NOT q, sonst q" 
  1444.  
  1445.  
  1446. ΓòÉΓòÉΓòÉ 7.2.3. Mengen-Operatoren ΓòÉΓòÉΓòÉ
  1447.  
  1448. Die folgenden Operatoren finden bei Operanden f╨ær Mengentypen Anwendung und 
  1449. produzieren als Ergebnis den gleichen Typ. 
  1450.  
  1451.      +         Mengen-Vereinigung 
  1452.                x IN (s1 + s2) bedeutet "(x IN s1) OR (x IN s2)" 
  1453.      -         Mengen-Differenz 
  1454.                x IN (s1 - s2) bedeutet "(x IN s1) AND NOT (x IN s2)" 
  1455.      *         Mengen-Durchschnitt 
  1456.                x IN (s1 * s2) bedeutet "(x IN s1) AND (x IN s2)" 
  1457.      /         symmetrische Mengen-Differenz 
  1458.                x IN (s1 / s2) bedeutet "(x IN s1) XOR (x IN s2)" 
  1459.  
  1460.  
  1461. ΓòÉΓòÉΓòÉ 7.2.4. Relationen ΓòÉΓòÉΓòÉ
  1462.  
  1463. Relationen produzieren einen Bool'schen Ergebnistyp. Die Ordnungsrelationen 
  1464. sind auf die Elementar-Typen SHORTINT, INTEGER, LONGINT, SHORTCARD, CARDINAL, 
  1465. LONGCARD, BOOLEAN, CHAR, SHORTREAL, LONGREAL, REAL, und auf Aufz╨öhlungen sowie 
  1466. Unterbereichen anwendbar. 
  1467.  
  1468.      =         gleich 
  1469.      #         ungleich 
  1470.      <>        ungleich, wie # 
  1471.      <         kleiner als 
  1472.      <=        kleiner oder gleich 
  1473.                Einschluss von Mengen 
  1474.      >         gr╨ñsser als 
  1475.      >=        gr╨ñsser oder gleich 
  1476.                Einschluss von Mengen 
  1477.      IN        ist Element von einer Menge 
  1478.      IS        Typentest 
  1479.  
  1480.  Die Relationen '=' und '#' sind auch auf Mengen und Zeiger anwendbar. '<=' und 
  1481.  '>=' auf Mengen angewandt, bedeuten deren (nicht echtes) Enthalten-Sein. Die 
  1482.  Relation IN pr╨æft das Vorhanden-Sein eines Elements in einer Menge. In einem 
  1483.  Ausdruck der Art x IN s muss s vom Typ SET OF T sein, wobei T der Typ von x 
  1484.  oder mit ihm kompatibel sein muss. 
  1485.  
  1486.  Die Relation IS ist nur dann verf╨ægbar wenn die Spracherweiterungen aktiviert 
  1487.  sind. v IS T steht f╨ær 'v ist vom Typ T' und wird in einem Typentest benutzt. 
  1488.  Er ist anwendbar, wenn 
  1489.      (1) T ist eine Erweiterung des deklarierten Typs T0 von v ist, und 
  1490.      (2) v ein Variable-Parameter eines Verbundtyps oder v ein Verbundzeiger 
  1491.      ist. 
  1492.  Wenn zum Beispiel T eine Erweiterung von T0 ist, und v ein Bezeichner mit dem 
  1493.  deklariertem Typ T0 ist, dann pr╨æft der Test 'v IS T', ob die aktuell 
  1494.  bezeichnete Variable (nicht nur vom Typ T0, sondern auch) vom Typ T ist. Der 
  1495.  Wert von 'NIL IS T' ist nicht definiert. 
  1496.  
  1497.  
  1498. ΓòÉΓòÉΓòÉ 8. Anweisungen ΓòÉΓòÉΓòÉ
  1499.  
  1500. ΓûÉ Stmt           = [ Assignment | ProcedureCall | IfStmt | CaseStmt |
  1501. ΓûÉ                  WhileStmt | RepeatStmt | LoopStmt | ForStmt |
  1502. ΓûÉ                  WithStmt | EXIT | ReturnStmt ]
  1503.  
  1504. Anweisungen (statements) geben die Programmausf╨æhrung an. Es gibt elementare 
  1505. und strukturierte Anweisungen. Elementare Anweisungen setzen sich nicht aus 
  1506. Teilen, die selbst wiederum Anweisungen enthalten, zusammen, wie dies bei den 
  1507. strukturierten Anweisungen der Fall ist. Strukturierte Anweisungen werden 
  1508. benutzt, um Sequenzen auszudr╨æcken, oder um konditionale, selektive, und 
  1509. wiederholte Ausf╨æhrungen zu bewirken. 
  1510.  
  1511. Zu den elementaren Anweisungen geh╨ñren die Zuweisung, der Prozedur-Aufruf, die 
  1512. Return-Anweisung und die Exit-Anweisung. Eine strukturierte Anweisung kann aus 
  1513. einer If-Anweisung, einer Case-Anweisung, einer While-Anweisung, einer 
  1514. Repeat-Anweisung, einer Loop-Anweisung, einer For-Anweisung oder einer 
  1515. With-Anweisung bestehen. Mit der Ausnahme von der With-Anweisung kontrollieren 
  1516. sie den Fluss der Programmausf╨æhrung. 
  1517.  
  1518. Eine Anweisung kann auch leer sein. Sie bezeichnet dann keine Aktion. Die 
  1519. Leer-Anweisung ist miteingeschlossen, um die Zeichensetzungsregeln in 
  1520. Anweisungsfolgen. abzuschw╨öchen. 
  1521.  
  1522.  
  1523. ΓòÉΓòÉΓòÉ 8.1. Zuweisungen ΓòÉΓòÉΓòÉ
  1524.  
  1525. ΓûÉ Assignment     = Designator ":=" Expr
  1526.  
  1527. Eine Zuweisung (assignment) ersetzt den augenblicklichen Wert einer Variablen 
  1528. durch einen neuen Wert, der in einem Ausdruck beschrieben wird. Der 
  1529. Zuweisungs-Operator wird als ':=' geschrieben und als 'ergibt gleich' 
  1530. ausgesprochen. Der Bezeichner links vom Zuweisungs-Operator gibt eine Variable 
  1531. an. Nach Ausf╨æhrung einer Zuweisung enth╨ölt die Variable den neuen Wert, der 
  1532. sich aus der Auswertung des Ausdrucks auf der rechten Seite ergeben hat. Der 
  1533. alte Wert geht verloren. Er wird ╨æberschrieben. 
  1534.  
  1535. Der Typ der Ergebnisvariablen muss mit dem Typ vom Ausdruck auf der rechten 
  1536. Seite Zuweisungs-kompatibel sein. Operanden sind genau dann 
  1537. Zuweisungs-kompatibel, wenn sie entweder beide kompatibel sind oder beide 
  1538. Integer (SHORTINT, INTEGER, LONGINT) oder Cardinal (SHORTCARD, CARDINAL, 
  1539. LONGCARD) oder entsprechende Unterbereiche f╨ær Integer oder Cardinal sind. 
  1540. Falls jedoch eine Abschneidung der Gr╨ñsse aufgrund einer Zuweisung auftritt, 
  1541. werden die Operanden nicht als Zuweisungs-kompatibel betrachtet. Cardinal- und 
  1542. Integer-Operanden (und deren Unterbereiche) sind ebenfalls 
  1543. Zuweisungs-kompatibel, obwohl sie nicht in Ausdr╨æcken kompatibel sind. 
  1544.  
  1545. Eine Zeichenkette der L╨önge n1 kann einer Reihungsvariablen mit n2 > n1 
  1546. Elementen vom Typ CHAR zugewiesen werden. In diesem Fall wird die Zeichenkette 
  1547. um das Null-Zeichen 0C erweitert. Eine Zeichenkette der L╨önge 1 ist mit dem Typ 
  1548. CHAR kompatibel. 
  1549.  
  1550. Beispiele f╨ær Zuweisungen: 
  1551.  
  1552.   i := k;
  1553.   p := i = j;
  1554.   j := log2( i+j );
  1555.   s := { 2, 3, 5, 7, 11, 13 };
  1556.   a[ i ] := (i + j) * (i - j);
  1557.   t^.key := i;
  1558.   w[ i+1 ].ch := "A";
  1559.  
  1560. Wenn die Spracherweiterungen aktiviert sind, dann darf ein Ausdruck mit einem 
  1561. erweitetem Typ ebenfalls einer Zielvariablen zugewiesen werden. 
  1562.  
  1563.  
  1564. ΓòÉΓòÉΓòÉ 8.2. Prozedur-Aufrufe ΓòÉΓòÉΓòÉ
  1565.  
  1566. ΓûÉ ProcedureCall  = Designator [ ActualParams ]
  1567. ΓûÉ ActualParams   = "(" [ Expr { "," Expr } ] ")"
  1568.  
  1569. Ein Prozedur-Aufruf (procedure call) dient der Aktivierung einer Prozedur. Der 
  1570. Programmfluss wird zwecks weiterer Ausf╨æhrung zur aktivierten Prozedur 
  1571. umgeleitet. Und nach Abschluss der Ausf╨æhrung wird mit der Anweisung, welche 
  1572. dem Prozedur-Aufruf folgt, fortgefahren. Ein Prozedur-Aufruf kann auch eine 
  1573. Liste von aktuellen Parametern enthalten. Diese werden an Stelle von den 
  1574. entsprechenden formalen Parametern, welche in der Prozedur-Deklaration 
  1575. definiert sind, benutzt. Die Positionen von den aktuellen und den formalen 
  1576. Parametern stellen die entsprechenden Beziehungen her. Es gibt zwei Arten von 
  1577. Parametern: Variable- und Wert-Parameter. 
  1578.  
  1579. Bei einem Variable-Parameter kann der aktuelle Parameter nur aus einem 
  1580. Bezeichner, welcher die Variable angibt, bestehen. Wenn er ein Element einer 
  1581. strukturierten Variablen bezeichnet, werden alle Selektoren vor der 
  1582. Substitution von Formal- nach Aktuell-Parameter ausgewertet. All dieses findet 
  1583. vor der eigentlichen Ausf╨æhrung der aufzurufenden Prozedur statt. Falls der 
  1584. Parameter ein Wert-Parameter ist, muss der entsprechende aktuelle Parameter ein 
  1585. Ausdruck sein. Dieser Ausdruck wird vor der eigentlichen Aktivierung der 
  1586. Prozedur ausgewertet, und der sich ergebende Wert wird dem formalen Parameter 
  1587. zugewiesen, so dass er nun wie eine lokale Variable auftritt. 
  1588.  
  1589. Die Typen von entsprechenden aktuellen und formalen Parametern m╨æssen f╨ær 
  1590. Variable-Parameter gleichwertig und f╨ær Wert-Parameter Zuweisungs-kompatibel 
  1591. sein. Wenn die Spracherweiterungen aktiviert sind und wenn der formale 
  1592. Parameter eine Variable eines Verbundtyps oder ein Wert-Parameter eines 
  1593. Verbundzeigers ist, dann kann der aktuelle Parameter ein erweiteter Typ sein, 
  1594. ╨öhnlich den Regeln f╨ær Zuweisungen. 
  1595.  
  1596. Beispiele f╨ær Prozedur-Aufrufe: 
  1597.  
  1598.   Read( i );
  1599.   Write( j*2+1, 6 );
  1600.   INC( a[i] );
  1601.  
  1602.  
  1603. ΓòÉΓòÉΓòÉ 8.3. Anweisungsfolgen ΓòÉΓòÉΓòÉ
  1604.  
  1605. ΓûÉ StmtSeq        = Stmt { ";" Stmt }
  1606.  
  1607. Eine Computer-Verarbeitung ist eine Folge von Aktionen, die einen 
  1608. Anfangszustand in einen Endzustand umwandeln. Vom Endzustand wird die erhoffte 
  1609. Bedingung f╨ærs Ergebnis erwartet. In Modula-2 stellt die Anweisung die 
  1610. grundlegende Ausf╨æhrungseinheit dar. Man kann also die Ausf╨æhrung als eine 
  1611. Folge von Aktionen in Form von Anweisungen (statement sequence) ausdr╨æcken. 
  1612.  
  1613.  Stmt1; Stmt2; Stmt3; ... Stmti; ... Stmtn;
  1614.  
  1615. Das Semikolon dient als Trennungszeichen zwischen zwei Anweisungen. Es deutet 
  1616. an, dass die Aktion einer Anweisung von der Aktion der textuell folgenden 
  1617. Anweisung gefolgt wird. Nur Anweisungen, welche den Ausf╨æhrungsfluss bestimmen, 
  1618. wie zum Beispiel eine Return-Anweisung oder eine Exit-Anweisung oder aber 
  1619. Schleifen-Konstrukte, k╨ñnnen bewirken, dass die Programmausf╨æhrung woanders 
  1620. fortgesetzt wird. 
  1621.  
  1622.  
  1623. ΓòÉΓòÉΓòÉ 8.4. If-Anweisungen ΓòÉΓòÉΓòÉ
  1624.  
  1625. ΓûÉ IfStmt         = IF BoolExpr THEN StmtSeq
  1626. ΓûÉ                  { ELSIF BoolExpr THEN StmtSeq }
  1627. ΓûÉ                  [ ELSE StmtSeq ] END
  1628. ΓûÉ BoolExpr       = Expr
  1629.  
  1630. If-Anweisungen bewirken die bedingte Ausf╨æhrung von gesch╨ætzten Anweisungen. 
  1631. Der Bool'sche Ausdruck, der einer Anweisungsfolge vorrausgeht, dient als ein 
  1632. Schutzmechanismus. Diese Ausdr╨æcke werden in der Reihenfolge ihres Auftretens 
  1633. solange ausgewertet, bis einer TRUE ergibt, und eine darauffolgende Ausf╨æhrung 
  1634. der zugeh╨ñrigen Anweisungsfolge bewirkt. Wenn keiner der Bool'schen Ausdr╨æcke 
  1635. TRUE ergibt, dann wird, fall vorhanden, die Anweisungsfolge, die dem Symbol 
  1636. ELSE folgt, zur Ausf╨æhrung gebracht. 
  1637.  
  1638. Beispiele: 
  1639.  
  1640.   IF (ch >= "A") & (ch <= "Z") THEN
  1641.     ReadIdentifier
  1642.   ELSIF (ch >= '0') & (ch <= '9') THEN
  1643.     ReadNumber
  1644.   ELSIF ch = '"' THEN
  1645.     ReadString( '"' );
  1646.   ELSIF ch = "'" THEN
  1647.     ReadString( "'" );
  1648.   ELSE
  1649.     SpecialCharacter
  1650.   END;
  1651.  
  1652.  
  1653. ΓòÉΓòÉΓòÉ 8.5. Case-Anweisungen ΓòÉΓòÉΓòÉ
  1654.  
  1655. ΓûÉ CaseStmt       = CASE Expr OF Case { "|" Case } [ ELSE StmtSeq ] END
  1656. ΓûÉ Case           = CaseLabelList ":" StmtSeq
  1657. ΓûÉ CaseLabelList  = CaseLabels { "," CaseLabels }
  1658. ΓûÉ CaseLabels     = ConstExpr [ ".." ConstExpr ]
  1659.  
  1660. Case-Anweisungen bestimmen die Selektion und Ausf╨æhrung einer Anweisungsfolge 
  1661. gem╨öss dem Wert eines Ausdrucks. Zuerst wird dieser Case-Ausdruck berechnet. 
  1662. Dann wird diejenige Anweisungsfolge ausgef╨æhrt, deren Liste von Fallmarken den 
  1663. berechneten Wert enth╨ölt. Der Typ vom Case-Ausdruck darf nur ein Elementar-Typ 
  1664. (ausser Gleitkommas), eine Aufz╨öhlung, oder ein Unterbereich sein. Alle 
  1665. Fallmarken m╨æssen mit diesem Typ streng kompatibel sein. Fallmarken sind 
  1666. Konstanten, von denen kein Wert mehrfach vorkommen darf. Wenn der Wert vom 
  1667. Ausdruck in keinem der F╨ölle als Fallmarke vorkommt, dann wird, falls 
  1668. vorhanden, die Anweisungsfolge, die dem Symbol ELSE folgt, zur Ausf╨æhrung 
  1669. gebracht. 
  1670.  
  1671. Beispiele: 
  1672.  
  1673.   CASE ch OF
  1674.     "A".."Z"  : ReadIdentifier;
  1675.   | "0".."9"  : ReadNumber;
  1676.   | "'" , '"' : ReadString( ch );
  1677.   ELSE          SpecialCharacter;
  1678.   END;
  1679.  
  1680.  
  1681. ΓòÉΓòÉΓòÉ 8.6. While-Anweisungen ΓòÉΓòÉΓòÉ
  1682.  
  1683. ΓûÉ WhileStmt      = WHILE BoolExpr DO StmtSeq END
  1684. ΓûÉ BoolExpr       = Expr
  1685.  
  1686. While-Anweisungen bewirken eine Wiederholung. Wenn der Bool'sche Ausdruck TRUE 
  1687. ergibt, wird die Anweisungsfolge ausgef╨æhrt. Die Auswertung des Ausdrucks und 
  1688. die Ausf╨æhrung der Anweisungsfolge werden wiederholt, solange der Bool'sche 
  1689. Wert TRUE ergibt. 
  1690.  
  1691. Beispiele: 
  1692.  
  1693.   WHILE j > 0 DO
  1694.     j := j DIV 2;
  1695.     i := i + 1
  1696.   END;
  1697.  
  1698.   WHILE i # j DO
  1699.     IF i > j THEN
  1700.       i := i - j;
  1701.     ELSE
  1702.       j := j - i;
  1703.     END;
  1704.   END;
  1705.  
  1706.   WHILE (t # NIL) & (t^.key # i) DO
  1707.     t := t^.left
  1708.   END;
  1709.  
  1710.  
  1711. ΓòÉΓòÉΓòÉ 8.7. Repeat-Anweisungen ΓòÉΓòÉΓòÉ
  1712.  
  1713. ΓûÉ RepeatStmt     = REPEAT StmtSeq UNTIL BoolExpr
  1714. ΓûÉ BoolExpr       = Expr
  1715.  
  1716. Repeat-Anweisungen bewirken eine wiederholte Ausf╨æhrung einer Anweisungsfolge, 
  1717. in zwar in Abh╨öngigkeit vom Wert eines Bool'schen Ausdrucks. Der Ausdruck wird 
  1718. nach jeder Ausf╨æhrung der Anweisungsfolge erneut ausgewertet, und die 
  1719. Wiederholung wird beendet, sobald der Ausdruck den Wert TRUE ergibt. Die 
  1720. Anweisungsfolge wird mindestens einmal ausgef╨æhrt. 
  1721.  
  1722. Beispiele: 
  1723.  
  1724.   REPEAT
  1725.     k := i MOD j;
  1726.     i := j;
  1727.     j := k;
  1728.   UNTIL j = 0;
  1729.  
  1730.  
  1731. ΓòÉΓòÉΓòÉ 8.8. For-Anweisungen ΓòÉΓòÉΓòÉ
  1732.  
  1733. ΓûÉ ForStmt        = FOR ControlVar ":=" Expr TO Expr [ BY ConstExpr ]
  1734. ΓûÉ                  DO StmtSeq END
  1735. ΓûÉ ControlVar     = Ident
  1736. ΓûÉ ConstExpr      = Expr
  1737.  
  1738. Eine For-Anweisung bewirkt eine bestimmte Anzahl von wiederholten Ausf╨æhrungen 
  1739. einer Anweisungsfolge, wobei ein laufend inkrementierter oder dekrementierter 
  1740. Wert einer Integer- oder Cardinal-Variablen zugewiesen wird. Diese Variable 
  1741. nennt man die Kontrollvariable einer For-Anweisung. Die Kontrollvariable darf 
  1742. nicht die Komponente einer strukturierten Variablen sein, auch darf sie weder 
  1743. importiert noch ein Parameter sein, es sei denn, dass die Spracherweiterungen 
  1744. aktiviert sind. 
  1745.  
  1746. Die Anweisung 
  1747.  
  1748.   FOR v := low TO high BY step DO
  1749.     statements
  1750.   END;
  1751. ist gleichbedeutend mit 
  1752.  
  1753.   v := low;
  1754.   temp := high;
  1755.   IF step > 0 THEN
  1756.     WHILE v <= temp DO
  1757.       statements;
  1758.       v := v + step;
  1759.     END;
  1760.   ELSE
  1761.     WHILE v >= temp DO
  1762.       statements;
  1763.       v := v + step;
  1764.     END;
  1765.   END;
  1766.  
  1767. 'low' muss mit 'v' Zuweisungs-kompatibel sein, 'high' muss mit 'v' kompatibel 
  1768. (das heisst vergleichbar) sein, und 'step' muss ein konstanter Ausdruck 
  1769. ungleich Null sein, und zwar f╨ær einen Integer- oder Cardinal-Typ. Falls 'step' 
  1770. nicht angegeben ist, dann wird 1 als sein Wert angenommen. 
  1771.  
  1772. Beispiele: 
  1773.  
  1774.   FOR i := 1 TO 80 DO
  1775.     j := j + a[ i ];
  1776.   END;
  1777.  
  1778.   FOR i := 80 TO 2 BY -1 DO
  1779.     a[ i ] := a[ i-1 ];
  1780.   END;
  1781.  
  1782.  
  1783. ΓòÉΓòÉΓòÉ 8.9. Loop/Exit-Anweisungen ΓòÉΓòÉΓòÉ
  1784.  
  1785. ΓûÉ Stmt           = LoopStmt | EXIT
  1786. ΓûÉ LoopStmt       = LOOP StmtSeq END
  1787.  
  1788. Eine Loop-Anweisung bewirkt die wiederholte Ausf╨æhrung einer Anweisungsfolge. 
  1789. Sie wird durch die Ausf╨æhrung einer EXIT-Anweisung innerhalb der Folge beendet. 
  1790.  
  1791. Eine Exit-Anweisung wird durch das Symbol EXIT angegeben. Sie bewirkt die 
  1792. Terminierung der sie umschliessenden Loop-Anweisung und die Fortsetzung mit 
  1793. derjenigen Anweisung, die der Loop-Anweisung folgt. Exit-Anweisungen stehen im 
  1794. Zusammenhang mit der Loop-Anweisung, von welcher sie umgeben sind, trotz ihrer 
  1795. syntaktischen Unabh╨öngigkeit. Dieser ╨¬bersetzer gibt jedoch eine Warnung aus, 
  1796. wenn ein EXIT ohne umschliessende Loop-Anweisung gefunden wird. 
  1797.  
  1798. Loop-Exit-Anweisungen sind n╨ætzlich, um Wiederholungen mit verschiedenen 
  1799. Austrittspunkten programmieren zu k╨ñnnen, oder um eine Austrittsbedingung in 
  1800. der Mitte einer wiederholten Anweisungsfolge auszudr╨æcken. 
  1801.  
  1802. Beispiel: 
  1803.  
  1804.   LOOP
  1805.     ReadInt( i );
  1806.     IF i < 0 THEN
  1807.       EXIT;
  1808.     END;
  1809.     WriteInt( i );
  1810.   END;
  1811.  
  1812.  
  1813. ΓòÉΓòÉΓòÉ 8.10. With-Anweisungen ΓòÉΓòÉΓòÉ
  1814.  
  1815. ΓûÉ WithStmt       = WITH RecDesignator DO StmtSeq END
  1816. ΓûÉ RecDesignator  = Designator | Guard
  1817. ΓûÉ Guard          = Qualident ":" Qualident
  1818.  
  1819. Die With-Anweisung besteht aus einer Verbundvariablen und einer 
  1820. Anweisungsfolge. In diesen Anweisungen kann die Qualifikation von Feldnamen 
  1821. weggelassen werden, sofern sie sich auf die Variable, welche in der 
  1822. With-Klausel angegeben ist, bezieht. Gibt der Bezeichner eine Komponente einer 
  1823. strukturierten Variablen an, wird der Selektor vor der Anweisungsfolge genau 
  1824. einmal ausgewertet. Die With-Anweisung er╨ñffnet einen neuen 
  1825. Sichtbarkeitsbereich. 
  1826.  
  1827. Beispiel (vergleiche Beispiele aus der Sektion ╨æber Variable-Deklarationen): 
  1828.  
  1829.   WITH t^ DO
  1830.     key := 0;
  1831.     left := NIL;
  1832.     right := NIL
  1833.   END;
  1834.  
  1835. Wenn die Spracherweiterungen aktiviert sind, dann kann eine With-Anweisung in 
  1836. Abh╨öngigkeit vom Ergebnis eines Typentests eine Anweisungsfolge ausf╨æhren und 
  1837. wendet dabei f╨ær jedes Auftreten dieser Verbundvariable innerhalb der 
  1838. Anweisungsfolge einen Typenschutz an. 
  1839.  
  1840. Wenn 'v' ein Variable-Parameter eines Verbundtyps oder ein Verbundzeiger ist, 
  1841. mit dem dazugeh╨ñrigen statischen Typ T0', dann hat die Anweisung 
  1842.  
  1843.   WITH v : T1 DO ... END
  1844.  
  1845. die folgende Bedeutung: Wenn 'T1' der dynamische Typ von 'v' ist, dann wird die 
  1846. Anweisungsfolge ausgef╨æhrt, wobei 'v' so betrachtet wird, als w╨öre der 
  1847. dazugeh╨ñrige Typ 'T1'; sonst wird die Programmausf╨æhrung gestoppt (mit einem 
  1848. R╨æckgabewert von 3 bei diesem ╨¬bersetzer) 
  1849.  
  1850. Beispiel: 
  1851.  
  1852.   TYPE
  1853.     (* basic employee structure *)
  1854.     Employee      = POINTER TO EmployeeDesc;
  1855.     EmployeeDesc  = RECORD
  1856.       Name          : ARRAY [0..30] OF CHAR;
  1857.       Salary        : REAL;
  1858.                     END;
  1859.     (* extended employee record for secretaries *)
  1860.     Secretary     = POINTER TO SecretaryDesc;
  1861.     SecretaryDesc = RECORD( Employee )
  1862.       Bonus         : REAL;
  1863.                     END;
  1864.   VAR
  1865.     EmployeeVar   : Employee;
  1866.  
  1867.   (* .............................. *)
  1868.  
  1869.   WITH EmployeeVar : Secretary DO
  1870.     Employee^.Salary := 1234.00;
  1871.     Employee^.Bonus := 77.00;
  1872.   END;
  1873.  
  1874. Der regionale Typenschutz er╨ñffnet nicht einen neuen Sichtbarkeitsbereich, aber 
  1875. ein lokaler Typenschutz in der With-Klausel sehr wohl. 
  1876.  
  1877. Das gleiche Beispiel mit einem lokalen Typenschutz: 
  1878.  
  1879.   WITH EmployeeVar( Secretary )^ DO
  1880.     Salary := 1234.00;
  1881.     Bonus := 77.00;
  1882.   END;
  1883.  
  1884.  
  1885. ΓòÉΓòÉΓòÉ 8.11. Return-Anweisungen ΓòÉΓòÉΓòÉ
  1886.  
  1887. ΓûÉ ReturnStmt     = RETURN [ Expr ]
  1888.  
  1889. Eine Return-Anweisung bewirkt die Terminierung einer Prozedur. Sie wird durch 
  1890. das Symbol RETURN, gefolgt von einem m╨ñglichem Ausdruck, angegeben, wenn die 
  1891. Prozedur eine Funktion ist. Der Typ von diesem Ausdruck muss mit dem 
  1892. Ergebnistyp, welcher im Prozedurkopf erk╨ört worden ist, Zuweisungs-kompatibel 
  1893. sein. 
  1894.  
  1895. Funktions-Prozeduren erforden die Anwesenheit mindestens einer 
  1896. Return-Anweisung, welche den Ergebniswert beinhaltet. In eigentlichen 
  1897. Prozeduren kann die Return-Anweisung fehlen und wird dann am Ende vom 
  1898. Prozedur-K╨ñrper angenommen. Jede explizite Return-Anweisung erscheint also als 
  1899. ein zus╨ötzlicher Terminierungspunkt. 
  1900.  
  1901.  
  1902. ΓòÉΓòÉΓòÉ 9. Typen-Vertr╨öglichkeiten ΓòÉΓòÉΓòÉ
  1903.  
  1904. Innerhalb dieser Dokumentation werden Begriffe zur Beschreibung der 
  1905. Kompatibilit╨öt von Typen auf verschiedenen Ebenen benutzt. Diese Sektion gibt 
  1906. eine ╨¬bersicht ╨æber die vollst╨öndigen Definitionen f╨ær die folgenden Begriffe 
  1907. und Kompatibilit╨öts-Regeln: 
  1908.  
  1909.   - Identische Typen
  1910.  - Gleichwertige Typen
  1911.  - Typenerweiterungen
  1912.  - Zuweisungs-Kompatibilit╨öt
  1913.  - Ausdrucks-Kompatibilit╨öt
  1914.  - Erweiterte Ausdrucks-Kompatibilit╨öt
  1915.  - Strenge Ausdrucks-Kompatibilit╨öt
  1916.  - Reihungs-Kompatibilit╨öt
  1917.  - ╨¬bereinstimmung formaler Parameterlisten
  1918.  - Typtransfer-Funktionen
  1919.  
  1920. Die Regeln sind gegen╨æber Standard-Modula-2 etwas erweitert. Dies ist wegen den 
  1921. verschiedenen Gr╨ñssen der Elementartypen und wegen den Spracherweiterungen 
  1922. notwendig. Dennoch ist f╨ær Programme, die sich mit den Typen gem╨öss den 
  1923. Beschreibungen in Wirth's 'Programmierung in Modula-2, 4te Ausgabe' begn╨ægen, 
  1924. eine Abw╨örtsvertr╨öglichkeit gegeben. Der Wirth'sche Standard erw╨öhnt die 
  1925. elementaren Typen INTEGER, LONGINT und CARDINAL, nicht aber SHORTINT, 
  1926. SHORTCARD, oder LONGCARD, in seinem o.g. Buch. Und selbst der LONGINT-Typ wird 
  1927. dort nur kurz erw╨öhnt, ohne n╨öher auf die Auswirkungen hinsichtlich seiner 
  1928. Vertr╨öglichkeitsregeln einzugehen. 
  1929.  
  1930. Dieser ╨¬bersetzer versucht sich so eng wie m╨ñglich an den Wirth'schen Standard 
  1931. zu halten, bietet aber auch SHORT- oder LONG-Versionen f╨ær Integers, Cardinals, 
  1932. und f╨ær die Standardfunktionen TRUNC und FLOAT. 
  1933.  
  1934.  
  1935. ΓòÉΓòÉΓòÉ 9.1. Identische Typen ΓòÉΓòÉΓòÉ
  1936.  
  1937. Zwei Variablen 'a' und 'b' mit den Typen 'Ta' und 'Tb' haben identische Typen, 
  1938. wenn 
  1939.  
  1940.      1.   'Ta' und 'Tb' beide durch denselben Typnamen angegeben werden, oder 
  1941.      2.   'Ta' in einer Typ-Deklaration 'Ta=Tb' mit 'Tb' gleichgesetzt wird, 
  1942.           oder 
  1943.      3.   'a' und 'b' in der gleichen Namensliste einer Deklaration f╨ær eine 
  1944.           Variable, f╨ær ein Feld eines Verbunds, oder f╨ær einen formalen 
  1945.           Parameter (ausser offenen Reihungen) erscheinen. 
  1946.  
  1947.  
  1948. ΓòÉΓòÉΓòÉ 9.2. Gleichwertige Typen ΓòÉΓòÉΓòÉ
  1949.  
  1950. Zwei Typen 'Ta' und 'Tb' sind gleichwertig, wenn 
  1951.  
  1952.      1.   'Ta' und 'Tb' typenidentisch sind, oder wenn 
  1953.      2.   'Ta' und 'Tb' offene Reihungen mit gleichwertigen Elementstypen sind, 
  1954.           oder wenn 
  1955.      3.   'Ta' und 'Tb' Prozedur-Typen beschreiben, deren formale 
  1956.           Parameterlisten ╨æbereinstimmen. 
  1957.  
  1958.  
  1959. ΓòÉΓòÉΓòÉ 9.3. Typenerweiterung von eimem Basityp ΓòÉΓòÉΓòÉ
  1960.  
  1961. Diese Regel gilt nur dann, wenn die Spracherweiterungen aktiviert sind. 
  1962.  
  1963. F╨ær eine Typ-Deklaration 'Tb=RECORD(Ta)...END' ist 'Tb' eine direkte 
  1964. Erweiterung von 'Ta', und 'Ta' ist ein direkter Basistyp von 'Tb'. 
  1965.  
  1966. Ein Typ 'Tb' ist eine Erweiterung von Typ 'Ta', das heisst, 'Ta' ist ein 
  1967. Basistyp von 'Tb', wenn 
  1968.  
  1969.      1.   'Ta' und 'Tb' typenidentisch sind, oder 
  1970.      2.   'Tb' eine direkte Erweiterung einer Erweiterung von 'Ta' ist. 
  1971.  
  1972.  Wenn 'Pa = POINTER TO Ta' ist, und 'Pb = POINTER TO Tb' ist, ist 'Pb' eine 
  1973.  Erweiterung von 'Pa' ('Pa' ist ein Basistyp von 'Pb'), wenn 'Tb' eine 
  1974.  Erweiterung von 'Ta' ist. 
  1975.  
  1976.  
  1977. ΓòÉΓòÉΓòÉ 9.4. Zuweisungs-Kompatibilit╨öt ΓòÉΓòÉΓòÉ
  1978.  
  1979. Ein Ausdruck 'e' mit Typ 'Te' ist Zuweisungs-kompatibel mit einer Variablen 'v' 
  1980. vom Typ 'Tv', wenn eine der folgenden Bedingungen zutrifft: 
  1981.  
  1982.      1.     'Te' und 'Tv' sind typenidentisch. 
  1983.      2.     'Te' und 'Tv' sind Cardinal- oder Integer-Typen und 
  1984.             TSIZE(Tv)>=TSIZE(Te). 
  1985.      3.     'Te' und 'Tv' sind Real-Typen und TSIZE(Tv)>=TSIZE(Te). 
  1986.      4.     'Te' und 'Tv' sind Verbundtypen und 'Te' ist eine Erweiterung von 
  1987.             'Tv' und der dynamische Typ von 'v' ist 'Tv'. 
  1988.      5.     'Te' und 'Tv' sind Zeigertypen und 'Te' ist eine Erweiterung von 
  1989.             'Tv'. 
  1990.      6.     'Tv' ist ein Zeigertyp und 'e' ist NIL. 
  1991.      7.     'Tv' ist eine CHAR- Reihung mit n Elementen, und 'e' ist eine 
  1992.             Zeichenkette-Konstante mit m Zeichen und m < n. 
  1993.      8.     'Tv' ist ein Prozedur-Typ und 'e' ist der Name einer Prozedur deren 
  1994.             formale Parameter mit jenen von 'Tv' ╨æbereinstimmen. 
  1995.      9.     'Tv' oder 'Te' ist einer der SYSTEM-Typen BYTE, WORD, DWORD oder 
  1996.             LONGWORD, FWORD, QWORD, TBYTE und 'TSIZE(Tv)=TSIZE(Te)'. 
  1997.      10.    'Tv' ist der SYSTEM-Typ SHORTADDRESS (oder NEAR ADDRESS f╨ær die 
  1998.             Speicher-Modelle Tiny, Small, Medium, oder Flat32) und 'Te' ist ein 
  1999.             Cardinal-, Integer-, oder NEAR Zeiger-Typ und 
  2000.             'TSIZE(Tv)>=TSIZE(Te)'. 
  2001.      11.    'Tv' ist ein Cardinal-, Integer-, oder NEAR Zeiger-Typ und 'Te' ist 
  2002.             der SYSTEM-Typ SHORTADDRESS (oder NEAR ADDRESS f╨ær die 
  2003.             Speicher-Modelle Tiny, Small, Medium, oder Flat32) und 
  2004.             'TSIZE(Tv)>=TSIZE(Te)'. 
  2005.      12.    Entweder 'Tv' oder 'Ta' ist der SYSTEM-Typ LONGADDRESS (oder FAR 
  2006.             ADDRESS f╨ær die Speicher-Modelle Compact oder Large) und der andere 
  2007.             'Ta' oder 'Tv' ist irgendein FAR Zeigertyp. 
  2008.  
  2009.  
  2010. ΓòÉΓòÉΓòÉ 9.5. Ausdrucks-Kompatibilit╨öt ΓòÉΓòÉΓòÉ
  2011.  
  2012. F╨ær einen gegebenen Operator sind die Typen seiner Operanden Ausdrucks- 
  2013. kompatibel, wenn sie den Bedingugen der folgenden Tabelle, die auch die 
  2014. Ergebnistypen zeigt, entspricht. Es wird angenommen, dass der Zeigertyp 'P1' 
  2015. eine Erweiterung vom Typ 'P0' ist. Wenn die Spracherweiterungen aktiviert sind, 
  2016. dann sind auch einige zus╨ötzliche Ausdrucks-Kompatibilit╨öten verf╨ægbar. 
  2017.  
  2018. Die SYSTEM-Typen SHORTADDRESS, ADDRESS und LONGADDRESS werden wie Cardinals 
  2019. behandelt. Und wenn der Relations-Operator weder '=' noch '#' noch '<>' ist, 
  2020. und wenn der ADDRESS-Typ ein FAR ADDRESS (bzw. LONGADDRESS) ist, dann wird nur 
  2021. der Offset-Teil f╨ær die Berechnung herangezogen. Wenn es FAR ADDRESS (bzw. 
  2022. LONGADDRESS) Operanden in einem relationalen Ausdruck gibt, dann sind nur die 
  2023. '=' oder '#' oder '<>' erlaubt. Wenn es ADDRESS- Operanden in einem 
  2024. nicht-relationalen Ausdruck gibt, dann ist der Ergebnistyp der Typ vom 
  2025. Address-Operand. 
  2026.  
  2027. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2028. ΓöéOperator  ΓöéOperand1      ΓöéOperand2      ΓöéErgebnistyp         Γöé
  2029. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2030. Γöé+ - * DIV ΓöéSHORTINT      ΓöéSHORTINT      Γöékleinster Integer   Γöé
  2031. ΓöéMOD       ΓöéINTEGER       ΓöéINTEGER       Γöéder beide           Γöé
  2032. Γöé          ΓöéLONGINT       ΓöéLONGINT       ΓöéOperandtypen        Γöé
  2033. Γöé          ΓöéUnterbereich  ΓöéUnterbereich  Γöéeinschliesst        Γöé
  2034. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2035. Γöé+ -       ΓöéSHORTINT      Γöé              Γöéidentischer         Γöé
  2036. Γöé          ΓöéINTEGER       Γöé              ΓöéInteger-Typ         Γöé
  2037. Γöé          ΓöéLONGINT       Γöé              Γöé                    Γöé
  2038. Γöé          ΓöéUnterbereich  Γöé              Γöé                    Γöé
  2039. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2040. Γöé+ - *     ΓöéSHORTREAL REALΓöéSHORTREAL REALΓöékleinster Real der  Γöé
  2041. Γöé          ΓöéLONGREAL      ΓöéLONGREAL      Γöébeide Operandtypen  Γöé
  2042. Γöé          Γöé              Γöé              Γöéeinschliesst        Γöé
  2043. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2044. Γöé+ -       ΓöéSHORTREAL REALΓöé              Γöéidentischer Real-TypΓöé
  2045. Γöé          ΓöéLONGREAL      Γöé              Γöé                    Γöé
  2046. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2047. Γöé/         ΓöéSHORTREAL REALΓöéSHORTREAL REALΓöékleinster Real der  Γöé
  2048. Γöé          ΓöéLONGREAL      ΓöéLONGREAL      Γöébeide Operandtypen  Γöé
  2049. Γöé          Γöé              Γöé              Γöéeinschliesst        Γöé
  2050. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2051. Γöé+ - * /   ΓöéMengentyp     Γöéidentischer   Γöéidentischer         Γöé
  2052. Γöé          Γöé              ΓöéMengentyp     ΓöéMengentyp           Γöé
  2053. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2054. ΓöéOR AND &  ΓöéBOOLEAN       ΓöéBOOLEAN       ΓöéBOOLEAN             Γöé
  2055. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2056. ΓöéNOT ~     ΓöéBOOLEAN       Γöé              ΓöéBOOLEAN             Γöé
  2057. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2058. Γöé= <> < <= ΓöéSHORTINT      ΓöéSHORTINT      ΓöéBOOLEAN             Γöé
  2059. Γöé> >= #    ΓöéINTEGER       ΓöéINTEGER       Γöé                    Γöé
  2060. Γöé          ΓöéLONGINT       ΓöéLONGINT       Γöé                    Γöé
  2061. Γöé          Γöéint-UnterbereiΓöéUnterbereich  Γöé                    Γöé
  2062. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2063. Γöé= <> < <= ΓöéSHORTCARD     ΓöéSHORTCARD     ΓöéBOOLEAN             Γöé
  2064. Γöé> >= #    ΓöéCARDINAL      ΓöéCARDINAL      Γöé                    Γöé
  2065. Γöé          ΓöéLONGCARD      ΓöéLONGCARD      Γöé                    Γöé
  2066. Γöé          ΓöéUnterbereich  ΓöéUnterbereich  Γöé                    Γöé
  2067. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2068. Γöé= <> < <= ΓöéSHORTREAL REALΓöéSHORTREAL REALΓöéBOOLEAN             Γöé
  2069. Γöé> >= #    ΓöéLONGREAL      ΓöéLONGREAL      Γöé                    Γöé
  2070. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2071. Γöé= <> < <= ΓöéCHAR          ΓöéCHAR          ΓöéBOOLEAN             Γöé
  2072. Γöé> >= #    ΓöéUnterbereich  ΓöéUnterbereich  Γöé                    Γöé
  2073. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2074. Γöé= <> < <= ΓöéBOOLEAN       ΓöéBOOLEAN       ΓöéBOOLEAN             Γöé
  2075. Γöé> >= #    Γöé              Γöé              Γöé                    Γöé
  2076. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2077. Γöé= <> <= >=ΓöéMengentyp     Γöéidentischer   ΓöéBOOLEAN             Γöé
  2078. Γöé#         Γöé              ΓöéMengentyp     Γöé                    Γöé
  2079. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2080. Γöé= <> #    ΓöéZeigertyp P0  ΓöéZeigertyp P0  ΓöéBOOLEAN             Γöé
  2081. Γöé          Γöéoder P1       Γöéoder P1       Γöé                    Γöé
  2082. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2083. Γöé= <> < <= ΓöéAusz╨öhlung    Γöéidentische    ΓöéBOOLEAN             Γöé
  2084. Γöé> >= #    Γöé              ΓöéAufz╨öhlung    Γöé                    Γöé
  2085. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2086. ΓöéIN        ΓöéSHORTCARD     ΓöéSET OF erster ΓöéBOOLEAN             Γöé
  2087. Γöé          ΓöéSHORTINT CHAR ΓöéTyp           Γöé                    Γöé
  2088. Γöé          ΓöéBOOLEAN       Γöé              Γöé                    Γöé
  2089. Γöé          ΓöéAufz╨öhlung    Γöé              Γöé                    Γöé
  2090. Γöé          ΓöéUnterbereich  Γöé              Γöé                    Γöé
  2091. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2092.  
  2093.  
  2094. ΓòÉΓòÉΓòÉ 9.6. Erweiterte Ausdrucks-Kompatibilit╨öt ΓòÉΓòÉΓòÉ
  2095.  
  2096. Dieser ╨¬bersetzer f╨ær Modula-2 hat zus╨ötzliche Ausdrucks-Kompatibilit╨öten 
  2097. implementiert. Sie sind nur verf╨ægbar, wenn die Spracherweiterungen aktiviert 
  2098. sind, und sie schliessen weitere logische, relationale, und auch Bit-weise 
  2099. Operatoren ein. Typ T1 muss eine Erweiterung von Typ T0 sein f╨ær die Relation 
  2100. 'T0 IS T1'. 
  2101.  
  2102. Die folgende Tabelle zeigt die zus╨ötzlichen Kompatibilit╨öten: 
  2103.  
  2104. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2105. ΓöéOperator  ΓöéOperand1     ΓöéOperand2     ΓöéErgebnistyp         Γöé
  2106. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2107. ΓöéXOR       ΓöéBOOLEAN      ΓöéBOOLEAN      ΓöéBOOLEAN             Γöé
  2108. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2109. ΓöéOR XOR ANDΓöéSHORTINT     ΓöéSHORTINT     Γöékleinster Integer   Γöé
  2110. ΓöéSHL SHR & ΓöéINTEGER      ΓöéINTEGER      Γöéder beide           Γöé
  2111. Γöé          ΓöéLONGINT      ΓöéLONGINT      ΓöéOperandtypen        Γöé
  2112. Γöé          ΓöéUnterbereich ΓöéUnterbereich Γöéeinschliesst.       Γöé
  2113. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2114. ΓöéOR XOR ANDΓöéSHORTCARD    ΓöéSHORTCARD    Γöékleinster Cardinal  Γöé
  2115. ΓöéSHL SHR & ΓöéCARDINAL     ΓöéCARDINAL     Γöéder beide           Γöé
  2116. Γöé          ΓöéLONGCARD     ΓöéLONGCARD     ΓöéOperandtypen        Γöé
  2117. Γöé          ΓöéUnterbereich ΓöéUnterbereich Γöéeinschliesst.       Γöé
  2118. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2119. ΓöéNOT ~     ΓöéSHORTINT     Γöé             Γöéidentischer Integer Γöé
  2120. Γöé          ΓöéINTEGER      Γöé             Γöé                    Γöé
  2121. Γöé          ΓöéLONGINT      Γöé             Γöé                    Γöé
  2122. Γöé          ΓöéUnterbereich Γöé             Γöé                    Γöé
  2123. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2124. ΓöéNOT ~     ΓöéSHORTCARD    Γöé             Γöéidentischer CardinalΓöé
  2125. Γöé          ΓöéCARDINAL     Γöé             Γöé                    Γöé
  2126. Γöé          ΓöéLONGCARD     Γöé             Γöé                    Γöé
  2127. Γöé          ΓöéUnterbereich Γöé             Γöé                    Γöé
  2128. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2129. Γöé= <> #    ΓöéProzedur-Typ Γöéidentischer  Γöéidentischer         Γöé
  2130. Γöé          ΓöéT            ΓöéProzedur-Typ ΓöéProzedur-Typ T      Γöé
  2131. Γöé          Γöé             ΓöéT            Γöé                    Γöé
  2132. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2133. ΓöéIS        ΓöéTyp T0       Γöéerweiteter   ΓöéBOOLEAN             Γöé
  2134. Γöé          Γöé             ΓöéTyp T1       Γöé                    Γöé
  2135. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2136.  
  2137.  
  2138. ΓòÉΓòÉΓòÉ 9.7. Strenge Ausdrucks-Kompatibilit╨öt ΓòÉΓòÉΓòÉ
  2139.  
  2140. Zwei Operanden sind streng kompatibel zueinander, wenn sie Ausdrucks-kompatibel 
  2141. sind, und wenn ihre Typen gleicher Gr╨ñsse sind. Strenge 
  2142. Asudrucks-Kompatibilit╨öt ist f╨ær Operanden in den folgenden Zusammenh╨öngen 
  2143. erforderlich: 
  2144.  
  2145. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  2146. ΓöéKontext        ΓöéOperand1            ΓöéOperand2            Γöé
  2147. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2148. ΓöéCase-Anweisung ΓöéFallmarke           ΓöéCase-Ausdruck       Γöé
  2149. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  2150. ΓöéProzedur-AufrufΓöéaktueller Parameter Γöéformaler            Γöé
  2151. Γöé               Γöé                    ΓöéVAR-Parameter       Γöé
  2152. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  2153.  
  2154.  
  2155. ΓòÉΓòÉΓòÉ 9.8. Reihungs-Kompatibilit╨öt ΓòÉΓòÉΓòÉ
  2156.  
  2157. Ein aktueller Parameter 'a' mit Typ 'Ta' ist Reihungs-kompatibel mit einem 
  2158. formalen Parameter 'f' mit Typ 'Tf', wenn 
  2159.  
  2160.      1.     'Tf' und 'Ta' typenidentisch sind, oder wenn 
  2161.      2.     'Tf' eine offene Reihung ist, und 'Ta' irgendeine Reihung ist, und 
  2162.             deren Element-Typen Reihungs-kompatibel sind, oder wenn 
  2163.      3.     'Tf' ein 'ARRAY OF CHAR' und 'a' eine Zeichenkette ist. 
  2164.  
  2165.  
  2166. ΓòÉΓòÉΓòÉ 9.9. ╨¬bereinstimmung formaler Parameterlisten ΓòÉΓòÉΓòÉ
  2167.  
  2168. Zwei formale Parameterlisten stimmen ╨æberein, wenn 
  2169.  
  2170.      1.     sie die gleiche Anzahl von Parametern haben 
  2171.      2.     und sie entweder identische oder keine Ergebnistypen f╨ær Funktionen 
  2172.             haben, und 
  2173.      3.     die Parameter an den entsprechenden Positionen gleichwertige Typen 
  2174.             haben, und 
  2175.      4.     die Parameter an den entsprechenden Positionen beide entweder Wert- 
  2176.             oder VAR-Parameter sind. 
  2177.  
  2178.  
  2179. ΓòÉΓòÉΓòÉ 9.10. Typtransfer-Funktionen ΓòÉΓòÉΓòÉ
  2180.  
  2181. Neben den Objekten, die vom Pseudo-Modul SYSTEM exportiert werden, gibt es noch 
  2182. eine weitere system-abh╨öngige Eigenschaft. Es handelt sich um die M╨ñglichkeit, 
  2183. einen Typnamen 'T' als den Namen eines Typtransfers zu benutzen, um den Typ des 
  2184. Operands mit dem neuen Typ 'T' zu ╨æberschreiben. Solche Funktionen sind 
  2185. nat╨ærlich stark implementierungs-abh╨öngig, weil keine expliziten Instruktionen 
  2186. zur Konvertierung daran beteiligt sind. Sie reinterpretieren einfach einen 
  2187. Operanden als einen Wert mit einem anderen Typ. Der Programmierer sollte 
  2188. beachten, dass Typtransfers nicht immer f╨ær andere ╨¬bersetzer ╨æbertragbar sind. 
  2189. Obwohl Modula-2 eine typenstrenge Sprache ist, gibt es einige ╨æbertragbare 
  2190. Erleichterungen f╨ær die Pr╨æfungen von Typen, und zwar durch standardisierte 
  2191. Funktionen f╨ær Typtransfers, z.B. VAL(T,x), CHR(x) oder ORD(x), desgleichen 
  2192. standardisierte Funktionen zur ╨₧nderung der Typgr╨ñssen, z.B. SHORT(x) oder 
  2193. LONG(x). 
  2194.  
  2195. Beispiele f╨ær Typtransfers : 
  2196.  
  2197.   VAR  i : SHORTINT;
  2198.   VAR ch : CHAR;
  2199.   VAR  b : BOOLEAN;
  2200.   VAR  v : SHORTREAL;
  2201.   VAR  c : LONGCARD;
  2202.     ....
  2203.   BEGIN
  2204.     (* BOOLEAN b interpreted as SHORTINT *)
  2205.       i := SHORTINT( b );
  2206.     (* BOOLEAN b interpreted as CHAR *)
  2207.       ch := CHAR( b );
  2208.     (* LONGCARD c interpreted as SHORTREAL *)
  2209.       v := SHORTREAL( c );
  2210.   END ....
  2211.  
  2212.  
  2213. ΓòÉΓòÉΓòÉ 10. SYSTEM-Modul ΓòÉΓòÉΓòÉ
  2214.  
  2215. Das Modul SYSTEM enth╨ölt gewisse Konstanten, Typen, Functions-Prozeduren, und 
  2216. eigentliche Prozeduren. Diese sind notwendig, um besondere maschinennahe 
  2217. Operationen f╨ær einen bestimmtem Computer und/oder einem bestimmten 
  2218. Betriebssystem zu implementieren. U.a. geh╨ñren dazu M╨ñglichkeiten, auf Ger╨öte, 
  2219. die vom Computer kontrolliert werden, zuzugreifen, oder aber auch 
  2220. Erleichterungen der strengen, durch die Sprache erzwungenen, Regeln zur 
  2221. Typenvertr╨öglichkeit. 
  2222.  
  2223. Es wird sehr empfohlen, den Gebrauch des Moduls SYSTEM nur auf maschinennahe 
  2224. Module zu beschr╨önken. Solche Module sind dann nat╨ærlich nicht portable und 
  2225. unsicher. Sie sind aber leicht an dem Namen SYSTEM, welcher in der Importliste 
  2226. erscheint, zu erkennen. 
  2227.  
  2228. Hinweis: Da die Objekte, die von SYSTEM importiert werden, speziellen Regeln 
  2229. gehorchen, muss dieses Modul dem ╨¬bersetzer bekannt sein. Es wird daher ein 
  2230. Pseudo-Modul genannt, f╨ær das man kein gesondertes Definitions-Modul schreiben 
  2231. muss. 
  2232.  
  2233. Dieser ╨¬bersetzer hat auch alle Standard-Namen im Modul SYSTEM implementiert, 
  2234. von wo aus sie automatisch zu allen anderen Modulen exportiert werden. 
  2235.  
  2236.  
  2237. ΓòÉΓòÉΓòÉ 10.1. SYSTEM-Konstanten ΓòÉΓòÉΓòÉ
  2238.  
  2239. Die folgenden Konstanten geben das aktive Speicher-Modell, das Ziel- 
  2240. Betriebssystem und die Ziel- Prozessoren an. Sie werden nur qualifiziert 
  2241. exportiert. Ihre Werte werden w╨öhrend des Starts des ╨¬bersetzers automatisch 
  2242. gesetzt. Sie k╨ñnnen jedoch durch entsprechende Schalter von der Befehlszeile 
  2243. beeinflusst werden. Die folgende Tabelle zeigt die m╨ñglichen Konstanten und 
  2244. ihre Werte: 
  2245.  
  2246.      SYSTEM.TinyModel TRUE bei 16-bit-╨¬bersetzung f╨ær Tiny- Speicher-Modell 
  2247.           sonst FALSE 
  2248.      SYSTEM.SmallModel TRUE bei 16-bit-╨¬bersetzung f╨ær Small- Speicher-Modell 
  2249.           sonst FALSE 
  2250.      SYSTEM.MediumModel TRUE bei 16-bit-╨¬bersetzung f╨ær Medium- Speicher-Modell 
  2251.           sonst FALSE 
  2252.      SYSTEM.CompactModel TRUE bei 16-bit-╨¬bersetzung f╨ær Compact- 
  2253.           Speicher-Modell 
  2254.           sonst FALSE 
  2255.      SYSTEM.LargeModel TRUE bei 16-bit-╨¬bersetzung f╨ær Large- Speicher-Modell 
  2256.           sonst FALSE 
  2257.      SYSTEM.Flat32Model TRUE bei 32-bit-╨¬bersetzung f╨ær Flat- Speicher-Modell 
  2258.           sonst FALSE 
  2259.      SYSTEM.DOS TRUE bei ╨¬bersetzung f╨ær DOS, 
  2260.           sonst FALSE 
  2261.      SYSTEM.WIN TRUE bei ╨¬bersetzung f╨ær MS-Windows 3.x, 
  2262.           sonst FALSE 
  2263.      SYSTEM.OS2 TRUE bei ╨¬bersetzung f╨ær OS/2, 
  2264.           sonst FALSE 
  2265.      SYSTEM.Processor 8086 bei ╨¬bersetzung f╨ær 8086/8088 CPU, 
  2266.           80286 bei ╨¬bersetzung f╨ær 80286 CPU, 
  2267.           80386 bei ╨¬bersetzung f╨ær 80386 CPU, 
  2268.           80486 bei ╨¬bersetzung f╨ær 80486 CPU, 
  2269.           80586 bei ╨¬bersetzung f╨ær 80586 (PENTIUM) oder h╨ñhere CPU 
  2270.      SYSTEM.NumericProcessor TRUE wenn ╨¬bersetzung auch f╨ær 80x87 numerischen 
  2271.           Koprozessor, 
  2272.           FALSE wenn kein numerischer Koprozessor angegeben. 
  2273.           Hinweis:OS/2 2.x/3.0 benutzt eine Software-Emulation, wenn kein 
  2274.           numerischer Koprozessor im Computer-System installiert ist. 
  2275.  
  2276.  
  2277. ΓòÉΓòÉΓòÉ 10.2. SYSTEM-Typen ΓòÉΓòÉΓòÉ
  2278.  
  2279. Die Sprache Modula-2 erzwingt gew╨ñhnlich eine strenge Typenpr╨æfung w╨öhrend der 
  2280. ╨¬bersetzung. Diese kann jedoch durch den Gebrauch der SYSTEM-Typen BYTE, WORD, 
  2281. DWORD, FWORD, QWORD oder TBYTE erleichtert werden. F╨ær sie sind keine 
  2282. Operationen ausser der Zuweisung definiert. Wenn jedoch ein formaler Parameter 
  2283. einer Prozedur einen der o.g. Typen enth╨ölt, dann darf der entsprechende 
  2284. aktuelle Typ jeden Typ, der den gleichen Speicherplatz f╨ær eine gegebene 
  2285. Implementation belegt, beinhalten. Wenn der formale Parameter ein 'ARRAY OF T' 
  2286. ist, wobei 'T' einer der o.g. Typen ist, dann darf der entsprechende aktuelle 
  2287. Parameter 'A' jeden Typ beinhalten, solange SIZE(A)=TSIZE(T)*n gilt. Das 
  2288. heisst, dass die Speichergr╨ñsse genau ein Vielfaches der Gr╨ñsse vom Typ 'T' 
  2289. betragen muss. Die folgende Tabelle zeigt die Typgr╨ñssen f╨ær o.g. Typen: 
  2290.  
  2291.      Typ                                Gr╨ñsse 
  2292.  
  2293.      SYSTEM.BYTE                        1 
  2294.      SYSTEM.WORD                        2 
  2295.      SYSTEM.DWORD                       4 
  2296.      SYSTEM.LONGWORD                    wie SYSTEM.DWORD 
  2297.      SYSTEM.FWORD                       6 
  2298.      SYSTEM.QWORD                       8 
  2299.  
  2300.  Die folgenden Zeigertypen sind Ausdrucks-kompatibel und Zuweisungs-kompatibel 
  2301.  mit allen Zeigertypen mit gleichem (m╨ñglicherweise implizitem) NEAR- oder 
  2302.  FAR-Attribut und gleicher Typgr╨ñsse. Wenn sie einen (m╨ñglicherweise 
  2303.  impliziten) NEAR Zeiger angeben, dann sind sie auch mit Cardinal- und 
  2304.  Integer-Typen Zuweisungs-kompatibel. Sie sind wie folgt definiert: 
  2305.  
  2306.      SYSTEM.SHORTADDRESS NEAR POINTER TO BYTE 
  2307.      SYSTEM.ADDRESS Bei einer ╨¬bersetzung f╨ær Compact oder Large 
  2308.           Speicher-Modelle: 
  2309.           FAR POINTER TO BYTE 
  2310.           sonst: 
  2311.           NEAR POINTER TO BYTE 
  2312.      SYSTEM.LONGADDRESS FAR POINTER TO BYTE 
  2313.      SYSTEM.PROCESS SYSTEM.ADDRESS 
  2314.  
  2315.  
  2316. ΓòÉΓòÉΓòÉ 10.3. SYSTEM-Funktions-Prozeduren ΓòÉΓòÉΓòÉ
  2317.  
  2318. Die Funktions-Prozeduren vom Modul SYSTEM bieten elementare Laufzeitdienste und 
  2319. maschinennahe Operationen an. Einige von ihnen sind generisch und werden 
  2320. w╨öhrend der ╨¬bersetzung wie Makros expandiert. Andere sind als echte Prozeduren 
  2321. im Modul SYSTEM.MOD implementiert. In diesem ╨¬berstzer haben auch alle 
  2322. Standard-Funktionen ihren Ursprung im SYSTEM-Modul. 
  2323.  
  2324. Die folgenden Funktions-Prozeduren sind verf╨ægbar und geh╨ñren nicht zu den 
  2325. Standard-Objekten. Sie werden in den folgenden Sektionen beschrieben. 
  2326.  
  2327.   - generisch LEN( a, n )
  2328.  - generisch LEN( a )
  2329.  - generisch TSIZE( T )
  2330.  - generisch DSIZE( a, n )
  2331.  - generisch DSIZE( a )
  2332.  - generisch ADR( x )
  2333.  - generisch LONGADR( x )
  2334.  - generisch SHORTADR( x )
  2335.  - generisch OFS( x )
  2336.  - generisch SEG( x )
  2337.  - generisch currentFile( )
  2338.  - generisch currentLine( )
  2339.  - PROCEDURE GetExitProc( ) : PROC
  2340.  
  2341. Die folgenden Laufzeit-Funktionen sind im SYSTEM-Modul implementiert: 
  2342.  
  2343.  - PROCEDURE TestBit
  2344.   ( Set:ADDRESS; BitPos:SHORTCARD ):BOOLEAN;
  2345.  - PROCEDURE LongMul
  2346.   ( i,j:LONGCARD ):LONGCARD;
  2347.  - PROCEDURE LongIMul
  2348.   ( i,j:LONGINT ):LONGINT;
  2349.  - PROCEDURE LongDiv
  2350.   ( i,j:LONGCARD ):LONGCARD;
  2351.  - PROCEDURE LongIDiv
  2352.   ( i,j:LONGINT ):LONGINT;
  2353.  - PROCEDURE LongMod
  2354.   ( i,j:LONGCARD ):LONGCARD;
  2355.  - PROCEDURE LongIMod
  2356.   ( i,j:LONGINT ):LONGINT;
  2357.  - PROCEDURE LongShl
  2358.   ( i,j:LONGCARD ):LONGCARD;
  2359.  - PROCEDURE LongShr
  2360.   ( i,j:LONGCARD ):LONGCARD;
  2361.  - PROCEDURE LongSar
  2362.   ( i,j:LONGINT ):LONGINT;
  2363.  - PROCEDURE somResolve
  2364.   ( Object : LONGWORD; MethodToken : LONGWORD ) : LONGWORD;
  2365.  - PROCEDURE somFindSMethodOk
  2366.   ( classObject : LONGWORD; idMethod : LONGWORD ) : LONGWORD;
  2367.  - PROCEDURE somGetClass
  2368.   ( Object : LONGWORD ) : LONGWORD;
  2369.  
  2370.  
  2371. ΓòÉΓòÉΓòÉ 10.3.1. SYSTEM-Funktion LEN ΓòÉΓòÉΓòÉ
  2372.  
  2373. Die Funktion LEN(a,n) gibt f╨ær einen Reihungs- Operanden 'a' in der Dimension 
  2374. 'n' die Anzahl der Elemente als eine Cardinal-Zahl zur╨æck. Die Funktion LEN(a) 
  2375. ist gleichbedeutend mit LEN(a,0). Das folgende Beispiel veranschaulicht ihre 
  2376. Verwendung: 
  2377.  
  2378.     ..........
  2379.   FROM SYSTEM IMPORT LEN;
  2380.     ..........
  2381.   CONST
  2382.     Len0 = 15;
  2383.     Len1 = 20;
  2384.     Len2 = 25;
  2385.     ..........
  2386.   VAR
  2387.     A : ARRAY [1..Len0], [1..Len1], [1..Len2] OF INTEGER;
  2388.     i : CARDINAL;
  2389.     j : CARDINAL;
  2390.     k : CARDINAL;
  2391.     ..........
  2392.   BEGIN
  2393.     i := LEN( A );        (* i := 15 *)
  2394.     j := LEN( A, 1 );     (* j := 20 *)
  2395.     k := LEN( A, 2 );     (* k := 25 *)
  2396.   END
  2397.     ..........
  2398.  
  2399.  
  2400. ΓòÉΓòÉΓòÉ 10.3.2. SYSTEM-Funktion TSIZE ΓòÉΓòÉΓòÉ
  2401.  
  2402. Die Funktion TSIZE(T) gibt f╨ær einen gebenen Typ 'T' seine Byte-Gr╨ñsse als eine 
  2403. Cardinal- oder Integer-Zahl zur╨æck. Diese Funktion wird gew╨ñhnlich w╨öhrend der 
  2404. Anforderung von dynamischen Speicher gebraucht. 
  2405.  
  2406. Das folgende Beispiel verdeutlicht die Verwendung: 
  2407.  
  2408.   IMPORT Storage;
  2409.   IMPORT SYSTEM;
  2410.     ...........
  2411.   TYPE
  2412.     A : ARRAY [0..10] OF LONGINT;
  2413.     ...........
  2414.   VAR
  2415.     pa : POINTER TO A;
  2416.     ...........
  2417.   BEGIN
  2418.     (* Allocate 11 * TSIZE( LONGINT ) = 11 * 4 = 44 bytes *)
  2419.     Storage.ALLOCATE( pa, SYSTEM.TSIZE( A ) );
  2420.     ...........
  2421.   END
  2422.     ...........
  2423.  
  2424.  
  2425. ΓòÉΓòÉΓòÉ 10.3.3. SYSTEM-Funktion DSIZE ΓòÉΓòÉΓòÉ
  2426.  
  2427. Die Funktion DSIZE(a,n) gibt f╨ær einen Reihungs- Operanden 'a' in der Dimension 
  2428. 'n' die Operand-Gr╨ñsse als eine Cardinal-Zahl zur╨æck. Die Funktion DSIZE(a) ist 
  2429. gleichbedeutend mit DSIZE(a,0). Das folgende Beispiel verdeutlicht den 
  2430. Gebrauch: 
  2431.  
  2432.     ..........
  2433.   FROM SYSTEM IMPORT DSIZE;
  2434.     ..........
  2435.   CONST
  2436.     Len0 = 15;
  2437.     Len1 = 20;
  2438.     Len2 = 25;
  2439.     ..........
  2440.   VAR
  2441.     A : ARRAY [1..Len0], [1..Len1], [1..Len2] OF INTEGER;
  2442.     i : CARDINAL;
  2443.     j : CARDINAL;
  2444.     k : CARDINAL;
  2445.     ..........
  2446.   BEGIN
  2447.     i := DSIZE( A );        (* i := 15*20*25*TSIZE(INTEGER) *)
  2448.     j := DSIZE( A, 1 );     (* j := 20*25*TSIZE(INTEGER) *)
  2449.     k := DSIZE( A, 2 );     (* k := 25*TSIZE(INTEGER) *)
  2450.   END
  2451.     ..........
  2452.  
  2453.  
  2454. ΓòÉΓòÉΓòÉ 10.3.4. SYSTEM-Funktion ADR ΓòÉΓòÉΓòÉ
  2455.  
  2456. Die Funktion ADR(x) gibt die Adresse eines Operanden 'x' zur╨æck. Der 
  2457. Ergebnistyp ist ADDRESS. Die Funktion ADR(x) verh╨ölt sich wie SHORTADR(x), wenn 
  2458. f╨ær eines der nicht-segmentierten kleinen Daten- Modelle Tiny, Small, Medium 
  2459. oder Flat32 ╨æbersetzt wird. Sonst verh╨ölt sie sich wie ein LONGADR(x), wenn f╨ær 
  2460. eines der segmentierten Daten- Modelle Compact oder Large ╨æbersetzt wird. 
  2461.  
  2462.  
  2463. ΓòÉΓòÉΓòÉ 10.3.5. SYSTEM-Funktion LONGADR ΓòÉΓòÉΓòÉ
  2464.  
  2465. Die Funktion LONGADR(x) gibt die FAR Adresse eines Operanden 'x' zur╨æck. Der 
  2466. Ergebnistyp ist der segmentierte FAR Zeiger LONGADDRESS, welcher mit jedem FAR 
  2467. Zeiger- oder Cardinal- Ausdruck kompatibel ist, und welcher mit jedem FAR 
  2468. Zeiger Zuweisungs-kompatibel ist. 
  2469.  
  2470.  
  2471. ΓòÉΓòÉΓòÉ 10.3.6. SYSTEM-Funktion SHORTADR ΓòÉΓòÉΓòÉ
  2472.  
  2473. Die Function SHORTADR(x) gibt die NEAR Adresse eines Operanden 'x' zur╨æck. Der 
  2474. Ergebnistyp ist der nicht-segmentierte NEAR Zeiger SHORTADDRESS, welcher mit 
  2475. jedem NEAR Zeiger- oder Cardinal- Ausdruck kompatibel ist, und welcher mit 
  2476. jedem NEAR Zeiger-, Cardinal- oder Integer-Operand Zuweisungs-kompatibel ist. 
  2477.  
  2478.  
  2479. ΓòÉΓòÉΓòÉ 10.3.7. SYSTEM-Funktion OFS ΓòÉΓòÉΓòÉ
  2480.  
  2481. Die Funktion OFS(x) gibt den Offset-Anteil der Adresse von einem Operand 'x' 
  2482. zur╨æck. Wenn die Adresse von x eine FAR Adresse ist, dann wird der 
  2483. Segment-Anteil von ihr entfernt. Der Ergebnistyp ist LONGCARD f╨ær 32-bit 
  2484. Speicher-Modelle und CARDINAL f╨ær 16-bit Speicher-Modelle. 
  2485.  
  2486.  
  2487. ΓòÉΓòÉΓòÉ 10.3.8. SYSTEM-Funktion SEG ΓòÉΓòÉΓòÉ
  2488.  
  2489. Die Funktion SEG(x) gibt den Segment-Anteil von der Adresse eines Operanden 'x' 
  2490. zur╨æck. Der Offset-Anteil wird von der Adresse entfernt. Der Ergebnistyp ist 
  2491. CARDINAL. 
  2492.  
  2493.  
  2494. ΓòÉΓòÉΓòÉ 10.3.9. SYSTEM-Funktion currentFile ΓòÉΓòÉΓòÉ
  2495.  
  2496. Die Funktion currentFile() gibt eine Null-terminierte Zeichenkette f╨ær den 
  2497. Dateinamen vom akuell zu ╨æbersetzenden Modul zur╨æck. Diese Funktion wird 
  2498. haupts╨öchlich zur Fehlersuche oder f╨ær Fehlerroutinen gebraucht. 
  2499.  
  2500.  
  2501. ΓòÉΓòÉΓòÉ 10.3.10. SYSTEM function currentLine ΓòÉΓòÉΓòÉ
  2502.  
  2503. Die Funktion currentLine() gibt eine Null-terminierte Zeichenkette f╨ær die 
  2504. Zeilennummer vom aktuell zu ╨æbersetzenden Modul zur╨æck. Diese Funktion wird 
  2505. haupts╨öchlich zur Fehlersuche oder f╨ær Fehlerroutinen gebraucht. 
  2506.  
  2507.  
  2508. ΓòÉΓòÉΓòÉ 10.3.11. SYSTEM-Funktion GetExitProc ΓòÉΓòÉΓòÉ
  2509.  
  2510. Die Prozedur 
  2511.  
  2512.   PROCEDURE GetExitProc() : PROC;
  2513.  
  2514. ist im Modul SYSTEM deklariert. Sie gibt die zuletzt gesetzte Prozedur aus 
  2515. einer Kette von Beendigungs-Prozeduren zur╨æck. Weitere Informationen dar╨æber, 
  2516. wie man eine eigene Modul-spezifische Beendigungs-Prozedur implementieren kann, 
  2517. sind in dieser Dokumentation in der Sektion SetExitProc n╨öher beschrieben. 
  2518.  
  2519.  
  2520. ΓòÉΓòÉΓòÉ 10.4. SYSTEM-Prozeduren ΓòÉΓòÉΓòÉ
  2521.  
  2522. Die eigentlichen Prozeduren aus dem Modul SYSTEM stellen elementare 
  2523. Laufzeitdienste und maschinennahe Operationen zur Verf╨ægung. Einige von ihnen 
  2524. sind generisch und werden w╨öhrend der ╨¬bersetzung wie Makros expandiert. Andere 
  2525. sind als echte Prozeduren im Modul SYSTEM.MOD implementiert. In diesem 
  2526. ╨¬bersetzer haben auch alle Standard-Prozedureen ihren Urprung im SYSTEM-Modul. 
  2527.  
  2528. Die folgenden Prozeduren, welche nicht zum Standard geh╨ñren, sind verf╨ægbar und 
  2529. werden in den folgenden Sektionen n╨öher beschrieben: 
  2530.  
  2531.   - INLINE
  2532.   ( ... )
  2533.  - PROCEDURE IOTRANSFER
  2534.   ( VAR p1,p2:ADDRESS; va:CARDINAL );
  2535.  - PROCEDURE LISTEN
  2536.   ( );
  2537.  - PROCEDURE NEWPROCESS
  2538.   ( p:PROC; a:ADDRESS; n:CARDINAL; VAR p1:ADDRESS );
  2539.  - PROCEDURE TRANSFER
  2540.   ( VAR p1,p2:ADDRESS );
  2541.  - PROCEDURE ExitProgram
  2542.   ( ExitCode:SHORTCARD );
  2543.  - generisch NEW( p )
  2544.  - generisch DISPOSE( p )
  2545.  - PROCEDURE SetExitProc
  2546.   ( UserProc : PROC );
  2547.  
  2548. Die folgenden Laufzeit-Prozeduren sind im SYSTEM-Modul implementiert: 
  2549.  
  2550.  - PROCEDURE OrBytes
  2551.   ( Dest,Source1,Source2:ADDRESS; Size:LONGCARD );
  2552.  - PROCEDURE XorBytes
  2553.   ( Dest,Source1,Source2:ADDRESS; Size:LONGCARD );
  2554.  - PROCEDURE AndBytes
  2555.   ( Dest,Source1,Source2:ADDRESS; Size:LONGCARD );
  2556.  - PROCEDURE MemSet
  2557.   ( Dest:ADDRESS; Val:WORD; Size:LONGCARD );
  2558.  - PROCEDURE MemCmp
  2559.   ( Dest,Source: ADDRESS; Size:LONGCARD );
  2560.  - PROCEDURE MemCpy
  2561.   ( Dest,Source: ADDRESS; Size:LONGCARD );
  2562.  - PROCEDURE SetBitRange
  2563.   ( Dest:ADDRESS; FromBit:SHORTCARD; ToBit:SHORTCARD );
  2564.  - PROCEDURE DelBitRange
  2565.   ( Dest:ADDRESS; FromBit:SHORTCARD; ToBit:SHORTCARD );
  2566.  - PROCEDURE TestBit
  2567.   ( Set:ADDRESS; BitPos:SHORTCARD ):BOOLEAN;
  2568.  - PROCEDURE Push
  2569.   ( Param:ADDRESS; Size:LONGCARD );
  2570.  - PROCEDURE PushString
  2571.   ( Str:ADDRESS; StrSize:LONGCARD; Size:LONGCARD );
  2572.  - PROCEDURE LocalCopy
  2573.   ( VAR Source:ADDRESS; Size:LONGCARD );
  2574.  - PROCEDURE LocalFree
  2575.   ( VAR Source:ADDRESS );
  2576.  - PROCEDURE StartUp
  2577.   ( );
  2578.  - PROCEDURE TypeGuard
  2579.   ( Wanted : TypeDescADDRESS; Actual : TypeDescADDRESS );
  2580.  - PROCEDURE EnterPriority
  2581.   ( Level : SHORTCARD );
  2582.  - PROCEDURE ExitPriority
  2583.   ( );
  2584.  - PROCEDURE LinkVMT
  2585.   ( TypeInfo : TypeDescADDRESS; VMT : TypeDescADDRESS );
  2586.  - PROCEDURE CopyVMT
  2587.   ( Dest, Origin : TypeDescADDRESS; Size : LONGCARD );
  2588.  - PROCEDURE InitVMT
  2589.   ( Dest : TypeDescADDRESS; Size : LONGCARD );
  2590.  - PROCEDURE InitSOM
  2591.   ( );
  2592.  
  2593.  
  2594. ΓòÉΓòÉΓòÉ 10.4.1. Standard-Prozedur NEW ΓòÉΓòÉΓòÉ
  2595.  
  2596. Die Standard-Prozedur NEW hat f╨ær diesen ╨¬bersetzer ihren Ursprung im 
  2597. SYSTEM-Modul. Der Prozedur-Aufruf 
  2598.  
  2599.   NEW( p )
  2600.  
  2601. wird w╨öhrend der ╨¬bersetzung zum Prozedur-Aufruf 
  2602.  
  2603.   ALLOCATE( p, TSIZE( p^ ) )
  2604.  
  2605. expandiert. Er bewirkt die Anforderung von dynamischen Speicher aus dem 
  2606. globalen Stapelspeicher (Heap) und weist dessen Adresse der Zeigervariablen 'p' 
  2607. zu. Die Gr╨ñsse vom angeforderten Speicher entspricht der Gr╨ñsse vom Typ, auf 
  2608. den durch 'p' gezeigt wird. 
  2609.  
  2610. Wenn die Spracherweiterungen aktiviert sind, und wenn 'p' ein Zeiger zu einem 
  2611. Verbundtyp ist, dann wird ein Prozedur-Aufruf 
  2612.  
  2613.   NEW( p )
  2614.  
  2615. in folgende Anweisungsfolge ╨æbersetzt: 
  2616.  
  2617.   ALLOCATE
  2618.  ( p,
  2619.   TSIZE( <type descriptor address> ) +
  2620.   TSIZE( <record type> )
  2621.  );
  2622.  t := p;
  2623.  IF t # NIL THEN
  2624.   IF <extended type> THEN
  2625.    t^ := ADR( <type desciptor> );
  2626.   ELSE
  2627.    t^ := NIL;
  2628.   END;
  2629.   p := ADDRESS( t ) + TSIZE( <type descriptor address> );
  2630.  END;
  2631.  
  2632. Bevor ein Speicherblock f╨ær einen Verbund reserviert wird, m╨æssen einige Bytes 
  2633. f╨ær einen Zeiger zu einem internen Typbeschreiber angefordert werden. Dies 
  2634. geschieht automatisch. Diese zus╨ötzliche Information wird z.B. f╨ær dynamische 
  2635. Typen-Tests f╨ær Verbunde, ferner f╨ær Typenschutz- Selektoren, oder f╨ær einen 
  2636. regionalen Typenschutz gebraucht. 
  2637.  
  2638. Die Standard-Prozedur NEW kann auch zur Erzeugung von Instanzen vom OS/2 System 
  2639. Object Model gebraucht werden. Wenn 'p' als solch einen SOM-Zeiger deklariert 
  2640. worden ist, wird der Prozedur-Aufruf 
  2641.  
  2642.   NEW( p )
  2643.  
  2644. in eine Anweisungsfolge ╨æbersetzt, in welcher mittels statischer 
  2645. Methodenaufl╨ñsung die OS/2-Prozedur 'somNew' gefunden wird, die wiederum per 
  2646. Prozedurzeiger zwecks Erzeugung einer neuen Instanz der gew╨ænschten 
  2647. Objektklasse aufgerufen wird. 
  2648.  
  2649. Dieser ╨¬bersetzer f╨æhrt f╨ær die Code-Generierung verschiedene Optimierungen 
  2650. durch. Zu diesem Zweck wird eine interne Buchf╨æhrung ╨æber den Inhalt aller 
  2651. Zeiger benutzt. Insbesondere nimmt der ╨¬bersetzer an, dass jeder Zeiger, dessen 
  2652. Wert durch ein NEW(p) entstanden ist, nur auf Objekte innerhalb des 
  2653. Stapelspeichers (heap) zeigen kann, nicht aber auf andere Variablen. So kann 
  2654. der Code-Optimierer Zeiger-Werte von ausserhalb des Stapelspeichers (heap) 
  2655. weiterhin in CPU-Register halten. 
  2656.  
  2657.  
  2658. ΓòÉΓòÉΓòÉ 10.4.2. Standard-Prozedur DISPOSE ΓòÉΓòÉΓòÉ
  2659.  
  2660. Die Standard-Prozedur DISPOSE hat f╨ær diesen ╨¬bersetzer ihren Ursprung im 
  2661. SYSTEM-Modul. Der Prozedur-Aufruf 
  2662.  
  2663.   DISPOSE( p )
  2664.  
  2665. wird w╨öhrend der ╨¬bersetzung zum Prozedur-Aufruf 
  2666.  
  2667.   DEALLOCATE( p, TSIZE( p^ ) )
  2668.  
  2669. expandiert. Dies bedeutet, dass ein zuvor angeforderter dynamischer 
  2670. Speicherblock wieder freigesetzt wird und 'p' mit NIL gel╨ñscht wird. Die Gr╨ñsse 
  2671. des freigesetzten Speichers entspricht der Gr╨ñsse vom Typ, auf den 'p' zeigen 
  2672. kann. 
  2673.  
  2674. Wenn die Spracherweiterungen aktiviert sind, und wenn 'p' ein Zeiger zum einem 
  2675. Verbund ist, dann wird ein Prozedur-Aufruf 
  2676.  
  2677.   DISPOSE( p )
  2678.  
  2679. in die folgende Anweisungsfolge ╨æbersetzt: 
  2680.  
  2681.   p := ADDRESS( p ) - TSIZE( <type descriptor address> );
  2682.  DEALLOCATE
  2683.  ( p,
  2684.   TSIZE( record type ) +
  2685.   TSIZE( <type descriptor address> )
  2686.  );
  2687.  
  2688. Das bedeutet, dass 'p' erst um die Gr╨ñsse der Adresse von einem intern 
  2689. gef╨æhrten Typbeschreiber dekrementiert wird. Erst danach wird der Speicher 
  2690. freigesetzt. Denn jeder zugeordnete Speicherblock f╨ær Verbunde enth╨ölt in den 
  2691. ersten Bytes vor dem Verbundspeicher einen Zeiger zu einem Typbeschreiber, und 
  2692. diese Bytes m╨æssen auch freigesetzt werden. 
  2693.  
  2694. Die Standard-Prozedur DISPOSE kann auch zur Freisetzung von Instanzen vom OS/2 
  2695. System Object Model gebraucht werden. Wenn 'p' als solch einen SOM-Zeiger 
  2696. deklariert worden ist, dann wird der Prozedur-Aufruf 
  2697.  
  2698.   DISPOSE( p )
  2699.  
  2700. in eine Anweisungsfolge ╨æbersetzt, in welcher mittels statischer 
  2701. Methodenaufl╨ñsung die OS/2 Prozedur 'somFree' gefunden wird, die wiederum per 
  2702. Prozedurzeiger zwecks Freisetzung des SOM-Objektes aufgerufen wird. 
  2703.  
  2704.  
  2705. ΓòÉΓòÉΓòÉ 10.4.3. SYSTEM-Prozedur ExitProgram ΓòÉΓòÉΓòÉ
  2706.  
  2707. Die Prozedur 
  2708.  
  2709.   PROCEDURE ExitProgram( ExitCode : SHORTCARD );
  2710.  
  2711. ist im Module SYSTEM deklariert. Sie akzeptiert einen Wert-Parameter. Diese 
  2712. Prozedur wird automatisch am Ende eines Haupt- Programm-Moduls aufgerufen. Der 
  2713. Standard- Prozedur-Aufruf 
  2714.  
  2715.   HALT();
  2716.  
  2717. wird f╨ær diesen ╨¬bersetzer in ein 
  2718.  
  2719.   SYSTEM.ExitProgram( 0 );
  2720.  
  2721. umgewandelt. ExitProgram bekommt einen Wert-Parameter f╨ær den R╨æckgabe-Code. 
  2722. Unter OS/2 2.x/3.0 wird solch ein R╨æckgabe-Code an den Aufrufer zur╨æckgegeben, 
  2723. z.B. nach dem API-Funktions-Aufruf DosExecProgram(...) in einem der 
  2724. VAR-Parameter. 
  2725.  
  2726. Wenn die Spracherweiterungen aktiviert sind, dann wird jeder verfehlte 
  2727. Typentest mit einem SYSTEM.ExitProgram(3) verabschiedet. 
  2728.  
  2729.  
  2730. ΓòÉΓòÉΓòÉ 10.4.4. SYSTEM-Prozedur SetExitProc ΓòÉΓòÉΓòÉ
  2731.  
  2732. Die Prozedur 
  2733.  
  2734.   PROCEDURE SetExitProc( UserProc : PROC );
  2735.  
  2736. ist im Modul SYSTEM deklariert. Sie akzeptiert einen Wertparameter namens 
  2737. 'UserProc'. Prozedur SetExitProc wird normalerweise gebraucht, um eine neue 
  2738. Prozedur oder eine wiederherzustellende Prozedur an die Spitze einer Kette von 
  2739. Beendiguns-Prozeduren zu setzen. Letztere werden beim Programmabschluss 
  2740. nacheinander aufgerufen. 
  2741.  
  2742. Das folgende Beispiel zeigt, wie man eine Modul-spezifische 
  2743. Beendigungs-Prozedur implementiert: 
  2744.  
  2745.   IMPLEMENTATION MODULE <module-id>;
  2746.     ...
  2747.   VAR
  2748.     PreviousExitProc : PROC;
  2749.     ...
  2750.   PROCEDURE <exit-id>();
  2751.   BEGIN
  2752.     <module specific exit code>
  2753.     SYSTEM.SetExitProc( PreviousExitProc );
  2754.   END <exit-id>;
  2755.     ...
  2756.   BEGIN
  2757.     <module initialization>
  2758.     PreviousExitProc := SYSTEM.GetExitProc();
  2759.     SYSTEM.SetExitProc( <exit-id> );
  2760.   END <module-id>.
  2761.  
  2762.  
  2763. ΓòÉΓòÉΓòÉ 10.5. Koroutinen ΓòÉΓòÉΓòÉ
  2764.  
  2765. Das Standard-Werk 'Programmierung in Modula-2' von N.Wirth (4.Ausgabe) 
  2766. beschreibt eine Schnittstelle unter Modula-2 f╨ær die Implementation von 
  2767. quasi-gleichzeitigen Prozessen auf einem konventionellen Computer mit nur einem 
  2768. Hauptprozessor. Das Wort Prozess wird hier im Sinne einer Koroutine gebraucht. 
  2769. Koroutinen sind Prozesse, die alle von einem einzigen Prozessor ausgef╨æhrt 
  2770. werden. Eine Koroutine kann aber auch durch eine Ger╨öteunterbrechung verursacht 
  2771. werden. 
  2772.  
  2773. Dieser ╨¬bersetzer bietet keine spezielle Implementierung f╨ær Koroutinen an, 
  2774. ausser einem primitiven kooperativen Multitasking innerhalb eines 
  2775. OS/2-Prozesses. Bei einer ╨¬bersetzung f╨ær OS/2 2.x/3.0 sollte besser das Modul 
  2776. 'Processes' benutzt werden. Dort werden Koroutinen als OS/2 2.x/3.0 
  2777. Ausf╨æhrungseinheiten (threads) implementiert. Routinen f╨ær OS/2-Unterbrechungen 
  2778. (exception handlers)  k╨ñnnen durch den Gebrauch der OS/2 2.x/3.0 Exception 
  2779. Managment API 'DOSEXCEPTIONS' einfach installiert werden. 
  2780.  
  2781. Trotzdem bietet das Modul SYSTEM eine Schnittstelle f╨ær die Implementierung 
  2782. eines eigenen Koroutinen-Systems an, unter Verwendung der folgenden 
  2783. Deklarationen: 
  2784.  
  2785.   PROCEDURE NEWPROCESS
  2786.   ( p:PROC; a:ADDRESS; n:CARDINAL; VAR p1:ADDRESS );
  2787.  
  2788.   PROCEDURE TRANSFER
  2789.   ( VAR p1,p2:ADDRESS );
  2790.  
  2791.   PROCEDURE IOTRANSFER
  2792.   ( VAR p1,p2:ADDRESS; va:CARDINAL );
  2793.  
  2794.   PROCEDURE LISTEN
  2795.   ( );
  2796.  
  2797. NEWPROCESS dient dazu, einen neuen Prozess (Koroutine) zu erzeugen, wobei seine 
  2798. Parameter die folgende Bedeutung haben: 
  2799.  
  2800.      P    gibt die Prozedur an, welche den Prozess ausmacht 
  2801.      A    ist die Basisadresse vom Arbeitsspeicher f╨ær den Prozess 
  2802.      n    ist die Gr╨ñsse des Arbeitsspeichers. 
  2803.      p1   als ein Ergebnisparameter gibt die Adresse eines neu erzeugten 
  2804.           Prozess-Beschreibers an. 
  2805.  
  2806.  Ein neuer Prozess mit 'P' als Programm und 'A' als Arbeitsspeicher der Gr╨ñsse 
  2807.  'n' wird an 'p1' zugewiesen. Der Prozess wird nur eingerichtet, aber noch 
  2808.  nicht aktiviert. 'P' muss eine auf der globalen Null-Ebene deklarierte 
  2809.  Prozedur sein. 
  2810.  
  2811.  Die Kontroll╨æbergabe zwischen zwei Prozessen geschieht durch die folgende 
  2812.  Prozedur: 
  2813.  
  2814.     PROCEDURE TRANSFER( VAR p1,p2:ADDRESS )
  2815.  
  2816.  Dieser Aufruf suspendiert den augenblicklichen Prozess, welcher an 'p1' 
  2817.  zugewiesen wird, und nimmt wieder die weitere Ausf╨æhrung des Prozesses, 
  2818.  welcher durch 'p2' bezeichnet wird, auf. Offensichtlich muss 'p2' einem 
  2819.  Prozess durch einen fr╨æheren Aufruf von NEWPROCESS oder TRANSFER zugewiesen 
  2820.  worden sein.  Beide Prozeduren m╨æssen vom Modul SYSTEM importiert werden. Ein 
  2821.  Programm muss abbrechen, wann immer die Kontrolle das Ende der Prozedur, 
  2822.  welche den K╨ñrper eines Prozesses ausmacht, erreicht. Wegen dieser Forderung 
  2823.  erzeugt dieser ╨¬bersetzer automatisch ein HALT() am Ende von Prozeduren, die 
  2824.  TRANSFER(...) -Anweisungen enthalten. Weil die Zuweisung nach 'p1' erst nach 
  2825.  der Identifizierung des neuen Prozesses 'p2' erfolgen soll, d╨ærfen die 
  2826.  aktuellen Parameter identisch sein. 
  2827.  
  2828.  Die Prozedur IOTRANSFER ╨öhnelt dem TRANSFER, ausser dass als einen weiteren 
  2829.  Parameter eine Nummer 'va' f╨ær einen Unterbrechungsvektor akzeptiert wird. 
  2830.  Diese wird ebenfalls in den Prozessbeschreiber, auf den 'p1' zeigt, 
  2831.  gespeichert. Nach der Ausf╨æhrung eines IOTRANSFERs veranlasst jede neue 
  2832.  CPU-Unterbrechung, die Routine an der Stelle, welche im Prozessbeschreiber 
  2833.  'p1' festgehalten ist, die Kontrolle wieder aufzunehmen. 
  2834.  
  2835.  Die parameterlose Prozedur LISTEN dient dazu, die augenblickliche Priorit╨öt 
  2836.  vom Modul runterzusetzen, so dass anstehende Unterbrechungen (IOTRANSFERs) zur 
  2837.  Aus╨æbung kommen. 
  2838.  
  2839.  
  2840. ΓòÉΓòÉΓòÉ 10.6. SYSTEM INLINE-Assemblierer ΓòÉΓòÉΓòÉ
  2841.  
  2842. Modula-2 ist haupts╨öchlich eine Hochsprache. Maschinennahe Unterst╨ætzung ist 
  2843. gew╨ñhnlich nicht direkt programmierbar, es sei denn, dass die M╨ñglichkeiten vom 
  2844. Pseudo-Modul SYSTEM benutzt werden. Manchmal ist es notwendig, maschinennahe 
  2845. Funktionen auf der Ebenen der CPU-Instruktionen zu implementieren. W╨öhrend 
  2846. andere ╨¬bersetzer solche Aufgaben einem externen Assemblierer ╨æberlassen, hat 
  2847. dieser ╨¬bersetzer eine andere L╨ñsung zur Verf╨ægung gestellt. Die Anweisung 
  2848. SYSTEM.INLINE(...) aktiviert einen eingebetteten und vollst╨öndig symbolischen 
  2849. Assemblierer f╨ær die INTEL 80x86 und 80x87 Prozessorfamilien. Eine vollst╨öndige 
  2850. Assembler-Beschreibung w╨ærde den Rahmen dieser Referenz-Dokumentation f╨ær den 
  2851. ╨¬bersetzer sprengen. Die INLINE-Anweisung akzeptiert eine unbestimmte Anzahl 
  2852. von akutellen Parametern, welche als Instruktionen und Direktiven f╨ær den 
  2853. Assemblierer behandelt werden. N╨öhere Informationen ╨æber die Programmierung in 
  2854. der Maschinensprache ist z.B. in der folgenden Literatur zu finden: 
  2855.  
  2856.   - 'The 80386/387 Architecture' by Stephen P. Morse,
  2857.   1987, John Wiley & Sons, New York
  2858.  - '386 DX Microprocessor Programmer's Reference Manual'
  2859.   1990, Intel Corporation, Literature Sales
  2860.  
  2861. Eine vollst╨öndige Sprach-Grammatik f╨ær den INLINE-Assemblierer ist in einer der 
  2862. folgenden Sektionen dieser Dokumentation mit eingeschlossen. 
  2863.  
  2864. Eine INLINE-Anweisung muss alle Register ausser eAX bewahren bzw. 
  2865. wiederherstellen. 
  2866.  
  2867.  
  2868. ΓòÉΓòÉΓòÉ 10.6.1. Parameter-╨¬bergabe-Konventionen ΓòÉΓòÉΓòÉ
  2869.  
  2870. Dieser ╨¬bersetzer ╨æbergibt die Prozedur-Parameter grunds╨ötzlich auf dem 
  2871. CPU-Stack. Unter 32-Bit OS/2 ist diese Art der Parameter-╨¬bergabe fast 
  2872. identisch mit IBM's "_System"-Konvention. 
  2873.  
  2874. Ein Prozedur-Kopf kann entweder als eine C-artige oder als eine Pascal-artige 
  2875. Einheit deklariert werden. Dies geschieht, indem man die Direktiven (*$CDECL+*) 
  2876. oder (*$CDECL-*) gebraucht. Standard-m╨össig werden Pascal-artige Prozeduren 
  2877. angenommen. Falls eine Prozedur Pascal-artig ist, werden die Parameter von 
  2878. links nach rechts ╨æbergeben, und die aufgerufene Prozedur muss den CPU-Stack 
  2879. vor dem R╨æcksprung bereinigen. Falls eine Prozedur C-artig ist, werden die 
  2880. Parameter in umgekehrter Reihenfolge, das heisst von rechts nach links, 
  2881. ╨æbergeben. Und es ist dann die Aufgabe des Aufrufers, den CPU-Stack unmittelbar 
  2882. nach Beendigung der aufgerufenen Prozedur zu bereinigen. 
  2883.  
  2884. Modula-2 erwartet ausserdem zus╨ötzliche HIGH-Parameter auf dem CPU-Stack f╨ær 
  2885. alle offenen Reihungsparameter. Diese werden vom ╨¬bersetzer f╨ær den 
  2886. Programmierer unsichtbar auf dem CPU-Stack abgelegt, und dies, bevor die 
  2887. regul╨ören Parameter auf dem CPU-Stack kommen. Die aufgerufene Pascal-artige 
  2888. Prozedur sollte nur den Bereich f╨ær die regul╨ören Parameter vom CPU-Stack 
  2889. beseitigen. Alle zus╨ötzlichen HIGH-Werte sind vom Aufrufer aus dem CPU-Stack zu 
  2890. entfernen. 
  2891.  
  2892. Die folgende INLINE-Assemblierungsfolge zeigt einen typischen Prozedur-Aufruf 
  2893. f╨ær das 32-Bit flache Speichermodell: 
  2894.  
  2895.   SYSTEM.INLINE
  2896.   (
  2897.     ;----------------------------------------------
  2898.     ; Beispiel Aufruf einer Pascal-artigen Prozedur
  2899.     ;----------------------------------------------
  2900.     PUSH <HIGH ╨öussere Dimension f╨ær n-ten offenen Reihungsparameter>
  2901.      :
  2902.     PUSH <HIGH innere  Dimension f╨ær n-ten offenen Reihungsparameter>
  2903.      :
  2904.     PUSH <HIGH ╨öussere Dimension f╨ær 1-ten offenen Reihungsparameter>
  2905.      :
  2906.     PUSH <HIGH innere  Dimension f╨ær 1-ten offenen Reihungsparameter>
  2907.      :
  2908.     PUSH <1. parameter>
  2909.     PUSH <2. parameter>
  2910.      :
  2911.     PUSH <letzter Parameter>
  2912.     CALL <Ziel-Prozedur>
  2913.     ADD  ESP, <totale Gr╨ñsse aller HIGH-Parameter, sofern vorhanden>
  2914.      :
  2915.   );
  2916.  
  2917. Von C-artigen Prozeduren wird nicht erwarted, dass sie HIGH-Werte f╨ær offene 
  2918. Reihungen benutzen. Deshalb sieht das gleiche Beispiel, diesmal in C-Stil, 
  2919. etwas anders aus: 
  2920.  
  2921.   SYSTEM.INLINE
  2922.   (
  2923.     ;-------------------------------------------
  2924.     ; Beispiel Prozedur einer C-artigen Prozedur
  2925.     ;-------------------------------------------
  2926.     PUSH <letzter Parameter>
  2927.      :
  2928.     PUSH <2. Parameter>
  2929.     PUSH <1. Parameter>
  2930.     CALL <Ziel-Prozedur>
  2931.     ADD  ESP, <totale Gr╨ñsse aller regul╨ören Parameter>
  2932.      :
  2933.   );
  2934.  
  2935. Sobald eine aufgerufene Prozedur die Kontrolle erh╨ölt, hat sie eine eine 
  2936. ENTER-Instruktion ausgef╨æhrt. Letztere sichert die Zeiger aller Stack-Rahmen 
  2937. auf dem CPU-Stack und reserviert einen neuen Stack-Rahmen f╨ær lokale Variablen. 
  2938. Sowohl die lokalen Variablen als auch die Parameter werden ╨æber Basis-Zeiger 
  2939. adressiert, wie im folgenden Beispiel: 
  2940.  
  2941.   SYSTEM.INLINE
  2942.   (
  2943.     ;-----------------------------------------
  2944.     ; Beispiel Adressierung Prozedur-Parameter
  2945.     ;-----------------------------------------
  2946.     MOV EAX, <parameter-id>[ EBP ]
  2947.      :
  2948.     ;-------------------------------------
  2949.     ; Beispiel Adressieung lokale Variable
  2950.     ;-------------------------------------
  2951.     MOV <local-var-id>[ EBP ], EAX
  2952.      :
  2953.   );
  2954.  
  2955. Wenn eine Pascal-artige Prozedur urspr╨ænglich mit aktivierten 
  2956. Spracherweiterungen deklariert worden ist, dann ╨ænbergibt der ╨¬bersetzer f╨ær 
  2957. jeden Verbund-VAR-Parameter ein Doppelwort auf dem CPU-Stack. Dies ist 
  2958. notwendig wegen dynamischer Typ-Informationen. Diese Informationen werden dem 
  2959. CPU-Stack noch vor den HIGH-Parametern und den regul╨ören Parametern ╨æbergeben. 
  2960. Die dynamischen Typ-Informationen werden nur bei Benutzung von 
  2961. Objekt-orientierten Sprach-Konstrukten wie z.B. der IS-Relation ben╨ñtigt. Die 
  2962. augenblickliche Modula-2 ╨¬bersetzer-Version bietet keine Unterst╨ætzung f╨ær 
  2963. OOP-Erweiterungen auf der Ebene der INLINE-Assemblierung an. Die 
  2964. RET-Instruktion der aufzurufenden Prozedur hat den CPU-Stack nur von den 
  2965. regul╨ören Parametern zu bereinigen. Der ╨æberige Stack-Speicher (d.h. 
  2966. HIGH-Parameter und Typ-Informationen) muss vom Aufrufer bereinigt werden. 
  2967. Daraus folgt, dass, solange die aufgerufene Prozedur nicht die zus╨ötzliche 
  2968. internen Parameter benutzt, diese Prozedur voll in INLINE-Assembler oder sogar 
  2969. in einer anderen Programmiersprache implementiert werden kann. 
  2970.  
  2971. Falls eine aufgerufene Prozedur einen strukturierten Wert zur╨æckgibt, dann muss 
  2972. der Aufrufer einen unsichtbaren Adressparameter f╨ær die Struktur auf dem 
  2973. CPU-Stack ╨æbergeben. Dadurch weiss die aufzurufende Prozedur wohin sie ihren 
  2974. R╨æckgabewert schreiben kann. Dieser versteckte Parameter wird wie ein regul╨örer 
  2975. erster VAR-Parameter behandelt. 
  2976.  
  2977.  
  2978. ΓòÉΓòÉΓòÉ 10.6.2. R╨æckgabe-Register ΓòÉΓòÉΓòÉ
  2979.  
  2980. Jede Funktions-Prozedur muss seinen R╨æckgabewert in CPU-Register laden. Die 
  2981. folgenden Register werden in Abh╨öngigkeit von der jeweiligen Typ-Gr╨ñsse des 
  2982. formalen R╨æckgabe-Parameters benutzt: 
  2983.  
  2984.    AL           1-Byte  R╨æckgabe-Typ
  2985.    AX           2-Bytes R╨æckgabe-Typ
  2986.    EAX          4-Bytes R╨æckgabe-Typ (32-Bit Code)
  2987.    DX:AX        4-Bytes R╨æckgabe-Typ (16-Bit Code)
  2988.    ST(0)        REAL,SHORTREAL,LONGREAL R╨æckgabe-Typ
  2989.  
  2990.  
  2991. ΓòÉΓòÉΓòÉ 11. Prozesse ΓòÉΓòÉΓòÉ
  2992.  
  2993. Weil Modula-2 urspr╨ænglich auch f╨ær die Programmierung von Betriebssystemen 
  2994. entworfen worden war, bietet es zum Ausdruck gleichzeitig ablaufender 
  2995. Aktivit╨öten das Konzept der Koroutinen an. Dieser ╨¬bersetzer hat einen anderen 
  2996. Weg eingeschlagen, um gleichzeitig ablaufende Prozesse unter OS/2 2.x/3.0 zu 
  2997. realisieren. Um  nicht das Rad von neuem zu erfinden, nutzt dieser ╨¬bersetzer 
  2998. die bereits verf╨ægbaren zeitscheibengesteuerten Mehrfach-Anwendungen von OS/2 
  2999. 2.x/3.0 (preemptive multitasking), und nutzt daher ausschliesslich die 
  3000. Mechanismen aus dem API 'DOSPROCESSES'. Dieser API stellt die Besonderheiten 
  3001. quasi-nebenl╨öufiger Anwendugen (multitasking) zur Verf╨ægung. Sie werden von 
  3002. eimem Modul namens 'Processes' benutzt. Modul 'Processes' h╨ölt sich eng an die 
  3003. Vorschl╨öge aus dem Anhang von Wirth's Buch 'Programmierung in Modula-2' in der 
  3004. vierten Ausgabe. Die Prozesse von Modula-2 werden auf Verarbeitungseinheiten 
  3005. (threads) von OS/2 abgebildet. Deshalb kann ein Programm durch den Gebrauch des 
  3006. Moduls 'Processes', welcher ausschliesslich die Verarbeitungseinheiten 
  3007. (threads) von OS/2 benutzt, auf einfache Art mehrere nebenl╨öufige Anwendungen 
  3008. (preemtive tasks) innerhalb eines OS/2-Prozesses ablaufen lassen. 
  3009.  
  3010. Modul 'Processes' stellt die folgende Schnittstelle zur Verf╨ægung: 
  3011.  
  3012.   DEFINITION MODULE Processes;
  3013.   TYPE SIGNAL;
  3014.   PROCEDURE StartProcess( P : PROC; n : CARDINAL );
  3015.   (*
  3016.      start a concurrent process with program P
  3017.      and workspace of size n.
  3018.      PROC is a standard type defined as PROC = PROCEDURE().
  3019.   *)
  3020.   PROCEDURE SEND( VAR s : SIGNAL );
  3021.   (*
  3022.      one process waiting for s is resumed
  3023.   *)
  3024.   PROCEDURE WAIT( VAR s : SIGNAL );
  3025.   (*
  3026.      wait for some other process to send s
  3027.   *)
  3028.   PROCEDURE Awaited( s : SIGNAL ) : BOOLEAN;
  3029.   (*
  3030.      Awaited( s ) = "at least one process is waiting for s"
  3031.   *)
  3032.   PROCEDURE Init( VAR s : SIGNAL );
  3033.   (*
  3034.      compulsory initialization
  3035.   *)
  3036.   END Processes.
  3037.  
  3038.  
  3039. ΓòÉΓòÉΓòÉ 12. ╨¬bersetzungseinheiten ΓòÉΓòÉΓòÉ
  3040.  
  3041. ΓûÉ CompilationUnit = DefModule | [ IMPLEMENTATION ] ProgramModule
  3042. ΓûÉ
  3043. ΓûÉ ProgramModule   = MODULE Ident Priority ";" { Import } Block Ident "."
  3044. ΓûÉ Priority        = [ "[" ConstExpr "]" ]
  3045. ΓûÉ Import          = [ FROM Ident ] IMPORT IdentList ";"
  3046. ΓûÉ IdentList       = Ident { "," Ident }
  3047. ΓûÉ
  3048. ΓûÉ DefModule = DEFINITION MODULE Ident ";" { Import } { Def } END Ident "."
  3049. ΓûÉ Def       = CONST { ConstDef ";" } | TYPE { TypeDef ";" } |
  3050. ΓûÉ             VAR { VarDecl ";" } | ProcedureHeading ";"
  3051. ΓûÉ ConstDef  = Ident "=" ConstExpr
  3052. ΓûÉ TypeDef   = TypeDecl | Ident
  3053.  
  3054. Eine Quellen-Textdatei wird von diesem ╨¬bersetzer als eine Einheit akzeptiert 
  3055. und wird daher ╨¬bersetzungseinheit (compilation unit) genannt. Es gibt drei 
  3056. Arten von ╨¬bersetzungseinheiten: 
  3057.  
  3058.   - Haupt-Module
  3059.  - Definitions-Module
  3060.  - Implementations-Module
  3061.  
  3062. Ein Haupt-Modul besteht aus einem Hauptprogramm und setzt sich aus aus einem 
  3063. Pogramm-Modul zusammen. Insbesondere enth╨ölt es keine Exportliste. Importierte 
  3064. Objekte werden in anderen, separat ╨æbersetzbare Programmteile, definiert. Diese 
  3065. bestehen jeweils aus zwei Einheiten, welche Definitions- und 
  3066. Implementations-Module genannt werden. 
  3067.  
  3068. Ein Definitions-Modul gibt die Namen und Eigenschaften derjenigen Objekte, die 
  3069. von anderen Klienten ben╨ñtigt werden m╨ñgen, an. Die Klienten sind andere 
  3070. Module, welche die Objekte importieren. Diese Objekte werden automatisch 
  3071. qualifiziert exportiert. Zu ihnen geh╨ñren die Konstanten, Typen, Variablen 
  3072. sowie die Spezifikationen von Prozedur-K╨ñpfen. Das entsprechende 
  3073. Implementations-Modul enth╨ölt weitere lokale Objekte und Anweisungen, welche 
  3074. nicht f╨ær Klienten bekannt sein m╨æssen. Es enth╨ölt auch die vollst╨öndigen 
  3075. Prozedur-Deklarationen, und m╨ñglicherweise die Deklarationen weiterer Objekte, 
  3076. die nicht exportiert werden. Definitions- und Implemenatations-Module 
  3077. existieren paarweise. F╨ær diesen ╨¬bersetzer kann ein Implementations-Modul aber 
  3078. dann weggelassen werden, wenn das Definitions-Modul sich auf eine Schnittstelle 
  3079. ausserhalb von Modula-2 bezieht. Dazu geh╨ñren z.B. Definitions-Module, welche 
  3080. APIs f╨ær Betriebssysteme beschreiben, oder welche nur die Definitionen von 
  3081. Konstanten und Typen, nicht aber von Laufzeitobjekten wie Variablen oder 
  3082. Prozeduren, enthalten. Sowohl Definitions- als auch Implementations-Module 
  3083. k╨ñnnen Importlisten enthalten. Und alle Objekte, die im Definitions-Modul 
  3084. definiert werden, sind im entsprechenden Implementations-Modul automatisch 
  3085. verf╨ægbar, ohne explizitem Import. 
  3086.  
  3087. Das Definitions-Modul stell offensichtlich die Schnittstelle zwischem dem 
  3088. Implementations-Modul einerseits und den Klienten andererseits dar. Das 
  3089. Definitions-Modul sollte nur die Deklarationen solcher Objekte beinhalten, die 
  3090. von Klienten ben╨ñtigt werden m╨ñgen, und keine anderen. In diesem ╨¬bersetzer 
  3091. kann ein Definitions-Modul auch eine API vom Betriebssystem darstellen. In 
  3092. solchen F╨öllen werden die Implementations- Module in anderen Computersprachen 
  3093. gew╨ñhnlich von Drittanbiertern in Form vor╨æbersetzter Module angeboten. Die 
  3094. Definitions-Module von diesem ╨¬bersetzer k╨ñnnen sich auf fremde .OBJ, .LIB oder 
  3095. .DLL -Dateien, welche die Ausgabe anderer Sprach╨æbersetzer, statische und 
  3096. dynamische Bindebibliotheken enthalten, beziehen. 
  3097.  
  3098. Definitions-Module implizieren qualifizierten Export. Typendefinitionen k╨ñnnen 
  3099. aus vollst╨öndig spezifizierten, transparenten, Typen bestehen, oder sie k╨ñnnen 
  3100. auch nur den Typnamen enthalten. Im letzteren Fall muss die vollst╨öndige 
  3101. Spezifikation dann im entsprechenden Implementations-Modul erscheinen, und sein 
  3102. Export ist undurchsichtig (opaque). Der Typ ist den importierenden Modulen nur 
  3103. mit seinem Namen bekannt, aber seine ╨æbrigen Eigenschaften bleiben verborgen. 
  3104. Deshalb m╨æssen alle Prozeduren, welche mit Operanden diesen Typs arbeiten, im 
  3105. gleichem Implementations-Modul deklariert sein, wo auch die ╨æberigen 
  3106. Eigenschaften vom Datentyp deklariert worden sind. Undurchsichtiger (opaque) 
  3107. Export ist in diesem ╨¬bersetzer auf Zeiger und elementare Typen (ausser 
  3108. Gleitkommas) beschr╨önkt. Zuweisungen und Gleichheitstests sind auf alle 
  3109. undurchsichtige (opaque) Typen anwendbar. 
  3110.  
  3111. ╨₧hnlich wie bei den lokalen Modulen, dient auch der K╨ñrper eines 
  3112. Implementations-Moduls der Initialisierung von lokalen Objekten. Vor seiner 
  3113. Ausf╨æhrung werden erst alle importierten Module in der gelisteten Reihenfolge 
  3114. ihres Auftretens initialisiert, sofern noch nicht geschehen. Omportieren sich 
  3115. Module gegenseitig, ist die Reihenfolge der Initialisierung nicht festgelegt, 
  3116.  
  3117.  
  3118. ΓòÉΓòÉΓòÉ 13. ╨¬bersetzer-Bedienung ΓòÉΓòÉΓòÉ
  3119.  
  3120. Dieser ╨¬bersetzer wird von der OS/2 2.x/3.0 Kommandozeile aufgerufen. Dazu ist 
  3121. die folgende Syntax f╨ær die Kommandozeile notwendig: 
  3122.  
  3123.   MOD Quellendatei {Schalter}
  3124.  
  3125. Das Kommando wird mit einem 'MOD' oder 'MOD.EXE' begonnen, und muss von dem 
  3126. Namen der Modula-2-Quelldatei und m╨ñglichen Schaltern gefolgt werden. Eine 
  3127. Quelldatei enth╨ölt eine komplette ╨¬bersetzungseinheit. Der Name der Quelldatei 
  3128. muss mit '.MOD' f╨ær Programm-Module oder mit '.DEF' f╨ær Definitions-Module 
  3129. erweitert sein. Fehlt die Angabe einer Namenserweiterung, wird '.MOD' 
  3130. angenommen. Die Namen der Module k╨ñnnen bis zu 255 Zeichen lang sein und 
  3131. unterscheiden zwischen Gross- und Kleinschreibung. Dieser ╨¬bersetzer nimmt bis 
  3132. 8 erste Zeichen vom Modulnamen als Grossbuchstaben f╨ær den entsprechenden 
  3133. Dateinamen an und erweitert den Dateinamen mit der o.g. Erweiterung. Diese 
  3134. 8.3-Konvention f╨ær Dateinamen ist mit dem FAT-Dateisystem vertr╨öglich. Sie ist 
  3135. auch f╨ær das neue installierbare Dateisystem HPFS von OS/2 2.x/3.0 verwendbar. 
  3136. HPFS unterst╨ætzt lange Dateinamen und unterscheidet dabei zwischen Gross- und 
  3137. Keinschreibung. Dieser Modula-2-╨¬bersetzer erkennt jedoch nur die Dateien, 
  3138. deren Namen bis zu 8 Zeichen lang sind, und macht dabei keinen Unterschied 
  3139. zwischen ihrer Gross- und Kleinschreibung. Der Name der anszugebenden 
  3140. Objektdatei ist der gleiche wie der von der Eingabe-Quelldatei, jedoch in 
  3141. Grossbuchstaben, und mit der Namenserweiterung '.OBJ' anstelle von '.MOD' oder 
  3142. '.DEF'. 
  3143.  
  3144. Hinweise: Definitions-Dateien f╨ær den Binder unter OS/2 2.x/3.0 oder MS-Windows 
  3145. 3.x benutzen ebenso wie Modula-2 die Namenserweiterung '.DEF'. Um daher 
  3146. Verwechslungen zu vermeiden, sollten die Defintiions-Dateien f╨ær den Binder und 
  3147. die Definitions-Dateien f╨ær Modula-2 in getrennten Unterverzeichnissen gehalten 
  3148. werden. 
  3149.  
  3150. Wenn die Make- oder Build- Schalter auf der Kommandozeile f╨ær eine ╨¬bersetzung 
  3151. angegeben worden sind, dann produziert der ╨¬bersetzer f╨ær Modula-2 eine 
  3152. komplette Antwortsdatei f╨ær den Binder (mit der Namenserweiterung '.RSP') und 
  3153. m╨ñglicherweise auch eine Definitionsdatei f╨ær den Binder (mit der 
  3154. Namenserweiterung '.LDF'), zus╨ötzlich zu den Objektdateien (Namenserweiterungen 
  3155. '.OBJ'). Diese Ausgabedateien sind f╨ær die OS/2 2.x/3.0 Binderprogramme 
  3156. LINK386.EXE oder LINK.EXE, welche schliesslich die ausf╨æhrbare Datei 
  3157. (Namenserweiterung '.EXE') erzeugen, verwendbar. 
  3158.  
  3159. Das folgende Beispiel zeigt, wie man f╨ær das lineare Flat- Speicher-Modell das 
  3160. 32-bit Hauptprogramm aus der Datei 'TEST.MOD' ╨æbersetzt und zu der ausf╨æhrbaren 
  3161. Datei 'TEST.EXE' bindet: 
  3162.  
  3163.   MOD TEST.MOD -m -o -mf
  3164.   LINK386 @TEST.RSP
  3165.  
  3166. Das Beispiel produziert eine Datei namens TEST.EXE, die fertig f╨ær die 
  3167. Programmausf╨æhrung ist. 
  3168.  
  3169. Damit der ╨¬bersetzer richtig arbeiten kann, muss er einige Variablen aus der 
  3170. Umgebung vom Betriebssystem konsultieren, um z.B. die Laufwerksbuchstaben und 
  3171. Namen von Unterverzeichnissen f╨ær die Quell- und Objekt-Dateien zu kennen. Die 
  3172. Schalter auf der Kommandozeile informieren den ╨¬bersetzer f╨ær Modula-2 
  3173. darr╨æber, wie er seine ╨¬bersetzung ausf╨æhren soll. 
  3174.  
  3175. Die notwendigen Angaben in der Umgebung vom Betriebssystem sowie die Schalter 
  3176. auf der Kommandozeile werden in den folgenden Sektionen dieser Dokumentation 
  3177. n╨öher beschrieben. 
  3178.  
  3179.  
  3180. ΓòÉΓòÉΓòÉ 13.1. Kommandozeilen-Schalter ΓòÉΓòÉΓòÉ
  3181.  
  3182. Einige der Merkmale dieses ╨¬bersetzers f╨ær Modula-2 werden durch Schalter auf 
  3183. der Kommandozeile kontrolliert. Sie dienen als globale Direktiven f╨ær die 
  3184. ╨¬bersetzung. Einige von ihnen k╨ñnnen auch durch spezielle Kommentare innerhalb 
  3185. der Quelldateien angegeben werden. Sie werden dann als lokale Direktiven 
  3186. behandelt und wirken w╨öhrend der ╨¬bersetzung nur innerhalb des Moduls, in dem 
  3187. sie angegeben sind. Schalter von der Kommandozeile hingegen wirken global f╨ær 
  3188. alle Module. Die Schalter der Kommandozeile m╨æssen hinter dem Namen der 
  3189. Quelldatei stehen und von Leerzeichen untereinander getrennt sein. Jeder 
  3190. Schalter wird durch einen Bindestrich '-' eingef╨æhrt und werden unmittelbar 
  3191. durch die Zeichenkette, welche den Schalter ausmacht, gefolgt. F╨ær die 
  3192. Zeichenkette eines Schalters wird keine Unterscheidung zwischen Gross- und 
  3193. Kleinschreibung gemacht, z.B. stellen -B und -b den gleichen Schalter dar. 
  3194.  
  3195. Die folgenden Schalter f╨ær die Kommandozeile sind f╨ær diesen ╨¬bersetzer 
  3196. verf╨ægbar: 
  3197.  
  3198.      -M                         Make f╨ær Binder: ╨¬bersetze auch abh╨öngige, 
  3199.                                 ge╨önderte Module 
  3200.      -B                         Build f╨ær Binder: ╨¬bersetze alle abh╨öngigen 
  3201.                                 Module 
  3202.      -P                         ╨¬bersetzung mit Quelldateianzeige und 
  3203.                                 Fehlerunterbrechungen 
  3204.      -XL                        Erweiterte Modula-2-Sprache 
  3205.      -XI                        Undokumentierte CPU-Instruktionen 
  3206.      -XF                        Vereinfachte Funktionsbezeichner 
  3207.      -8086                      Produziere 8086-Code 
  3208.      -x86                       Produziere Code f╨ær 286, 386, 486 oder 586 
  3209.      -F                         Numerischer Koprozessor 
  3210.      -E=Verzeichnis             Zielverzeichnis f╨ær ausf╨æhrbare Datei 
  3211.      -SS=stacksize              Gr╨ñsse des Stapelspeichers (stack size) f╨ær 
  3212.                                 ausf╨æhrbare Datei in K-Bytes 
  3213.      -C=Anzahl                  Abbruch nach <Anzahl> semantischen Fehlern 
  3214.      -R4 oder -R8               4-Byte oder 8-Byte-Real 
  3215.      -D                         Debugger-Unterst╨ætzung 
  3216.      -L                         Zeilennummern in die Objektdateien 
  3217.      -Mx                        Speicher-Modell 
  3218.                                 (Tiny,Small,Medium,Compact,Large,Flat32) 
  3219.      -OB                        Optimierung von Ausdr╨æcken 
  3220.      -OI                        Optimierung f╨ær Zeiger und Indizes 
  3221.      -OG                        Globale Datenflussanalyse 
  3222.      -O                         Allumfassende Optimierung: -OG -OB -OI 
  3223.      -DOS                       Ziel-Betriebssystem DOS 
  3224.      -OS2                       Ziel-Betriebssystem OS/2 1.3 oder 2.x/3.0 
  3225.      -WIN                       Ziel-Betriebssystem MS-Windows 3.x 
  3226.      -SSFAR                     Nehme FAR Stapelspeicher-Segment (stack 
  3227.                                 segment) an 
  3228.      -A -A1 -A2 -A4             Feldausrichtung 
  3229.      -V                         Nehme fl╨æchtige globale Variablen an 
  3230.      -PM:Typ                    OS/2-Anwendungstyp PM, VIO, oder NOVIO 
  3231.      -$=Sonderzeichen           Redefiniere das einf╨æhrende Zeichen f╨ær 
  3232.                                 ╨¬bersetzer-Direktiven 
  3233.      -CDECL                     C-artige Prozeduren 
  3234.      -H2 oder -H4               2-Byte oder 4-Byte-HIGH 
  3235.      -FSAVE                     Sichere alle FPU-Register zu Beginn einer 
  3236.                                 Prozedur 
  3237.  
  3238.  Die folgenden Schalter sind f╨ær das OS/2 2.x/3.0 Betriebssystem 
  3239.  voreingestellt: 
  3240.  
  3241.     -386 -OS2 -MF -E=.\ -SS=8 -C=15 -R8 -A -PM:VIO -H4
  3242.  
  3243.  
  3244. ΓòÉΓòÉΓòÉ 13.1.1. Speicher-Modelle ΓòÉΓòÉΓòÉ
  3245.  
  3246. Dieser ╨¬bersetzer unterst╨ætzt bis zu sechs verschiedene Speicher-Modelle. Ein 
  3247. Speichermodell gibt den ╨¬bersetzer an, wo und wie die Daten- und Code-Segmente 
  3248. f╨ær die schliessliche ausf╨æhrbare Datei anzuordnen oder zu kombinieren sind. 
  3249. Diese Information wird wegen der segmentierten Mechanismen f╨ær Speicherzugriffe 
  3250. bei den Intel 80x86-Prozessoren gebraucht. Einer moderner Computer bietet 
  3251. gew╨ñhnlich viele Megabytes an direktem Zugriffsspeicher (DRAM) an, mit denen 
  3252. seine Programme laufen k╨ñnnen. Aber wenn der 80x86-Prozessor im 16-Bit-Modus 
  3253. l╨öuft, dann sind alle CPU-Register nur 16 Bits gross, sodass sie nur einen 
  3254. Bereich von 64 KB abdecken w╨ærden. Dies bedeutet, dass der RAM-Speicher nur in 
  3255. kleinen Portionen mit jeweils nicht mehr als 64 KB ansprechbar ist. Diese Art 
  3256. von Speicherzugriff nennt man auch segmentierten Speicherzugriff. Jeder 
  3257. 16-Bit-Zeiger kann nur innerhalb eines Segments zeigen, welches nicht gr╨ñsser 
  3258. als 64 KB sein darf. Segment-Deskriptoren werden w╨öhrend der Laufzeit ben╨ñtigt, 
  3259. damit das System die Startadressen aktueller Code- oder Daten-Segmente 
  3260. innerhalb des physischen Speichers kennt. 16-Bit grosse Segment-Register zeigen 
  3261. auf solche Deskriptoren. Eine vollst╨öndige lineare Speicheradresse besteht 
  3262. daher aus zwei Komponenten: 
  3263.  16-Bit-Segment : 16-oder-32-Bit-Offset 
  3264. Ein Zeiger, welcher sowohl die Segment- als auch die Offset-Komponente enth╨ölt, 
  3265. wird ein FAR Zeiger genannt. Ein Zeiger, der nur den Offset-Anteil einer 
  3266. Speicheradresse enth╨ölt, ist ein NEAR Zeiger. Ein NEAR Zeiger zeigt auf eine 
  3267. Adresse innerhalbs eines Standard-Speicher-Segments, dessen Deskriptor-Zeiger 
  3268. in einen der beiden Segment-Register DS oder CS (Daten- oder Code-Segment) 
  3269. gespeichert ist. Bei einer 32-Bit-╨¬bersetzung f╨ær Programme ist der 
  3270. Offset-Anteil 32 Bits gross und deckt einen Adressbereich von bis zu 4 
  3271. Giga-Bytes ab. F╨ær die absehbare Zukunft ist dies f╨ær moderne Programme mehr 
  3272. als genug. Deshalb brauchen Programme f╨ær den 32-Bit-Modus nur einen linearen 
  3273. Adressraum f╨ær den Speicherzugriff (Speicher-Modell Flat). Alle notwendigen 
  3274. Segment-Register werden in diesem Speicher-Modell auf die gleiche physikalische 
  3275. Baisiadresse eingestellt. Ein h╨öufiges Problem bei 16-Bit-Programmen ist 
  3276. insbesondere die Aufteilung und Kombinierung der Speichersegmente unter den 
  3277. Modulen und Daten. Je nach Auswahl des Speicher-Modells sind folgende Ans╨ötze 
  3278. f╨ær diesen ╨¬bersetzer von Modula-2 implementiert worden: 
  3279.  
  3280.   Model Name    Align  Combine  Class     Group    Remarks
  3281.  
  3282.   S     _TEXT    WORD  PUBLIC   'CODE'      -
  3283.         _DATA    WORD  PUBLIC   'DATA'     DGROUP
  3284.         _BSS     WORD  PUBLIC   'BSS'      DGROUP
  3285.         STACK    PARA  STACK    'STACK'    DGROUP   (1)
  3286.  
  3287.   M     x_TEXT   WORD  PUBLIC   'CODE'      -       (3)
  3288.         _DATA    WORD  PUBLIC   'DATA'     DGROUP
  3289.         _BSS     WORD  PUBLIC   'BSS'      DGROUP
  3290.         STACK    PARA  STACK    'STACK'    DGROUP   (1)
  3291.  
  3292.   C     _TEXT    WORD  PUBLIC   'CODE'      -
  3293.         x_DATA   WORD  private  'FAR_DATA'  -
  3294.         x_BSS    WORD  private  'FAR_BSS'   -
  3295.         STACK    PARA  STACK    'STACK'    DGROUP   (1)
  3296.  
  3297.   L     x_TEXT   WORD  PUBLIC   'CODE'      -       (3)
  3298.         x_DATA   WORD  private  'FAR_DATA'  -
  3299.         x_BSS    WORD  private  'FAR_BSS'   -
  3300.         STACK    PARA  STACK    'STACK'    DGROUP   (1)
  3301.  
  3302.   F     _TEXT   DWORD  PUBLIC   'CODE'      -       (2)
  3303.         _DATA   DWORD  PUBLIC   'DATA'     DGROUP   (2)
  3304.         _BSS    DWORD  PUBLIC   'BSS'      DGROUP   (2)
  3305.         STACK   DWORD  STACK    'STACK'    DGROUP   (1) (2)
  3306.  
  3307. Bemerkungen: 
  3308.  
  3309.      (1)    STACK wird nur f╨ær das Haupt-Modul definiert. 
  3310.      (2)    32-Bit-Segment 
  3311.      (3)    x_TEXT: 
  3312.             ein logisches Code-Segment pro Modul x. 
  3313.             x_BSS: 
  3314.             Ein logisches, nicht initialisiertes, Daten-Segment pro Modul x. 
  3315.             x_DATA: 
  3316.             Ein logisches, initialisiertes, Daten-Segment pro Modul x. 
  3317.  
  3318.  F╨ær eine ╨¬bersetzung kann das gew╨ænschte Speicher-Modell durch folgende 
  3319.  Schalter auf der Kommandozeile ausgew╨öhlt werden, mit folgenden totalen 
  3320.  Gr╨ñssen f╨ær die Code- und Daten-Segmente: 
  3321.  
  3322.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3323.   ΓöéSchalter  ΓöéCode-Gr╨ñsse    ΓöéDaten-Gr╨ñsse   ΓöéModus          Γöé
  3324.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3325.   Γöé-MS       Γöékleiner 64 KB  Γöékleiner 64 KB  Γöé16-Bit-Code    Γöé
  3326.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3327.   Γöé-MM       Γöégr╨ñsser 64 KB  Γöékleiner 64 KB  Γöé16-bit code    Γöé
  3328.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3329.   Γöé-MC       Γöékleiner 64 KB  Γöégr╨ñsser 64 KB  Γöé16-Bit-Code    Γöé
  3330.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3331.   Γöé-ML       Γöégr╨ñsser 64 KB  Γöégr╨ñsser 64 KB  Γöé16-Bit-Code    Γöé
  3332.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3333.   Γöé-MF       Γöé0..4 GB        Γöé0..4 GB        Γöé32-Bit-Code    Γöé
  3334.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3335.  
  3336.  
  3337. ΓòÉΓòÉΓòÉ 13.1.2. Ziel-Betriebssystem ΓòÉΓòÉΓòÉ
  3338.  
  3339. Diese Implementierung von Modula-2 akzeptiert die folgenden Schalterangaben 
  3340. f╨ærs Ziel-Betriebssystem: 
  3341.  
  3342.      ╨¬bersetzer- 
  3343.      Schalter       Beschreibung 
  3344.  
  3345.       -OS2          Produziere 80x86 Objekt-Code f╨ær IBM OS/2 2.x/3.0 oder 1.3 
  3346.       -WIN          Produziere 80x86 Objekt-Code f╨ær MS Windows 3.x 
  3347.       -DOS          Produziere 80x86 Real-Modus Objekt-Code f╨ær DOS 
  3348.  
  3349.  Diese ╨¬bersetzer-Version 2.01 wird gegenw╨örtig jedoch nur mit Standard-Modulen 
  3350.  und APIs f╨ær OS/2 2.x/3.0 ausgeliefert. Zuk╨ænftige Versionen werden auch 
  3351.  vollst╨öndige Standard-Bibliotheken f╨ær DOS und MS-Windows beinhalten. 
  3352.  
  3353.  
  3354. ΓòÉΓòÉΓòÉ 13.1.3. Ziel-Prozessoren ΓòÉΓòÉΓòÉ
  3355.  
  3356. Dieser ╨¬bersetzer f╨ær Modula-2 produziert Objekt-Code f╨ær die Intel 
  3357. 80x86-Prozessor-Familie. Ein Schalter f╨ær einen Koprozessor muss immer dann 
  3358. angegeben werden, wenn der INLINE- Assemblierer Instruktionen f╨ær den 
  3359. numerischen 80x87 Koprozessor akzeptieren soll. Der Code-Generator f╨ær die 
  3360. Haupt-CPU nimmt immer an, dass ein numerischer Koprozessor oder eine 
  3361. entsprechende Software-Emulation existiert, unabh╨öngig davon, ob ein Schalter 
  3362. f╨ær den Koprozessor aktiviert ist oder nicht. Unter OS/2 2.x/3.0 wird eine 
  3363. Emulation f╨ær den Koprozessor mit dem Betriebssystem selbst bereitgestellt. Die 
  3364. gegenw╨örtige Version des ╨¬bersetzers bietet daher keinen eigenen Emulator f╨ær 
  3365. den Koprozessor an. Unter OS/2 2.x/3.0 wird als Haupt-CPU 80386 amgenommen f╨ær 
  3366. das lineare 32-Bit Flat Speicher-Modell. 
  3367.  
  3368. Zusammenfassung der m╨ñglichen Schalter f╨ær die Ziel-Prozessoren: 
  3369.  
  3370.   -8086 
  3371.   -80286 oder -286 
  3372.   -80386 oder -386 
  3373.   -80486 oder -486 
  3374.   -80586 oder -586 
  3375.   -F 
  3376.  
  3377.  
  3378. ΓòÉΓòÉΓòÉ 13.1.4. Make und Build ΓòÉΓòÉΓòÉ
  3379.  
  3380. Ein Modula-Programm besteht typischerweise aus vielen Modulen, welche 
  3381. untereinander in einer hierarchischen Ordnung in Beziehung stehen. Das Modul 
  3382. auf der Hauptebene besteht gew╨ñhnlich aus einem Hauptprogramm oder einem 
  3383. Implementations-Modul einer dynamischen Binder-Bibliothek. Es kann Module aus 
  3384. untergeordneten Ebenen importieren. Die Module auf den niedrigeren Ebenen 
  3385. k╨ñnnen ihrerseits wieder andere Module aus noch niedrigeren Ebenen importieren, 
  3386. usw. Wenn ein Modul auf einer niedrigen Ebene ge╨öndert worden ist und deshalb 
  3387. neu ╨æbersetzt werden soll, dann sind alle Module, die das ge╨önderte Modul 
  3388. importieren, ebenfalls von der ╨₧nderung betroffen. Insbesondere, wenn die 
  3389. ╨₧nderung im Definitions-Modul geschehen ist, m╨æssen alle daraus importierende 
  3390. Module ebenfalls neu ╨æbersetzt werden. 
  3391.  
  3392. Dieser Prozess der Neu╨æbersetzung der abh╨öngigen importierenden Module wird 
  3393. 'Make' oder 'Build' genannt. Eine Make-Funktion bedeutet, dass nur die 
  3394. ge╨önderten abh╨öngigen Module neu╨æbersetzt werden sollen, w╨öhrend ein 'Build' 
  3395. eine Neu╨æbersetzung aller abh╨öngigen Module bewirkt (ob ge╨öndert oder nicht). 
  3396. Andere ╨¬bersetzer m╨æssen hierf╨ær oft die Dienste eines separaten Make-Programms 
  3397. benutzen, welches eine Beschreibungs-Datei mit Angaben aller 
  3398. Modul-Abh╨öngigkeiten braucht, um eine Neu-╨¬bersetzung der Module zu bewirken. 
  3399. Dieser ╨¬bersetzer f╨ær Modula-2 hat jedoch bereits eine Make- oder 
  3400. Build-Funktion integriert. Diese Funktion wird einfach durch einen der 
  3401. folgenden Schalter auf der Kommandozeile aktiviert: 
  3402.  
  3403.      -M     Neu╨æbersetzung auch der ge╨önderten abh╨öngigen Module 
  3404.      -B     Neu╨æbersetzung aller abh╨öngigen Module 
  3405.  
  3406.  Wenn einer der o.g. Schalter auf der Kommandozeile angegeben wird, dann 
  3407.  produziert der ╨¬bersetzer auch eine komplette Antwortsdatei und eine 
  3408.  Definitionsdatei, welche direkt vom 32-Bit LINK386.EXE oder vom 16-Bit 
  3409.  LINK.EXE Programm benutzt werden, um die ausf╨æhrbare Programmdatei erzeugen zu 
  3410.  k╨ñnnen. 
  3411.  
  3412.  
  3413. ΓòÉΓòÉΓòÉ 13.1.5. Erweiterungen f╨ær Sprache und CPU ΓòÉΓòÉΓòÉ
  3414.  
  3415. Dieser ╨¬bersetzer f╨ær Modula-2 bietet eine erweiterte Grammatik der Sprache an, 
  3416. falls der folgende Schalter auf der Kommandozeile angegeben wird: 
  3417.  
  3418.  -XL 
  3419.  
  3420. Die Intel 80x86-CPU-Familie bietet einige undokumentierte Code-Intruktionen an. 
  3421. Ihr Gebrauch verkleinert den Maschinen-Code und macht das Programm etwas 
  3422. schneller. Der Code-Generator dieses ╨¬bersetzers kann von diesen Instruktionen 
  3423. Gebrauch machen, wenn folgender Schalter f╨ær die erweiterten CPU-Instruktionen 
  3424. aktiviert ist: 
  3425.  
  3426.  -XI 
  3427.  
  3428. Die undokumentierten Instruktionen sollten mit jeder INTEL 80386 (oder h╨ñher) 
  3429. CPU funktionieren, aber sie sind nicht notwendigerweise in CPUs von anderen 
  3430. Herstellern verf╨ægbar, selbst wenn die anderen CPUs ansonsten kompatibel sind. 
  3431.  
  3432. Es w╨öre oftmals w╨ænschenswert, wenn man die R╨æckgabewerte von 
  3433. Funktionsbezeichnern ignorieren k╨ñnnte. Dies gilt besonders f╨ær die APIs von 
  3434. OS/2. Diese Forderung geht nicht konform mit der strengeren Sprachdefinition 
  3435. von Modula-2. Dieser ╨¬bersetzer akzeptiert jedoch den weniger strengen 
  3436. Funktionsbezeichner, wenn der Schalter 
  3437.  
  3438.  -XF 
  3439.  
  3440. auf der Kommandozeile angegeben wird. Er erm╨ñglicht es dem Programmierer, auch 
  3441. die Namen von Funktionsprozeduren wie normale Prozeduraufrufe zu gebrauchen, 
  3442. wodurch der R╨æckgabewert einfach ignoriert wird. 
  3443.  
  3444.  
  3445. ΓòÉΓòÉΓòÉ 13.1.6. Stapelspeicher-Segment ΓòÉΓòÉΓòÉ
  3446.  
  3447. Es gibt zwei Schalter f╨ær die Kommandozeile, die den Stapelspeicher (stack 
  3448. segment) w╨öhrend der Laufzeit beeinflussen: 
  3449.  
  3450.   -SSFAR
  3451.  -SS=Stapelspeichergr╨ñsse
  3452.  
  3453. Der '-SSFAR'-Schalter teilt dem ╨¬bersetzer mit, dass das Segment f╨ær den 
  3454. Stapelspeicher nicht innerhalb des standardm╨össigen Datensegments DGROUP liegen 
  3455. soll. Dieser Schalter wird haupts╨öchlich f╨ær 16-Bit Speicher-Modelle gebraucht, 
  3456. und zwar bei den dynamischen Binder-Bibliotheken, dessen Funktionen von anderen 
  3457. Programmen, die einen eigenen CPU-Stapelspeicher f╨ær lokale Variablen und 
  3458. aktuelle Parameter benutzen, aufgerufen werden. Dieser Schalter wird nicht f╨ær 
  3459. das 32-Bit Flat Speicher-Modell z.B. bei den dynamischen Binder-Bibliothken 
  3460. ben╨ñtigt, weil das lineare Adressierungsschema sich nicht um die Segmentierung 
  3461. k╨æmmert. 
  3462.  
  3463. Der Schalter 'SS=Stapelspeichergr╨ñsse' teilt dem ╨¬bersetzer mit, dass er die 
  3464. angegebene Stapelspeichergr╨ñsse in Kilo-Bytes an die Antwortsdatei f╨ær den 
  3465. Binder weiterreichen soll. Unter den 16-Bit Speicher-Modellen darf der 
  3466. Wertebereich der Stapelspeichergr╨ñsse nicht 64 Kilo-Bytes ╨æberschreiten. Dies 
  3467. h╨öngt mit der 16-Bit-Segmentierung des Speichers zusammen. F╨ær 32-Bit-Programme 
  3468. darf der Wert bis zu 65536 Kilo-Bytes gross sein. Die angenommene Gr╨ñsse f╨ær 
  3469. den Stapelspeicher betr╨ögt 8 Kilo-Bytes. 
  3470.  
  3471. Beispiele f╨ær die Kommandozeile: 
  3472.  
  3473.   REM
  3474.   REM build an optimized 16-bit small memory model
  3475.   REM dynamic link library
  3476.   REM
  3477.   MOD      MYLIB.MOD -OS2 -MS -O -SSFAR -B
  3478.   LINK    @MYLIB.RSP
  3479.   REM
  3480.   REM make an optimized 32-bit flat memory model program
  3481.   REM with a stacksize of 128 KBytes
  3482.   REM
  3483.   MOD      MYPROG.MOD -OS2 -MF -O -SS=128 -M
  3484.   LINK386 @MYPROG.RSP
  3485.  
  3486.  
  3487. ΓòÉΓòÉΓòÉ 13.1.7. Debugger-Unterst╨ætzung ΓòÉΓòÉΓòÉ
  3488.  
  3489. Die gegenw╨örtige ╨¬bersetzer-Version 2.01 bietet keinen Debugger an. Erst f╨ær 
  3490. zuk╨ænftige Versionen ist ein eigener Debugger vorgesehen. Dennoch k╨ñnnen einige 
  3491. elementare Debugger-Informationen in die zu erzeugenden Objekt-Dateien 
  3492. geschrieben werden. Der Binder setzt diese Informationen dann in die endg╨æltige 
  3493. ausf╨æhrbare Programmdatei. Die folgenden Debugger- Schalter werden unterst╨ætzt: 
  3494.  
  3495.   -L
  3496.  -D
  3497.  
  3498. Der '-L'- Schalter teilt dem ╨¬bersetzer mit, dass die Zeilennummern der 
  3499. urspr╨ænglichen Quelldateien in die zu erzeugenden Objekt-Dateien geschrieben 
  3500. werden sollen. Von dort aus werden sie vom Binderprogramm in die MAP-Datei und 
  3501. in die ausf╨æhrbare Programmdatei weitergereicht. Wenn f╨ær das 32-Bit OS/2 
  3502. Zielsystem ╨æbersetzt wird, dann ist das interne Format der Zeilennummern f╨ær 
  3503. HLL-kompatible Debuggers, z.B. IBM's SD386 aus DevCon Vol. 6 oder h╨ñher 
  3504. (Development Tools, Disc 1), lesbar. Ansonsten werden die Zeilennummern in 
  3505. einem Format erzeugt, welcher f╨ær CodeView-kompatible Debuggers geeignet sein 
  3506. sollte. 
  3507.  
  3508. Der '-D'- Schalter veranlasst den Code-Generator vom ╨¬bersetzer, den Code 
  3509. derart zu produzieren, dass alle in CPU-Register gehaltene Speicherwerte nach 
  3510. jeder Modula-2-Quellzeile in die entsprechenden Variablen abgelegt werden. 
  3511. Dadurch wird sichergestellt, dass der RAM-Speicher nach der Abarbeitung jeder 
  3512. Quellzeile immer auf den neuesten Stand bleibt. Dies is dann n╨ætzlich, wenn man 
  3513. mit einem Debugger Quellzeile f╨ær Quellzeile durchgeht und dabei den Inhalt von 
  3514. Variablen inspizieren oder anzeigen lassen m╨ñchte. Zu diesem Zweck deaktiviert 
  3515. der '-D'- Schalter die '-OB'- und '-OI'- Optimierungs- Schalter. 
  3516.  
  3517. Der '-D' Schalter veranlasst den ╨¬bersetzer auch, HLL-komatible symbolische 
  3518. Debug-Infos zu erzeugen. Diese werden in die OBJ-Dateiausgabe geschrieben. Der 
  3519. Linker schreibt diese Informationen schliesslich in die ausf╨æhrbare EXE-Datei. 
  3520.  
  3521. Beispiel zur Programmerzeugung und Debugger-Aufruf: 
  3522.  
  3523.   MOD MYPROG.MOD -B -O -L
  3524.   LINK386 @MYPROG.RSP
  3525.   SD386 MYPROG.EXE
  3526.  
  3527.  
  3528. ΓòÉΓòÉΓòÉ 13.1.8. Optimierungen ΓòÉΓòÉΓòÉ
  3529.  
  3530. Modula-2 ist eine Programmier-Hochsprache und ist im hohen Masse unabh╨öngig von 
  3531. der Hardware. Aus diesem Grunde ╨æbersetzt dieser Compiler die Quell-Anweisungen 
  3532. nicht sofort in den Maschinen-Code. Er erzeugt vielmehr einen Zwischen-Code f╨ær 
  3533. die Anweisugen. Erst dieser Zwischen-Code wird dann in den Maschinen-Code des 
  3534. gew╨ænschten Ziel-Prozessors transformiert. Um nun die besonderen Eigenschaften 
  3535. der CPU zu nutzen, mit dem Ziel von k╨ærzeren und schnelleren Programmen, k╨ñnnen 
  3536. zuvor einige Optimierungen durchgef╨æhrt werden. Dieser ╨¬bersetzer bietet f╨ær 
  3537. die Optimierungen die folgenden Schalter an: 
  3538.  
  3539.   -OG
  3540.  -OB
  3541.  -OI
  3542.  -O
  3543.  
  3544. Der '-OG'- Schalter veranlasst den ╨¬bersetzer, eine globale Datenflussanalyse 
  3545. ╨æber die Grenzen elementarer Bl╨ñcke hinweg durchzuf╨æhren. Eine Anweisungsfolge 
  3546. von einem Prozedur- oder Modul- K╨ñrper wird immer in elementare Bl╨ñcke 
  3547. unterteilt. Diese kommen durch Anweisungen zustande, die den Programmfluss 
  3548. ╨öndern, z.B. IF-THEN-ELSE oder Schleifen. Die aus der globalen 
  3549. Datenflussanalyse gewonnenen Informationen dienen als Grundlage f╨ær eine 
  3550. weitere Analyse lebendiger Variablen. Durch letztere wird herrausgefunden, wie 
  3551. lange jede Variable nach ihrer Zuweisung oder Initialisierung von den 
  3552. nachfolgenden Anweisungen gebraucht wird. Diese Information ╨æber lebende 
  3553. Variablen wird wiederum f╨ær die Zuordnung von Adressen der tempor╨ören Variablen 
  3554. auf dem Laufzeit-Stapelspeicher und auch f╨ær Schleifenoptimierungen gebraucht. 
  3555. Tempor╨öre Variablen entstehen w╨öhrend der Programmausf╨æhrung, um dort 
  3556. Zwischenergebnisse komplexer Ausdrucke zu speichern. Das Ziel besteht nat╨ærlich 
  3557. darin, m╨ñglichst wenig Stapelspeicher f╨ær die tempor╨ören Variablen zu benutzen. 
  3558. Besser ist es, freie CPU-Register geschickter auszunutzen. Das Ziel der 
  3559. Schleifen-Optimierung besteht darin, Variablen, die innerhalb von Schleifen 
  3560. angesprochen werden, ebenfalls in CPU-Register zu halten, weil auf solche 
  3561. Variablen in der Regel viel h╨öufiger zugegriffen wird. 
  3562.  
  3563. Die globale Datenflussanalyse dient auch als Grundlage f╨ær eine Analyse 
  3564. verf╨ægbarer Register. Letztere versucht herrauszufinden, wie lange ein 
  3565. Register-Byte sogar ╨æber elementare Bl╨ñcke hinweg seinen Wert dort behalten 
  3566. kann, ohne die beabsichtigte Semantik des Programms zu verletzen. Diese Analyse 
  3567. tr╨ögt dazu bei, dass w╨öhrend der Programmlaufzeit CPU-Register nicht zu oft aus 
  3568. dem RAM-Speicher nachgeladen werden m╨æssen. 
  3569.  
  3570. Der '-OB'- Schalter veranlasst den ╨¬bersetzer, eine Optimierung der Ausdr╨æcke 
  3571. durchzuf╨æhren. Wenn in einem Quell-Programm eine komplexer Ausdruck h╨öufig 
  3572. vorkommt, ist es oftmals m╨ñglich, solch einen Ausdruck w╨öhrend der 
  3573. Programmausf╨æhrung nur einmal auszuwerten und das Ergebnis in einer tempor╨ören 
  3574. Variablen zwischenzuspeichern. Solch ein gemeinsamer Ausdruck kann dann 
  3575. jedesmal, wenn er vorkommt, benutzt werden. Er muss nicht immer wieder von 
  3576. neuem ausgewertet werden. Gemeinsame Ausdr╨æcke werden von diesem ╨¬bersetzer 
  3577. innerhalb von elementaren Bl╨ñcken und in einem gewissen Umfang sogar global, 
  3578. d.h. ╨æber elementare Bl╨ñcke hinweg, erkannt. 
  3579.  
  3580. Der '-OB'- Schalter teilt dem ╨¬bersetzer auch mit, dass er den o.g. 
  3581. Zwischen-Code vereinfachen soll. Muliplikationen und Divisionen k╨ñnnen zum 
  3582. Beispiel oftmals durch schnellere Schift-Instruktionen ersetzt werden. 
  3583.  
  3584. Der '-OI'- Schalter veranlasst den ╨¬bersetzer, f╨ær indizierte und 
  3585. Zeiger-derefenzierte Ausdr╨æcke einen effizienteren Maschinen-Code zu erzeugen. 
  3586. Ein Operand f╨ær die Intel 80x86-CPU kann nicht nur aus einem Offset-Wert f╨ær 
  3587. eine Speicheradresse bestehen, sondern zus╨ötzlich aus Index- und/oder 
  3588. Basis-Register, und einem Skalierungsfaktor. Das Ziel der Optimierung ist es 
  3589. also, m╨ñglichst viele Zeiger oder Indizes w╨öhrend der Laufzeit in Basis- oder 
  3590. Index-Register der entsprechenden Operanden zu halten. 
  3591.  
  3592. Der '-O'- Schalter veranlasst den ╨¬bersetzer, alle o.g. Optimierungen 
  3593. durchzuf╨æhren. Er ist lediglich eine Kurzform f╨ær die Notation '-OG -OB -OI'. 
  3594.  
  3595.  
  3596. ΓòÉΓòÉΓòÉ 13.1.9. Feldausrichtungen ΓòÉΓòÉΓòÉ
  3597.  
  3598. Dieser ╨¬bersetzer bietet verschiedene Arten von Feldausrichtungen an. Ein 
  3599. Verbundfeld kann auf eine Byte-, Wort- oder Doppelwort-Grenze ausgerichttet 
  3600. werden. Durch gute Feldausrichtungen kann die Zeit f╨ær den Speicherzugriff auf 
  3601. ein Feld reduziert werden. Wenn zum Beipiel in einem 32-Bit-Programm auf ein 
  3602. Verbundfeld mit Doppelwortgr╨ñsse zugegriffen werden soll, w╨ærde hierf╨ær bei 
  3603. Nichtausrichtung auf Doppelwortgrenze mehr als ein Schritt ben╨ñtigt werden. 
  3604. Ausrichtungen werden durch diesen ╨¬bersetzer durch das Einf╨ægen von anonymen 
  3605. F╨ællbytes erreicht. 
  3606.  
  3607. Die folgenden Ausrichtungs- Schalter werden vom ╨¬bersetzer erkannt: 
  3608.  
  3609.   -A    Standard-Ausrichtung
  3610.  -A1    Byte-Ausrichtung
  3611.  -A2    Wort-Ausrichtung
  3612.  -A4    Doppelwort-Ausrichtung
  3613.  
  3614. Der '-A1'- Schalter gibt dem ╨¬bersetzer an, jedes Verbundfeld auf eine 
  3615. Byte-Grenze auszurichten. Das bedeutet, dass nirgendwo F╨ællbytes eingef╨ægt 
  3616. werden. 
  3617.  
  3618. Der '-A2'- Schalter gibt dem ╨¬bersetzer an, jedes Verbundfeld, welches gr╨ñsser 
  3619. als 1 Byte ist, oder welches einen Verbundtyp hat, auf eine 2-Bytes-Wort-Grenze 
  3620. auszurichten. Dies geschieht durch Einf╨ægen von F╨ællbytes vor den 
  3621. auszurichtenden Feldern. 
  3622.  
  3623. Der '-A4'- Schalter gibt dem ╨¬bersetzer an, jedes Verbundfeld, dessen Typgr╨ñsse 
  3624. gr╨ñsser als 1 Byte ist oder dessen Typ aus einem Verbund besteht, auf eine 
  3625. 4-Bytes-Doppelwort-Grenze auszurichten. Dies geschieht durch Einf╨ægen von 
  3626. F╨ællbytes vor den auszurichtenden Feldern. 
  3627.  
  3628. Falls auf der Kommandozeile kein Ausrichtungs- oder der '-A'- Schalter 
  3629. angegeben ist, wird f╨ær die Verbundfelder eine standard-m╨össige Ausrichtung 
  3630. gem╨öss folgendem Schema durchgef╨æhrt: 
  3631.  
  3632. Wenn das Feld einen Verbundtyp hat, richte es auf die NEAR Zeigergr╨ñsse (2 
  3633. Bytes f╨ær 16-Bit- Speichermodelle, 4 Bytes f╨ær 32-Bit- Speicher-Modelle) aus. 
  3634. Sonst, wenn die Feldgr╨ñsse 1 Byte ist, f╨æhre Byte-Ausrichtung durch. 
  3635. Sonst, wenn die Feldgr╨ñsse 2 Bytes ist, f╨æhre Wort-Ausrichtung durch. 
  3636. Sonst f╨æhre Wort-Ausrichtung bei den 16-Bit- Speicher-Modellen und 
  3637. Doppelwort-Ausrichtung bei den 32-Bit Speicher-Modellen durch. 
  3638.  
  3639. Wenn der Typ eines Verbundfelds aus einer (m╨ñglicherweise multidimensionalen) 
  3640. Reihung besteht, dann wird f╨ær o.g. Ausrichtungen der Typ der Elemente der 
  3641. Reihung herangezogen. 
  3642.  
  3643.  
  3644. ΓòÉΓòÉΓòÉ 13.1.10. OS/2-Anwendungstypen ΓòÉΓòÉΓòÉ
  3645.  
  3646. Unter OS/2 gibt es drei verschiedene Anwendungstypen: 
  3647.  
  3648.      -PM:NOVIO           Anwendung im Textmodus f╨ær Gesamtbildschirm 
  3649.      -PM:VIO             Anwendung im Textmodus auch f╨ær Fenster unter dem 
  3650.                          Presentation Manager 
  3651.      -PM:PM              Anwendung f╨ær den Presentation Manager 
  3652.  
  3653.  Eine Anwendung im Textmodus f╨ær den Gesamtbildschirm ist nicht mit dem OS/2 
  3654.  Presentation Manager vertr╨öglich. Sie muss daher in einer separaten Sitzung 
  3655.  mit einem vollen Text-Bildschirm ablaufen (text-mode screen session). Diese 
  3656.  Art von Anwendungen darf aber daf╨ær auch maschinennahe Methoden f╨ær die 
  3657.  Bildschirmausgabe oder den Maus- und Tastatur-Eingaben benutzen. 
  3658.  
  3659.  Eine Fenster-vertr╨ögliche Anwendung im Text-Modus darf nur eine bestimmte 
  3660.  Teilmenge aus dem OS/2 API f╨ær Bildschirm, Tastatur und Maus benutzen. Solch 
  3661.  eine Anwendung im Text-Modus kann entweder in einer separaten 
  3662.  Bildschirmsitzung laufen, mit einem vollen Bildschirm, oder aber in einem 
  3663.  Textfenster auf dem Presentation Manager Desktop. Alle Standard-Bibliotheken 
  3664.  von Modula-2 f╨ær diesen ╨¬bersetzer sind als Fenster-vertr╨ögliche Anwendungen 
  3665.  im Text-Modus konzipiert. Der ╨¬bersetzer selbst ist ebenfalls 
  3666.  fenstervertr╨öglich. 
  3667.  
  3668.  Eine Anwendung f╨ær den OS/2 Presentation Manager l╨öuft unter einer grafischen 
  3669.  Oberfl╨öche unter Benutzung von Fenstern. Sie kann nicht als separate 
  3670.  Bildschirmsitzung im Text-Modus laufen. Der Presentation Manager bietet eine 
  3671.  CUA-konforme Schnittstelle f╨ær den Benutzer. Er ist f╨ær Programme gedacht, 
  3672.  welche Fenster und grafische Objekte benutzen, einschliesslich einer vollen 
  3673.  Mausunterst╨ætzung. 
  3674.  
  3675.  Nur einer der o.g. Schalter kann auf der Kommandozeile angegeben werden. Falls 
  3676.  solch eine Angabe fehlt, wird der Fenster-vertr╨ögliche Anwendungstyp '-PM:VIO' 
  3677.  angenommen. 
  3678.  
  3679.  
  3680. ΓòÉΓòÉΓòÉ 13.1.11. C-artige Prozeduren ΓòÉΓòÉΓòÉ
  3681.  
  3682. Die folgenden Schalter zeigen dem ╨¬bersetzer an, dass er eine C-artige 
  3683. Reihenfolge der Parameter╨æbergabe (von rechts nach links) oder einen C-artigen 
  3684. Beendigungs-Code f╨ær eine Prozedur benutzen soll. C-artig bedeutet hier, dass 
  3685. die Konventionen der Programmiersprache C benutzt werden sollen. Normalerweise 
  3686. wird auch f╨ær Modula-2 eine Konvention gem╨öss der Pascal-Sprache benutzt. 
  3687.  
  3688.      -CPARAM             C-artige Reihenfolge der Parameter╨æbergabe 
  3689.      -CRET               C-artige Prozedur-Beendigung. Aufrufer, nicht 
  3690.                          Prozedur, r╨öumt den Stapelspeicher auf. 
  3691.      -CDECL              -CPARAM und -CRET kombiniert. 
  3692.  
  3693.  Diese Angaben werden ben╨ñtigt, um eine Vertr╨öglichkeit mit Funktionen, welche 
  3694.  in der C-Sprache geschrieben worden sind, herzustellen. 
  3695.  
  3696.  Hinweis: Diese Angaben sind f╨ær alle zu ╨æbersetzende Module aktiv. Da 
  3697.  Modula-2-Prozeduren gew╨ñhnlich der Pascal-Konvention f╨ær die 
  3698.  Parameter╨æbergaben und dem Beendigungs-Code folgen, sollten C-artige 
  3699.  Konventionen nur die Ausnahme bilden. Die Pascal-Konvention erzeugt k╨ærzeren 
  3700.  und auch sichereren Maschinen-Code. Es wird daher empfohlen, nicht o.g. 
  3701.  Schalter von der Kommandozeile zu gebrauchen, sondern lieber ╨ñrtliche 
  3702.  ╨¬bersetzer- Direktiven vor den jeweiligen Prozedur-Deklarationen innerhalb der 
  3703.  Quelltexte einzuf╨ægen. 
  3704.  
  3705.  
  3706. ΓòÉΓòÉΓòÉ 13.1.12. Sonstige Schalter ΓòÉΓòÉΓòÉ
  3707.  
  3708. Die folgenden sonstigen Schalter werden von diesem ╨¬bersetzer erkannt: 
  3709.  
  3710.      -P                            ╨¬bersetzung mit Quelltext-Protokollierung 
  3711.                                    und Fehlerunterbrechungen 
  3712.      -W0                           Warnungen Level 0 
  3713.      -W1                           Warnungen Level 1 
  3714.      -E=Verzeichnis                Unterverzeichnis f╨ær ausf╨æhrbare Datei 
  3715.      -C=Anzahl                     Abbruch nach <Anzahl> Fehlern 
  3716.      -R4                           REAL = SHORTREAL 
  3717.      -R8                           REAL = LONGREAL 
  3718.      -H2                           HIGH gibt 2-Byte CARDINAL zur╨æck 
  3719.      -H4                           HIGH gibt 4-Byte LONGCARD zur╨æck 
  3720.      -V                            Nehme an, dass globale Variablen fl╨æchtig 
  3721.                                    sind 
  3722.      -FSAVE                        Sichere alle FPU-Register zu Beginn einer 
  3723.                                    Prozedur. 
  3724.      -$=Sonderzeichen              Definiere ein neues Einf╨æhrungszeichen f╨ær 
  3725.                                    ╨¬bersetzer-Direktiven 
  3726.  
  3727.  Der '-P'- Schalter veranlasst w╨öhrend der ╨¬bersetzung die Protokollierung der 
  3728.  Quelldateien auf dem Bildschirm. Ausserdem wird bei jeder Fehlermeldung die 
  3729.  ╨¬bersetzung unterbrochen, bis der Benutzer eine Taste dr╨æckt. Wenn dieser 
  3730.  Schalter nicht angegeben wird, zeigt der ╨¬bersetzer nur die Fehlermeldungen 
  3731.  an, ohne weitere Aufforderungen an den Benutzer. 
  3732.  
  3733.  Die '-W0' oder '-W1' Schalter setzen den Level f╨ær Warnmeldungen w╨öhrend der 
  3734.  ╨¬bersetzung. Wenn der Level f╨ær Warnungen 1 ist, dann zeigt der ╨¬bersetzer 
  3735.  Warnungen an. Wenn der Level f╨ær Warnungen 0 ist, dann werden keine Warnungen 
  3736.  angezeigt. Regul╨öre Fehlermeldungen werden immer angezeigt. 
  3737.  
  3738.  Der '-E=Verzeichnis'- Schalter bestimmt das Unterverzeichnis, in welches die 
  3739.  Antwortdatei f╨ær den Binder, die Definitions-Dateien f╨ær den Binder, sowie die 
  3740.  schliessliche ausf╨æhrbare Datei selbst geschrieben werden sollen. Falls diese 
  3741.  Angabe fehlt, wird als Unterverzeichnis das aktuell eingestellte Verzeichnis 
  3742.  (-E=.\) angenommen. 
  3743.  
  3744.  Beispiel f╨ær Kommandozeile: 
  3745.  
  3746.     REM
  3747.     REM make an optimized executable program for
  3748.     REM the directory C:\MOD32\OS2BIN
  3749.     REM
  3750.     MOD       MYPROG.MOD -M -O -E=C:\MOD32\OS2BIN
  3751.     LINK386  @C:\MOD32\OS2BIN\MYPROG.RSP
  3752.  
  3753.  Die '-R4'- oder '-R8'- Schalter teilen dem ╨¬bersetzer mit, welche Typengr╨ñsse 
  3754.  f╨ær REAL zu benutzen ist. Ein REAL-Typ kann entweder ein 4-Bytes SHORTREAL 
  3755.  oder ein 8-Bytes LONGREAL sein. Die Grundannahme ist REAL=LONGREAL. Dieser 
  3756.  Schalter ist eingef╨æhrt worden, um eine Vertr╨öglichkeit mit anderen 
  3757.  ╨¬bersetzern von Modula-2 zu gew╨öhrleisten. 
  3758.  
  3759.  Die '-H2'- oder '-H4'- Schalter teilen dem ╨¬bersetzer mit, welche Typgr╨ñsse 
  3760.  von der Standard-Prozedur HIGH erwartet wird. Standardm╨össig wird LONGCARD f╨ær 
  3761.  das 32-Bit 'flat' Speichermodell und CARDINAL f╨ær eines der 16-Bit 
  3762.  Speichermodelle zur╨æckgegeben. 
  3763.  
  3764.  Der '-V'- Schalter teilt dem ╨¬bersetzer mit, dass alle nicht auf dem 
  3765.  Stapelspeicher befindliche (das heisst nicht lokale) Variablen als fl╨æchtig zu 
  3766.  betrachten sind. Fl╨æchtige (volatile) Variablen werden nur f╨ær die Dauer einer 
  3767.  Maschinen-Instruktion in einem CPU-Register gehalten, wenn ╨æberhaupt. Auf eine 
  3768.  fl╨æchtige Variable kann gleichzeitig von mehreren asynchronen Prozessen 
  3769.  zugegriffen werden. Deshalb k╨ñnnen sie nicht ╨æber mehrere 
  3770.  Maschinen-Instruktionen hinweg in Register gehalten werden. Ein Beispiel f╨ær 
  3771.  fl╨æchtige Variablen ist das eines angeschlossenen Ger╨ötes mit einer 
  3772.  Hauptspeicherabbildung (memory mapped device). 
  3773.  
  3774.  Der Schalter '-FSAVE' teilt dem ╨¬bersetzer mit, dass zu Beginn einer Prozedur 
  3775.  Code f╨ær die Sicherung aller FPU-Register zu erzeugen ist. Und er veranlasst 
  3776.  den ╨¬bersetzer auch, vor dem Verlassen einer Prozedur Code zur 
  3777.  Wiederherstellung der FPU-Register zu erzeugen. Dieser Schalter ist f╨ær 
  3778.  Pascal-artiges Verhalten vorgesehen: Die aufgerufene Prozedur hat f╨ær die 
  3779.  Sicherung und Wiederherstellung der FPU-Register zu sorgen. Ohne diesem 
  3780.  Schalter w╨ærde der ╨¬bersetzer ein C-artiges Verhalten annehmen, d.h.  die 
  3781.  FPU-Register werden vor dem Aufruf einer Prozedur vom Aufrufer gesichert. 
  3782.  
  3783.  Der Schalter '-$=Sonderzeichen' teilt dem ╨¬bersetzer mit, dass er ein anderes 
  3784.  Sonderzeichen f╨ær den Start von in Kommentaren eingelagerten 
  3785.  ╨¬bersetzer-Direktiven benutzen soll. Das voreingestellte Einf╨æhrungszeichen 
  3786.  f╨ær ╨¬bersetzer-Direktiven ist das Dollar-Zeichen '$'. ╨¬bersetzer-Direktiven 
  3787.  dienen als lokale ╨¬bersetzer-Schalter, welche nur f╨ær die Dauer der 
  3788.  ╨¬bersetzung eines Moduls g╨æltig sind. Sie sind in besonderen 
  3789.  Quelldatei-Kommentaren eingebettet und beginnen mit diesem Sonderzeichen. 
  3790.  
  3791.  Beispiel: 
  3792.  
  3793.     REM
  3794.     REM compile with a redefined compiler directive
  3795.     REM introducing character
  3796.     REM
  3797.     MOD  MYPROG.MOD  -O -$=?
  3798.  
  3799.  Wenn die Quelldatei MYPROG.MOD vom obigen Beispiel ╨¬bersetzer-Direktiven, 
  3800.  enth╨ölt, dann werden sie nur mit dem neuen Einf╨æhrungszeichen '?' erkannt. 
  3801.  Beispiel: 
  3802.  
  3803.     MODULE MyProg;
  3804.  
  3805.       (*$R8 no more recognized as compiler directive R8 *)
  3806.  
  3807.       (*?A4 now recognized as compiler directive A4 *)
  3808.  
  3809.       .........
  3810.  
  3811.     END MyProg.
  3812.  
  3813.  Durch die Definition eines neuen Einf╨æhrungszeichen f╨ær in Kommentare 
  3814.  eingebetteten ╨¬bersetzer-Direktiven werden m╨ñgliche Konflikte mit anderen 
  3815.  Modula-2-╨¬bersetzern, welche eine ╨öhnliche Direktiven-Syntax benutzen, 
  3816.  vermieden. 
  3817.  
  3818.  
  3819. ΓòÉΓòÉΓòÉ 13.2. ╨¬bersetzer-Direktiven ΓòÉΓòÉΓòÉ
  3820.  
  3821. Viele der Schalter von der Kommandozeile sind auch lokal innerhalb der 
  3822. Quell-Module verf╨ægbar. Sie sind in spezielle Kommentare eingebettet und dienen 
  3823. als lokale ╨¬bersetzer-Direktiven, das heisst Anweisungen, wie die ╨¬bersetzung 
  3824. durchzuf╨æhren ist. Die folgende Liste summiert die h╨öufig gebrauchten 
  3825. ╨¬bersetzer-Direktiven, die von diesem ╨¬bersetzer erkannt werden: 
  3826.  
  3827.      (*$XL+*) oder (*$XL-*) aktiviere oder deaktiviere die Spracherweiterungen 
  3828.      (*$XI+*) oder (*$XI-*) aktiviere oder deaktiviere den Gebrauch von 
  3829.           undokumentierten CPU-Instruktionen 
  3830.      (*$XF+*) oder (*$XF-*) aktiviere oder deaktiviere weniger strenge 
  3831.           Funktionsbezeichner 
  3832.      (*$8086*) 
  3833.      (*$80286*) oder (*$286*) 
  3834.      (*$80386*) oder (*$386*) 
  3835.      (*$80486*) oder (*$486*) 
  3836.      (*$80586*) oder (*$586*) ╨¬bersetze f╨ær spezifizierte Ziel-CPU 
  3837.      (*$F+*) oder (*$F-*) Nehme die Existenz eines numerischen Koprozessors f╨ær 
  3838.           den INLINE-Assemblierer an 
  3839.      (*$R4*) oder (*$R8*) Nehme REAL=SHORTREAL oder REAL=LONGREAL an 
  3840.      (*$D+*) oder (*$D-*) Aktiviere oder deaktiviere Debugger- Unterst╨ætzung 
  3841.      (*$L+*) oder (*$L-*) Aktiviere oder deaktiviere das Weiterreichen von 
  3842.           Quell- Zeilennummern an die Ausgabe-Objektdateien. 
  3843.      (*$OB+*) oder (*$OB-*) Aktiviere oder deaktiviere die Optimierung von 
  3844.           Ausdr╨æcken 
  3845.      (*$OG+*) oder (*$OG-*) Aktiviere oder deaktiviere die globale Datenfluss- 
  3846.           Optimierung f╨ær Register-Zuordnungen und Schleifen-Optimierungen 
  3847.      (*$OI+*) oder (*$OI-*) Aktiviere oder deaktiviere die Zeiger- und Index- 
  3848.           Optimierung f╨ær die Benutzung der CPU Basis/Index-Register. 
  3849.      (*$O+*) oder (*$O-*) Aktiviere oder deaktiviere alle ╨¬bersetzer- 
  3850.           Optimierungen 
  3851.      (*$DLL*) Diese Direktive wird nur am Beginn eines Definitions-Moduls 
  3852.           erkannt. Das entsprechende Implementations-Modul soll eine dynamische 
  3853.           Binder-Bibliothek werden. 
  3854.      (*$PREFIX*) Diese Direktive wird nur am Beginn eines Definitions-Moduls 
  3855.           erkannt. Wenn das entsprechende Implementations-Modul eine dynamische 
  3856.           Binder-Bibliothek werden soll, werden alle ╨ñffentliche Symbole mit 
  3857.           dem Modul-Namen qualifiziert. Sonst nimmt OS/2 unqualifizierte 
  3858.           Symbole f╨ær eine DLL an. 
  3859.      (*$SSFAR*) Diese Direktive wird nur am Beginn eines Definitions-Moduls 
  3860.           erkannt. Es wird ein FAR (dass heisst ein separates) 
  3861.           Stapelspeicher-Segment wird f╨ær die ╨¬bersetzung des Moduls 
  3862.           angenommen. 
  3863.      (*$A*) 
  3864.      (*$A1*) 
  3865.      (*$A2*) 
  3866.      (*$A4*) Verbundfeld- Ausrichtung (A = Standard-Ausrichtung, An = 
  3867.           Ausrichtung auf n-Grenze) 
  3868.      (*$V+*) oder (*$V-*) Aktiviere oder deaktiviere die Annahme, dass globale 
  3869.           Variablen fl╨æchtig sind. 
  3870.      (*$CPARAM+*) oder (*$CPARAM-*) C-artige oder Pascal-artige 
  3871.           Parameter╨æbergabe-Reihenfolge f╨ær Prozeduren. 
  3872.      (*$CRET+*) oder (*$CRET-*) C-artiger oder Pascal-artiger Beendigungs-Code 
  3873.           einer Prozedur. 
  3874.      (*$CDECL+*) oder (*$CDECL-*) C-artige oder Pascal-artige Prozeduren. 
  3875.           Beinhaltet (*$CPARAM╤æ*) und (*$CRET╤æ*). 
  3876.      (*$SOM+*) oder (*$SOM-*) Nachfolgend deklarierte Verbund-Typen werden als 
  3877.           OS/2 SOM -Klassen oder als normale Modula-2-Verbunde betrachtet. 
  3878.      (*$API16+*) oder (*$API16-*) Diese Direktive wird nur in einem 
  3879.           Definitions-Modul einer alten 16-Bit-API f╨ær OS/2 akzeptiert. Wenn 
  3880.           die Direktive aktiviert ist, werden alle folgenden APIs (d.h. 
  3881.           Prozedurk╨ñpfe im Definitions-Modul) wie 16-Bit-APIs behandelt. Obwohl 
  3882.           die Prozedurk╨ñpfe wie f╨ærs flache 32-Bit-Speichermodell deklariert 
  3883.           werden, wird der Programmablauf bei jedem Aufruf o.g. Prozeduren 
  3884.           zuerst in einem 16-Bit-Modus umgeschaltet. Dies geschieht dadurch, 
  3885.           dass die die Ausf╨æhrungskontrolle zun╨öchst in die Prozedur 
  3886.           'SYSTEM.Thunk' gelangt, von welcher sie in die gew╨ænschte 
  3887.           16-Bit-Bibliothek weitergeleitet wird. Diese Umsetzung von 0:32- zur 
  3888.           16:16- Adressierung ist f╨ær das flache 32-Bit OS/2 leider manchmal 
  3889.           notwendig, weil noch immer einige 16-Bit-APIs nicht in entsprechende 
  3890.           32-Bit-APIs umgesetzt worden sind. Ansonsten besteht keine 
  3891.           Notwendigkeit, diese Direktive zu gebrauchen. 
  3892.      (*$H2*) or (*$H4*) Standard-Prozedur HIGH gibt einen CARDINAL- oder 
  3893.           LONGCARD- Wert zur╨æck. 
  3894.      (*$W1*) oder (*$W0*) Aktiviere oder deaktiviere Warnmeldungen w╨öhrend der 
  3895.           ╨¬bersetzung. 
  3896.  
  3897.  Jede im Kommentar eingebettete ╨¬bersetzer-Direktive muss mit einem 
  3898.  Sonderzeichen, welches gew╨ñhnlich ein Dollarzeichen '$' ist, beginnen. Ein 
  3899.  anderes Sonderzeichen kann durch die Angabe des Schalters '-$=Sonderzeichen' 
  3900.  auf der Kommandozeile definiert werden. Dadurch k╨ñnnen Konflikte mit anderen 
  3901.  ╨¬bersetzern von Modula-2 vermieden werden. Andere ╨¬bersetzer k╨ñnnen n╨ömlich 
  3902.  eine ╨öhnliche Synatx f╨ær Direktiven innerhalb der Kommentare benutzen. 
  3903.  
  3904.  
  3905. ΓòÉΓòÉΓòÉ 13.3. Bedingte ╨¬bersetzung ΓòÉΓòÉΓòÉ
  3906.  
  3907. Dieser ╨¬bersetzer erlaubt auch die bedingte ╨¬bersetzung, indem man folgende in 
  3908. Kommentaren eingebettete Direktiven benutzt: 
  3909.  
  3910.  
  3911.   (*$IF BoolExpr *)     oder
  3912.   (*$IF NOT BoolExpr *) oder
  3913.   (*$IFDEF Ident *)     oder
  3914.   (*$IFNDEF Ident *)
  3915.      ........
  3916.   (*$ELSE *)
  3917.      ........
  3918.   (*$ENDIF *)
  3919.  
  3920. Dabei ist 'Ident' irgendein existierender Name. Und 'BoolExpr' ist irgendein 
  3921. existierender Name einer Bool'schen Konstante. 
  3922.  
  3923. Beispiel: 
  3924.  
  3925.     PROCEDURE CAP( ch:CHAR ):CHAR;
  3926.     CONST
  3927.       UseCountryCode = SYSTEM.OS2 AND SYSTEM.Flat32Model;
  3928.     VAR
  3929.       (*$IF UseCountryCode *)
  3930.         CountryCode : COUNTRYCODE;
  3931.         rc          : APIRET;
  3932.       (*$ENDIF *)
  3933.     BEGIN
  3934.       (*$IF UseCountryCode *)
  3935.         (* 32-bit OS/2 uses own case mapping *)
  3936.         CountryCode.Country := 0;
  3937.         CountryCode.CodePage := 0;
  3938.         rc := DosMapCase( 1, CountryCode, ch );
  3939.       (*$ELSE*)
  3940.         (* use Modula's case mapping *)
  3941.         CASE ch OF
  3942.         | '╨ö':      ch := '╨₧';
  3943.         | '╨ñ':      ch := '╨⌐';
  3944.         | '╨æ':      ch := '╨¬';
  3945.         | 'a'..'z': ch := CHR( ORD(ch) - (ORD('a') - ORD('A')) );
  3946.         END;
  3947.       (*$ENDIF*)
  3948.       RETURN ch;
  3949.     END CAP;
  3950.  
  3951.  
  3952. ΓòÉΓòÉΓòÉ 13.4. Binder-Direktiven ΓòÉΓòÉΓòÉ
  3953.  
  3954. Dieser ╨¬bersetzer stell auch eine spezielle Direktive f╨ær das Binder-Programm 
  3955. zur Verf╨ægung. Sie wird als eine besondere Direktive in einem Kommentar 
  3956. angegeben und nur innerhalb eines Programm-Moduls erkannt. Sie wird mit dem 
  3957. Schl╨æsselwort $LINK eingef╨æhrt und von einer beliebigen Anzahl von Definitionen 
  3958. f╨ærs Binder-Programm gefolgt. Letztere werden direkt an die Antwort-Datei f╨ær 
  3959. das Binder-Programm weitergereicht. Sie erg╨önzen oder ersetzen andere 
  3960. standard-m╨össig erzeugte Binder-Anweisungen. 
  3961.  
  3962. Beispiel: 
  3963.  
  3964. (*$LINK
  3965.   LIBRARY ANIMAL
  3966.     INITINSTANCE
  3967.   DESCRIPTION
  3968.     'Animal class DLL, compiled with Modula-2.'
  3969.   PROTMODE
  3970.   DATA
  3971.    MULTIPLE NONSHARED LOADONCALL
  3972. *)
  3973.  
  3974. Falls eine Binder-Direktive eine IMPORTS- oder EXPORTS- Liste enth╨ölt, wird 
  3975. keine standard-m╨össige Import- oder Export- Liste mehr aus dem Definitionsmodul 
  3976. erzeugt. Deswegen muss eine IMPORTS- oder EXPORTS- Direktive immer eine 
  3977. komplette Liste aller ╨ñffentlichen Symbole angeben. Eine Teilliste reicht nicht 
  3978. aus. Das Binder-Programm (f╨ær gew╨ñhnlich LINK386.EXE oder LINK.EXE) muss in der 
  3979. Lage sein, alle Angaben aus der Binder-Direktive zu verstehen. Normalerweise 
  3980. ist der Gebrauch von expliziten Binder-Direktiven ╨æberfl╨æssig f╨ær Programme 
  3981. oder dynamische Binder-Bibliotheken. Die Direktive $LINK ist haupts╨öchlich 
  3982. wegen den vom Standard abweichenden Spezifikationen bei den OS/2 
  3983. SOM-Bibliotheken eingef╨æhrt worden. 
  3984.  
  3985. Diese ╨¬bersetzer-Dokumentation enth╨ölt keine genaue Beschreibung aller 
  3986. m╨ñglichen Binder-Anweisungen. Letztere sind den Handb╨æchern von den 
  3987. Binder-Programmen LINK386 oder LINK zu entnehmen. 
  3988.  
  3989.  
  3990. ΓòÉΓòÉΓòÉ 13.5. ╨¬bersetzer-Umgebung ΓòÉΓòÉΓòÉ
  3991.  
  3992. Jedes Programm l╨öuft in einem Prozess, welcher seine eigene Umgebung hat. Die 
  3993. Prozess-Umgebung besteht aus einer Folge von Null-terminierten Zeichenketten. 
  3994. Jede Zeichenkette hat die Form <Name>=<Inhalt>. Eine Zeichenkette aus der 
  3995. Umgebung beginnt immer mit einem Namen, welcher die Umgebungsvariable genannt 
  3996. wird. Er wird von einem Gleichheitszeichen '=' und einer Zeichenkette gefolgt. 
  3997. Umgebungsvariablen speichern f╨ær die Programme gew╨ñhnlich die Informationen 
  3998. ╨æber die Umgebung im Betriebssystem. Dazu geh╨ñren zum Beispiel Angaben, in 
  3999. welchen Unterverzeichnissen auf der Festplatte nach bestimmten Daten oder 
  4000. Programmen gesucht werden soll. 
  4001.  
  4002. Dieser ╨¬bersetzer f╨ær Modula-2 konsultiert die folgenden Umgebungsvariablen: 
  4003.  
  4004.      MOD_SRC Verzeichnisse f╨ær Modula-2 Quelldateien (.MOD oder .DEF) 
  4005.      MOD_TMP Verzeichnis f╨ær tempor╨öre Dateien (.TMP oder .WRK) 
  4006.      MOD_LIB Verzeichnis f╨ær Bibliotheks-Dateien (.LIB oder .DLL) 
  4007.      MOD_OBJ_SMALL 
  4008.      MOD_OBJ_MEDIUM 
  4009.      MOD_OBJ_COMPACT 
  4010.      MOD_OBJ_LARGE 
  4011.      MOD_OBJ_FLAT32 Verzeichnisse f╨ær Objekt-Dateien (.OBJ) f╨ær die 
  4012.           entsprechenden Speicher-Modelle. 
  4013.      DPATH Standard-Verzeichnis f╨ær Objekt-Dateien (.OBJ) 
  4014.      APPEND Standard-Verzeichnis f╨ær Objekt-Dateien (.OBJ) 
  4015.      LIB  Standard-Verzeichnis f╨ær Bibliotheks-Dateien (.LIB oder .DLL) 
  4016.  
  4017.  Wenn die MOD_LIB Umgebungsvariable nicht existiert, dann wird die LIB 
  4018.  Umgebungsvariable genommen. 
  4019.  
  4020.  Wenn die _MOD_OBJ_... Umgebungsvariable f╨ær das entsprechende Speicher-Modell 
  4021.  nicht existiert, dann wird die DPATH Umgebungsvariable genommen. Wenn auch die 
  4022.  DPATH Umgebungsvariable nicht existiert, dann wird die APPEND 
  4023.  Umgebungsvariable genommen. Der ╨¬bersetzer mag mehrere Pfade nach 
  4024.  Objekt-Dateien absuchen, um zu pr╨æfen, ob abh╨öngige Module neu ╨æbersetzt 
  4025.  werden m╨æssen. Aber tats╨öchlich neu ╨æbersetzte Module werden nur im ersten 
  4026.  angegebenen Pfad abgespeichert. 
  4027.  
  4028.  Falls gar keine Umgebungsvariable f╨ær die Verzeichnisse der Objekt-Dateien 
  4029.  existiert, wird das aktuell eingestellte Verzeichnis '.\' f╨ær Objekt-Dateien 
  4030.  benutzt. Das gleiche gilt f╨ær Bibiliotheks-Dateien. 
  4031.  
  4032.  Die Programme LINK.EXE oder LINK386.EXE brauchen keine spezielle 
  4033.  Umgebungsvariablen, wenn die entsprechende Antwortdatei f╨ær den Binder benutzt 
  4034.  wird. Eine Antwortdatei wird durch die Make- oder Build- Funktion erzeugt. Nur 
  4035.  die TMP-Variable muss angegeben worden sein, weil diese das Verzeichnis f╨ær 
  4036.  tempor╨öre Dateien, welche auch vom Binder erzeugt werden, benennt. 
  4037.  
  4038.  
  4039. ΓòÉΓòÉΓòÉ 13.6. Erstellung dynamischer Binder-Bibliotheken ΓòÉΓòÉΓòÉ
  4040.  
  4041. Eine dynamische Binder-Bibliothek enth╨ölt ausf╨æhrbaren Code f╨ær gemeinsam 
  4042. benutzte Prozeduren, ╨öhnlich den bisherigen Bibliotheken. Der Code aus den 
  4043. dynamischen Bibliotheken wird jedoch nicht in die ausf╨æhrbare (.EXE) Datei 
  4044. ╨æbernommen. Stattdessen wird die Bibliothek selbst w╨öhrend der Laufzeit 
  4045. zusammen mit der ausf╨æhrbaren Datei in den Speicher geladen 
  4046.  
  4047. Dynamische Bibliothken dienen prinzipiell dem gleichen Zweck wie 
  4048. Standard-Bibiotheken, aber sie haben folgende Vorteile: 
  4049.  
  4050.      -    Anwendungen werden schneller gebunden. Mit dem dynamischen Binden 
  4051.           wird der ausf╨æhrbare Code einer dynamischen Binder-Bibliothek nicht 
  4052.           in die ausf╨æhrbare Datei einer Anwendung eingebaut. Nur eine 
  4053.           Import-Definition wird dort eingebracht. 
  4054.      -    Anwendungen belegen weniger Platz auf der Festplatte. Mit dem 
  4055.           dynamischen Binden ist es m╨ñglich geworden, dass verschiedene 
  4056.           Programme auf die gleiche dynamische Prozedur, die nur einmal geladen 
  4057.           wird, zugreifen k╨ñnnen. Ohne dynamisches Binden m╨æsste solch eine 
  4058.           Prozedur in jede .EXE-Datei kopiert werden, und w╨ærde dann mehrfach 
  4059.           existieren. 
  4060.      -    Bibliotheken und Anwendungen sind unabh╨öngig. Dynamische 
  4061.           Binder-Bibliotheken k╨ñnnen viele Male ge╨öndert werden, ohne dass die 
  4062.           Anwendungen, welche sie benutzen, neu gebunden werden m╨æssen. Dies 
  4063.           ist besonders f╨ær Drittanbieter von Bibliotheken von Vorteil. Im 
  4064.           Falle von ╨₧nderungen braucht nur eine neue Kopie der Bibliothek auf 
  4065.           der Festplatte installiert zu werden. Und w╨öhrend der Laufzeit k╨ñnnen 
  4066.           die unver╨öndert gebliebenen Anwendungen automatisch auf die neuen 
  4067.           Bibliotheks-Prozeduren zugreifen. 
  4068.      -    Code- und Daten-Segmente k╨ñnnen gemeinsam benutzt werden. Ohne 
  4069.           dynamisches Binden w╨öre so etwas gar nicht m╨ñglich, weil dann jede 
  4070.           ausf╨æhrbare Datei ihre eigenen Kopien dieser Segmente benutzen w╨ærde. 
  4071.           Durch die gemeinsame Benutzung von Segmenten dank dem dynamischen 
  4072.           Binden kann der Arbeitsspeicher effizienter bennutzt werden. 
  4073.  
  4074.  Unter OS/2 2.x/3.0 kann man auch gemeinsam benutzte Variablen als Teil der 
  4075.  Schnittstelle einer dynamischen Binder-Bibliothek deklarieren. Wie bei den 
  4076.  ╨ñffentlichen Prozeduren werden auch diese gemeinsamen Variablen nur einmal 
  4077.  angelegt, aber stehen dann f╨ær alle Anwendugen, welche die dynamische 
  4078.  Binder-Bibliothek benutzen, zur Verf╨ægung. 
  4079.  
  4080.  Dieser ╨¬bersetzer unterst╨ætzt die Erstellung dynamischer Binder-Bibliotheken. 
  4081.  Ein Definitions-Modul dient dazu, die ╨ñffentliche Schnittstelle der 
  4082.  dynamischen Binder-Bibliothek zu beschreiben, w╨öhrend das dazugeh╨ñrige 
  4083.  Implementations-Modul alle privaten Daten und Prozeduren deklariert. Aus der 
  4084.  Sicht eines Programmierers gibt es kaum einen Unterschied zwischen einem 
  4085.  normalen Modul und einer dynamischen Binder-Bibliothek. Um aus dem Code, 
  4086.  welcher von diesem ╨¬bersetzer aus einem Implementations-Modul erzeugt wird, 
  4087.  eine dynamische Binder-Bibliothek zu machen, muss folgende ╨¬bersetzer- 
  4088.  Direktive ganz am Anfang vom Definitions-Modul angegeben werden. 
  4089.  
  4090.     (*$DLL*)
  4091.  
  4092.  Falls f╨ær ein segmentiertes 16-Bit- Speicher-Modell ╨æbersetzt wird, dann muss 
  4093.  das Stapelspeicher-Segment f╨ær die dynamische Binder-Bibliothek als FAR 
  4094.  behandelt werden, denn es ist der Stapelspeicher vom Aufrufer, und nicht vom 
  4095.  Implementations-Modul, welcher w╨öhrend der Laufzeit benutzt wird. Die folgende 
  4096.  ╨¬bersetzer- Direktive, welche ganz am Anfang eines Definitions-Moduls 
  4097.  anzugeben ist, informiert den ╨¬bersetzer darr╨æber, dass das 
  4098.  Stapelspeicher-Segment von ausserhalb stammt, also FAR ist: 
  4099.  
  4100.     (*$SSFAR*)
  4101.  
  4102.  Das folgende Beispiel illustriert die Erstellung einer dynamischen 
  4103.  Binder-Bibliothek unter OS/2 2.x/3.0 aus dem Standard-Modul 'Terminal'. Die 
  4104.  Quelldateien f╨ær die Definitions- und Implementations-Module m╨ñgen 
  4105.  folgendermassen aussehen: 
  4106.  
  4107.     (*$DLL Terminal to be implemented as dynamic link library *)
  4108.     DEFINITION MODULE Terminal;
  4109.       PROCEDURE Read( VAR ch: CHAR );
  4110.       PROCEDURE BusyRead( VAR ch: CHAR );
  4111.       PROCEDURE ReadAgain();
  4112.       PROCEDURE ScanCode():SHORTCARD;
  4113.       PROCEDURE SetEcho( Flag: BOOLEAN );
  4114.       PROCEDURE GetEcho( VAR Flag: BOOLEAN );
  4115.       PROCEDURE Write( ch: CHAR );
  4116.       PROCEDURE WriteLn();
  4117.       PROCEDURE WriteString( s: ARRAY OF CHAR );
  4118.     END Terminal.
  4119.  
  4120.     IMPLEMENTATION MODULE Terminal;
  4121.       (* private code and data declarations ... *)
  4122.     END Terminal.
  4123.  
  4124.  Die Schritte f╨ær die Erstellung sind dann fast die gleichen wie diejenigen 
  4125.  einer normalen ausf╨æhrbaren Datei. Insbesondere wird dabei die Make- Funktion 
  4126.  benutzt. 
  4127.  
  4128.     REM
  4129.     REM      Make the dynamic link library
  4130.     REM      TERMINAL.DLL
  4131.     REM
  4132.     MOD      TERMINAL.MOD -m -o
  4133.     LINK386 @TERMINAL.RSP
  4134.  
  4135.  In der Tat gibt zwischen den internen Formaten f╨ær ausf╨æhrbare Dateien und f╨ær 
  4136.  dynamische Binder-Bibliotheken kaum einen Unterschied. Nur die Erweiterungen 
  4137.  der Dateinamen unterscheiden sich wie folgt: 
  4138.  
  4139.     .DLL f╨ær dynamische Binder-Bibliotheken
  4140.    .EXE f╨ær ausf╨æhrbare Dateien
  4141.  
  4142.  
  4143. ΓòÉΓòÉΓòÉ 14. Spracherweiterungen ΓòÉΓòÉΓòÉ
  4144.  
  4145. Modula-2 ist eine m╨öchtige Hochsprache f╨ær die Programmierung. Die 
  4146. Sprachgrammatik basiert auf den Vorschl╨ögen des Buches 'Programmierung in 
  4147. Modula-2', vierte Ausgabe, von N.Wirth. Dennoch ist auch Modula-2 nicht 
  4148. perfekt. Moderne Software-Projekte erfordern Werkzeuge f╨ær die 
  4149. Objekt-orientierte Programmierung und teilweise auch f╨ær die Kooperation mit 
  4150. Modulen, welche in anderen Programmiersprachen, wie z.B. C, geschrieben worden 
  4151. sind. Eine Programmiersprache muss auch Zugang zu den APIs vom Betriebssystem 
  4152. bieten. Aus o.g. Gr╨ænden bietet dieser ╨¬bersetzer einige Erweiterungen 
  4153. gegen╨æber dem Modula-Standard an. Die Erweiterungen k╨ñnnen entweder auf der 
  4154. Kommandozeile mit dem globalen Schalter 
  4155.  
  4156.  -XL 
  4157.  
  4158. oder innerhalb von Kommantaren mit der lokalen ╨¬bersetzer- Direktive 
  4159.  
  4160.  (*$XL+*) 
  4161.  
  4162. aktiviert werden. Es werden dann folgende neue Merkmale angeboten: 
  4163.  
  4164.   - Erweiterte Namen
  4165.  - Neue reservierte Worte
  4166.  - Object-orientierte Merkmale
  4167.   - Erweiterung von Verbunden
  4168.   - Testen dynamischer Verbundtypen
  4169.   - Typenschutz-Selektoren
  4170.   - Regionaler Typenschutz
  4171.   - Typ-gebundene Prozeduren
  4172.  - System Object Model
  4173.  - Bitweise Operatoren
  4174.  - Neue logische Operatoren
  4175.  - Typisierte Konstanten
  4176.  - Multidimensionale offene Reihungsparameter
  4177.  - Segmentierung
  4178.  - Erweiterte Importe
  4179.  
  4180. Durch den Gebrauch eines der o.g. Merkmale wird ein Programm nat╨ærlich weniger 
  4181. portierbar f╨ær andere ╨¬bersetzer von Modula-2. Aber diese Erweiterungen k╨ñnnen 
  4182. die Erstellung von Software f╨ær viele Projekte wesentlich vereinfachen. Die 
  4183. folgenden Sektionen in dieser Dokumentation enthalten n╨öhere Informationen ╨æber 
  4184. jede der o.g. Spracherweiterungen. 
  4185.  
  4186.  
  4187. ΓòÉΓòÉΓòÉ 14.1. Erweiterte Namen ΓòÉΓòÉΓòÉ
  4188.  
  4189. Die Namen f╨ær Modula-2 bestehen aus Buchstaben und Ziffern. Bei den Buchstaben 
  4190. wird zwischen Gross- und Kleinschreibung unterschieden. Jeder Name muss mit 
  4191. einem Buchstaben beginnen. F╨ær die meisten Anwendungsprogramme ist diese 
  4192. Namensregelung ausreichend. Nut bei gemischtsprachiger Programmierung oder bei 
  4193. Benutzung von APIs vom Betriebssystem sind die Programmierbed╨ærfnisse 
  4194. hinsichtlich der Zusammensetzung der Namen nicht immer befriedigt. Die APIs von 
  4195. OS/2 2.x/3.0 und Module in der C-Sprache erlauben in ihren Zeichenketten f╨ær 
  4196. Namen auch das Unterstreichungszeichen '_'. Deshalb akzeptiert auch dieser 
  4197. ╨¬bersetzer zus╨ötzlich zu den normalen Buchstaben und Ziffern das 
  4198. Unterstreichungszeichen f╨ær die Namensbildung. Dies ist aber nur dann 
  4199. gestattet, wenn f╨ær die Spracherweiterungen entweder der entsprechende Schalter 
  4200. auf der Kommandozeile oder in einem Kommentar die entsprechende ╨¬bersetzer- 
  4201. Direktive aktiviert worden ist. 
  4202.  
  4203.  
  4204. ΓòÉΓòÉΓòÉ 14.2. Neue reservierte Worte ΓòÉΓòÉΓòÉ
  4205.  
  4206. Einige der erweiterten Merkmale der Sprache wie zum Beispiel die 
  4207. Objekt-orientierte Programmierung oder die neuen bitweisen und logischen 
  4208. Operatoren machen es erforderlich, folgende neue Worte als reserviert 
  4209. einzuf╨æhren: 
  4210.  
  4211.    FAR
  4212.    IS
  4213.    NEAR
  4214.    SHL
  4215.    SHR
  4216.    XOR
  4217.  
  4218. Die o.g. Namen werden aber nur dann als neue Schl╨æsselworte betrachtet, wenn 
  4219. die Spracherweiterungen entweder auf der Kommandozeile durch einen Schalter 
  4220. oder in einem Kommentar durch eine Direktive entsprechend aktiviert worden 
  4221. sind. Diese Worte sind dann nicht mehr f╨ær Benutzernamen verf╨ægbar. 
  4222.  
  4223.  
  4224. ΓòÉΓòÉΓòÉ 14.3. Objekt-orientierte Merkmale ΓòÉΓòÉΓòÉ
  4225.  
  4226. Dieser ╨¬bersetzer f╨ær Modula-2 ist mit Objekt-orientierten Sprachkonstrukten 
  4227. erweitert worden. Sie lehnen sich eng an die neue Oberon-Sprache an. Oberon ist 
  4228. in den sp╨öten 1980ern als eine Nachfolgesprache f╨ær Modula-2 entwickelt worden, 
  4229. und zwar durch Niklaus Wirth an der ETH Z╨ærich. Die Oberon-Sprache ist 
  4230. ausf╨æhrlich in folgenden B╨æchern beschrieben worden: 
  4231.  
  4232.      -  'Programming in Oberon', by Martin Reiser, 1992, Addison Wesley, New 
  4233.         York. 
  4234.      -  'Object-Oriented Programming in Oberon-2', by Hanspeter M╨ñssenbeck, 
  4235.         1993, Springer-Verlag, New York. 
  4236.  
  4237.  Schon fast seit den Urspr╨ængen der Programmierung ist die Entwicklung von 
  4238.  Software durch eine Prozedur-orientierte Art des Denkens betont gewesen. 
  4239.  Programme wurden in Prozeduren aufgeteilt. Prozeduren transformierten 
  4240.  Eingabedaten zu Ausgabedaten. 
  4241.  
  4242.  Der Objekt-orientierte Ansatz r╨æckt anstelle der Prozeduren die Daten mehr in 
  4243.  den Vordergrund. Die Daten und die Operationen, welche auf sie anwendbar sind, 
  4244.  machen sogenannte Objekte aus. Diese k╨ñnnen gewisse Anfragen abarbeiten und 
  4245.  geben als Ergebnis Daten zur╨æck. 
  4246.  
  4247.  Der wesentliche Punkt ist nun hierbei der, dass man sich nicht um den Typ des 
  4248.  Objekts, an welchen eine Anfrage geschickt wird, zu k╨æmmern hat. Jeder 
  4249.  Objekttyp besitzt seine eigenen Hantierer, welche Methoden genannt werden. Und 
  4250.  mit diesen werden alle Anfragen abgearbeitet. 
  4251.  
  4252.  Objekt-orientierte Sprachen bieten gew╨ñhnlich folgende Merkmale: 
  4253.  
  4254.     - verborgene Informationen
  4255.    - Datenabstraktion
  4256.    - Vererbung
  4257.    - Dynamisches Binden
  4258.  
  4259.  Das Verbergen von Informationen bedeutet, dass die Implementation komplexer 
  4260.  Daten in Objekte eingekapselt ist und dass Klienten nur eine abstrakte Sicht 
  4261.  dieser Daten zug╨öngig ist. Klienten k╨ñnnen die eingekapselten Daten nicht 
  4262.  direkt ansprechen, sondern sie m╨æssen hierf╨ær Prozeduren, welche Bestandteil 
  4263.  der jeweiligen Objekte sind, benutzen. So werden die Klienten nicht mit den 
  4264.  Details der Implementation behelligt, und sie sind auch nicht von sp╨öteren 
  4265.  ╨₧nderungen in der Implementation des Objekts betroffen. Das Verbergen von 
  4266.  Informationen ist auch schon bei nicht Objekt-orientierten Programmiersprachen 
  4267.  seit vielen Jahren verf╨ægbar gewesen. Modula-2 zum Beispiel erreicht dieses 
  4268.  durch Module mit exportierten Prozeduren zur Handhabung der verborgenen Daten. 
  4269.  Zur Objekt-orientierten Programmierung geh╨ñrt jedoch mehr. 
  4270.  
  4271.  Die Datenabstraktion ist der n╨öchste Schritt, der ╨æber das Verbergen von 
  4272.  Informationen hinausgeht. Die o.g. Objekte existieren nur einmal, aber 
  4273.  manchmal werden mehrere Kopien von ihnen ben╨ñtigt. So wie der Programmierer 
  4274.  eine  beliebige Anzahl von Variablen gleichen Typs deklarieren kann, macht es 
  4275.  Objekt-orientierte Programmierung m╨ñglich, mehrfache Objekte eines gemeinsamen 
  4276.  abstrakten Datentyps, einschliesslich ihren speziellen Operationen, zu 
  4277.  deklarieren. Ein abstrakter Datentyp ist somit eine Einheit aus Daten und 
  4278.  ihren anwendbaren Operationen. Mehrfache Variablen solch eines Typs k╨ñnnen 
  4279.  deklariert werden. Unter Modula-2 wird dies haupts╨öchlich mit Variablen eines 
  4280.  Verbundtyps erreicht. Dieser Verbund kann auch Felder mit Prozedur-Typen f╨ær 
  4281.  die Bearbeitungsfunktionen und Operationen enthalten. Bearbeitungsfunktionen 
  4282.  k╨ñnnen nat╨ærlich auch innerhalb eines gleichen Moduls zusammen mit den 
  4283.  Verbundtypen separat deklariert werden. 
  4284.  
  4285.  Die Vererbung ist ein neuartiges Konzept. Man findet sie nicht in 
  4286.  konventionellen Programmiersprachen. Sie beinhaltet, dass ein bereits 
  4287.  existierender abstrakter Datentyp, das heisst ein Verbundtyp, zu einem neuen 
  4288.  Typ erweitert werden kann. Dieser neue Typ ererbt alle Daten und Operationen 
  4289.  vom bisherigen Typ, und er kann zus╨ötzliche Daten und Operationen bekommen 
  4290.  oder ererbte Operationen modifizieren. Dadurch wird es m╨ñglich, einen Typ als 
  4291.  ein halbfertiges Produkt zu entwerfen und ihn in eine Bibliothek abzulegen. 
  4292.  Sp╨öter kann er zu verschiedenen Endprodukten erweitert werden. Von besonderer 
  4293.  Beduetung ist bei der Vererbung die Tatsache, dass der erweiterte Typ mit dem 
  4294.  Original kompatibel bleibt. Alle Prozeduren, die mit dem originalen Typ 
  4295.  arbeiten, laufen auch f╨ær Objekte mit dem neuen Typ. Dadurch wird die 
  4296.  Wiederverwendbarkeit bereits existierender Algorithmen erheblich gef╨ñrdert. 
  4297.  
  4298.  Das vierte Merkmal von Objekt-orientierten Programmiersprachen ist das 
  4299.  dynamische Binden von Nachrichten oder Anfragen an Prozeduren. Prozeduren 
  4300.  werden erst w╨öhrend der Laufzeit an den dynamischen Typ von Objekten gebunden. 
  4301.  Dynamisches Binden ist auch schon seit langer Zeit in Form von 
  4302.  Prozedur-Variablen bekannt. Die Aktivierung einer Prozedur-Variablen 
  4303.  veranlasst die Ausf╨æhrung derjenigen Prozedur, die w╨öhrend der Laufzeit in ihr 
  4304.  steht. Das Arbeiten mit Prozedur-Variablen ist jedoch m╨æhselig und 
  4305.  fehlertr╨öchtig. Das Konzept der dynamischen Bindung in den Objekt-orientierten 
  4306.  Sprachen stellt eine elegantere und sichere L╨ñsung dar. 
  4307.  
  4308.  Die folgende Tabelle ╨æbersetzt die wichtigsten Begriffe von 
  4309.  Objekt-orientierten Sprachen in eine konventionelle Terminologie. Diese 
  4310.  Begriffe representieren nicht unbedingt radikal neue Konzepte, aber sie haben 
  4311.  ihre entsprechenden Begriffe in der konventionellen Programmierung. 
  4312.  
  4313.      OOP-Begriff         Konventioneller Begriff 
  4314.  
  4315.      Klasse              Erweiterbarer Verbundtyp, welcher einen abstrakten 
  4316.                          Datentyp mit Feldern von Prozedurtypen definiert. 
  4317.      Objekt              Variable, welche zu einer Instanz von einem 
  4318.                          (m╨ñglicherweise erweiterten ) Verbundtyp zeigt. 
  4319.      Nachricht           Ein Aufruf einer Prozedur, welche mit der Klasse in 
  4320.                          Verbindung steht 
  4321.      Methode             Prozedur einer Klasse, entweder im selben Modul 
  4322.                          deklariert, oder dynamisch an einem Verbundfeld mit 
  4323.                          einem kompatiblen Prozedur-Typ gebunden, oder 
  4324.                          Typ-gebunden zur Klasse. 
  4325.  
  4326.  Um es zusammenzufassen: Objekt-orientierte Programmierung bedeutet eine 
  4327.  Programmierung mit abstrakten Datentypen (Klassen), unter Zuhilfenahme der 
  4328.  Vererbung und dem dynamischen Binden. Dieser ╨¬bersetzer f╨ær Modula-2 bietet 
  4329.  folgende M╨ñglichkeiten f╨ær die Objekt-Orientierung an: 
  4330.  
  4331.     - Erweiterung von Verbundtypen
  4332.    - Testen dynamischer Verbundtypen
  4333.    - Typenschutz-Selektoren
  4334.    - Regionaler Typenschutz
  4335.  
  4336.  Objekt-Orientierung wird durch den Gebrauch o.g. M╨ñglichkeiten und durch den 
  4337.  Gebrauch von Variablen mit Prozedurtypen f╨ær das dynamische Binden von 
  4338.  Methoden an Verbunde erreicht. Objekt-Orientierung kann auch in noch 
  4339.  elegantere Weise durch Typ-gebundene Prozeduren in Verbindung mit oben 
  4340.  aufgelisteten Merkmalen erreicht werden. Ausf╨æhrliche Beipiele sind in dieser 
  4341.  Dokumentation in den Abschnitten ╨æber den Typentests und ╨æber den 
  4342.  Typ-gebundenen Prozeduren beschrieben. 
  4343.  
  4344.  
  4345. ΓòÉΓòÉΓòÉ 14.3.1. Erweiterung von Verbundtypen ΓòÉΓòÉΓòÉ
  4346.  
  4347. Die M╨ñglichkeit der Erweiterung von Verbundtypen ist eines der Aspekte der 
  4348. Objekt-orientierten Programmierung (OOP) und der Grund daf╨ær, dass OOP sich in 
  4349. vielen Situationen gegen╨æber der konventionellen Programmierung als ╨æberlegen 
  4350. erweist. 
  4351.  
  4352. In diesem ╨¬bersetzer f╨ær Modula-2 kann ein Verbundtyp zu einem neuen Typ, 
  4353. welcher neue Felder enth╨ölt, erweitert werden, w╨öhrend die Kompatibilit╨öt mit 
  4354. dem urspr╨ænglichen Typ bewahrt bleibt. In den Deklarationen 
  4355.  
  4356.   TYPE
  4357.     T0 = RECORD ... END;
  4358.     T1 = RECORD( T0 ) ... END;
  4359.  
  4360. ist T1 eine (direkte) Erweiterung von T0, und T0 ist der (direkte) Basistyp von 
  4361. T1. Oder, um es in OOP-Begriffen auszudr╨æcken: T0 ist die Basisklasse oder 
  4362. Superklasse von T1, w╨öhrend die Erweiterung als eine Unterklasse von T0 
  4363. betrachtet werden kann. 
  4364.  
  4365. Die Angabe des Namens des Basistyps in Klammern hinter dem Symbol RECORD deutet 
  4366. an, dass der neue Typ eine Erweiterung vom Basistyp ist und somit zus╨ötzlich zu 
  4367. seinen eigenen Feldern auch alle Felder vom Basistyp enthalten soll, so als ob 
  4368. diese hier explizit deklariert worden w╨ören. Man sagt, dass der erweiterte Typ 
  4369. die Felder vom Basistyp erbt. Deshalb spricht man im Zusammenhang einer 
  4370. Typerweiterung auch von Vererbung. Die Erweiterung eines Typs funktioniert auch 
  4371. f╨ær entsprechende Zeigertypen. 
  4372.  
  4373. Beispiele: 
  4374.  
  4375.   TYPE
  4376.     P0 = POINTER TO T0;
  4377.     P1 = POINTER TO T1;         (* P1 extends P0 *)
  4378.     T0 = RECORD ... END;
  4379.     T1 = RECORD( T0 ) ... END;  (* T1 extends T0 *)
  4380.  
  4381.  
  4382. ΓòÉΓòÉΓòÉ 14.3.2. Testen dynamischer Verbundtypen ΓòÉΓòÉΓòÉ
  4383.  
  4384. Ein g╨öngiges Problem in der Objekt-orientierten Programmierung ist das der 
  4385. Methodenaufl╨ñsung. Nachrichten oder Anfragen k╨ñnnen zu jeder Variablen, welche 
  4386. zu einem dynamisch reservierten Verbund zeigt, (d.h. Objekt-Variablen) 
  4387. verschickt werden. Das Objekt muss nun die richtige Prozedur zur Handhabung der 
  4388. Anfragen oder Nachrichten herausfinden. Hierf╨ær muss der dynamische Typ des 
  4389. Objekts bekannt sein. Da eine Objekt- Variable auch auf Verbunde seiner 
  4390. Basistypen zeigen kann, wird vor dem eigentlichen Aufruf einer Prozedur zur 
  4391. Handhabung einer Nachricht ein dynamischer Typentest ben╨ñtigt. Nur so kann zum 
  4392. richtigen Typ die entsprechende Prozedur gefunden werden. Solch ein Test muss 
  4393. also den dynamischen Typ f╨ær einen Verbund- Zeiger, welcher in einer Variablen 
  4394. steht, feststellen. Der neue relationale Operator 'IS' f╨æhrt genau diesen 
  4395. Typentest durch: 
  4396.  
  4397.   v IS T
  4398.  
  4399. ist nur dann erf╨ællt, wenn der aktuelle (oder dynamische) Typ von 'v' eine 
  4400. Erweiterung von 'T' ist; das heisst, er muss zu 'T' oder zu einer Erweiterung 
  4401. von 'T' gleich sein. 'T' muss eine Erweiterung vom deklarierten (oder 
  4402. statischen) Typ einer Variablen 'v' sein; Und die Variable 'v' ist ein Verbund- 
  4403. Zeiger oder ein formaler VAR-Parameter eines Verbundtyps. 
  4404.  
  4405. Das folgende Beispiel zeigt ein Objekt-orientiertes Grundger╨æst f╨ær eine 
  4406. einfache Grafikverarbeitung: 
  4407.  
  4408.   TYPE (* Message types for graphic objects *)
  4409.     Msg          = RECORD
  4410.                    END;
  4411.     DrawMsg      = RECORD( Msg )
  4412.                    END;
  4413.     ClearMsg     = RECORD( Msg )
  4414.                    END;
  4415.     MarkMsg      = RECORD( Msg )
  4416.                    END;
  4417.     MoveMsg      = RECORD( Msg )
  4418.      dX,dY         : INTEGER;
  4419.                    END;
  4420.     ...
  4421.  
  4422.   TYPE (* common graphics figure type *)
  4423.     Figure       = POINTER TO FigureRec;
  4424.   TYPE (* Handler procedure for graphics figure *)
  4425.     Handler      = PROCEDURE( Self : Figure; VAR Message : Msg );
  4426.   TYPE (* common graphics figure structure *)
  4427.     FigureRec    = RECORD
  4428.       Handle       : Handler;
  4429.       selected     : BOOLEAN;
  4430.     END;
  4431.     ...
  4432.  
  4433.   TYPE (* Rectangle = extended Figure *)
  4434.     Rectangle    = POINTER TO RectangleRec;
  4435.     RectangleRec = RECORD( FigureRec )
  4436.       x,y,w,h      : INTEGER;
  4437.     END;
  4438.     ...
  4439.  
  4440.   TYPE (* TextBox = extended Rectangle *)
  4441.     TextBox      = POINTER TO TextBoxRec;
  4442.     TextBoxRec   = RECORD( RectangleRec )
  4443.       text         : ARRAY [0..31] OF CHAR;
  4444.     END;
  4445.     ...
  4446.  
  4447.   (* Message handler for Rectangle *)
  4448.   PROCEDURE HandleRectangle( Self : Figure; Message : Msg );
  4449.   BEGIN
  4450.     WITH Self : Rectangle DO
  4451.       (* 'Self' treated as if it were of type 'Rectangle' *)
  4452.       IF Message IS DrawMsg THEN
  4453.         WITH Message : DrawMsg DO
  4454.           (* draw a rectangle *)
  4455.           ...
  4456.         END;
  4457.       ELSIF Message IS ClearMsg THEN
  4458.         WITH Message : ClearMsg DO
  4459.           (* clear a rectangle *)
  4460.           ...
  4461.         END;
  4462.       ELSIF Message IS MarkMsg THEN
  4463.         WITH Message : MarkMsg DO
  4464.           (* mark a rectangle *)
  4465.           Self^.selected := TRUE;
  4466.           ...
  4467.         END;
  4468.       ELSIF Message IS MoveMsg THEN
  4469.         WITH Message : MoveMsg DO
  4470.           (* move a rectangle *)
  4471.           Self^.x := Self^.x + Message.dX;
  4472.           Self^.y := Self^.y + Message.dY;
  4473.           ...
  4474.         END;
  4475.       ELSE
  4476.         (* Message not understood, typically no action *)
  4477.       END;
  4478.     END;
  4479.   END HandleRectangle;
  4480.   ...
  4481.  
  4482.   (* Message handler for TextBox *)
  4483.   PROCEDURE HandleTextBox( Self : Figure; Message : Msg );
  4484.   BEGIN
  4485.     WITH Self : TextBox DO
  4486.       ...
  4487.     END;
  4488.   END HandleRectangle;
  4489.   ...
  4490.  
  4491.   VAR
  4492.     MyFigure     : Figure;
  4493.     MyRectangle  : Rectangle;
  4494.     MyTextBox    : TextBox;
  4495.     ...
  4496.   BEGIN
  4497.     (* Create new Rectangle object *)
  4498.     NEW( MyRectangle );
  4499.     MyFigure = MyRectangle;
  4500.     ...
  4501.     (* dynamic binding of a Rectangle specific handler *)
  4502.     MyFigure^.Handle := HandleRectangle;
  4503.     ...
  4504.     IF MyFigure IS Figure THEN      (* TRUE *)
  4505.       (* perform Figure specific operations *)
  4506.       ...
  4507.     END;
  4508.     ...
  4509.     IF MyFigure IS Rectangle THEN    (* TRUE *)
  4510.       ...
  4511.       (* perform Rectangle specific operations,
  4512.          e.g. drawing and marking
  4513.       *)
  4514.       MyFigure^.Handle( MyFigure, DrawMsg );
  4515.       MyFigure^.Handle( MyFigure, MarkMsg );
  4516.       ...
  4517.     END;
  4518.     ...
  4519.     IF MyFigure IS TextBox THEN    (* FALSE *)
  4520.       ...
  4521.       (* this would perform TextBox specific operations,
  4522.          if Figure were of type TextBox
  4523.       *)
  4524.       ...
  4525.     END;
  4526.     ...
  4527.   END ...
  4528.  
  4529.  
  4530. ΓòÉΓòÉΓòÉ 14.3.3. Typenschutz-Selektoren ΓòÉΓòÉΓòÉ
  4531.  
  4532. ΓûÉ Designator  = Qualident { Selector }
  4533. ΓûÉ Selector    = TypeGuard
  4534. ΓûÉ TypeGuard   = "(" Qualident ")"
  4535.  
  4536. Jedes Objekt (im Sinne von OOP) ist f╨ær diesen ╨¬bersetzer eine Variable, welche 
  4537. auf eine Instanz (Auftreten) eines (m╨ñglicherweise erweiterten) Verbundtyps 
  4538. zeigt. Wegen den Regeln der Zuweisung f╨ær erweiterte Verbunde muss sich ein 
  4539. Objekt- Operand nicht immer auf den urspr╨ænglichen Verbundtyp beziehen. Es kann 
  4540. auch auf eine der erweiterten Typen zeigen. Aus diesem Grund ist ein neuer 
  4541. Selektor eingef╨æhrt worden, n╨ömlich der sogenannte Typenschutz. 
  4542.  
  4543. Der Typenschutz 'V(T0)' stellt sicher, dass die Variable 'v' mindestens den 
  4544. dynamischen Typ 'T0' (oder einen der Erweiterungen) besitzt. Die 
  4545. Programmausf╨æhrung wird abgebrochen, wenn 'v' nicht den geforderten Typ 
  4546. enth╨ölt. Der Typenschutz ist anwendbar, wenn 
  4547.  
  4548.      (1)     T0 eine Erweiterung vom deklarierten Typ 'T' von 'v' ist, und 
  4549.      (2)     'v' ein formaler VAR-Parameter eines Verbundtyps oder 'v' ein 
  4550.              Verbundzeiger ist. 
  4551.  
  4552.  Durch die Angabe eines Typenschutz-Selektors erreicht der Programmierer, dass 
  4553.  der Operand so behandelt wird, als ob er von Anfang an mit dem erweiterten Typ 
  4554.  deklariert worden w╨öre, ohne auf einen Laufzeittest f╨ær den korrekten Gebrauch 
  4555.  des Verbundtyps zu verzichten. 
  4556.  
  4557.  Beispiel: 
  4558.  
  4559.     TYPE
  4560.       (* common graphics base type *)
  4561.       Figure       = POINTER TO FigureRec;
  4562.       FigureRec    = RECORD
  4563.         selected     : BOOLEAN;
  4564.       END;
  4565.       ...
  4566.       (* extended Figure *)
  4567.       Rectangle    = POINTER TO RectangleRec;
  4568.       RectangleRec = RECORD( FigureRec )
  4569.         x,y,w,h      : INTEGER;
  4570.       END;
  4571.       ...
  4572.       (* extended Rectangle *)
  4573.       TextBox      = POINTER TO TextBoxRec;
  4574.       TextBoxRec   = RECORD( RectangleRec )
  4575.         text         : ARRAY [0..31] OF CHAR;
  4576.       END;
  4577.       ...
  4578.     VAR
  4579.       MyFigure     : Figure;
  4580.       ...
  4581.     BEGIN
  4582.       ...
  4583.       IF MyFigure IS TextBox THEN
  4584.         (* MyFigure has extended type
  4585.            POINTER TO TextBoxRec during run time
  4586.         *)
  4587.         MyFigure( TextBox )^.text := "default string";
  4588.       END;
  4589.       ...
  4590.     END
  4591.     ...
  4592.  
  4593.  
  4594. ΓòÉΓòÉΓòÉ 14.3.4. Regionaler Typenschutz ΓòÉΓòÉΓòÉ
  4595.  
  4596. ΓûÉ WithStmt       = WITH Guard DO StmtSeq END
  4597. ΓûÉ Guard          = Qualident ":" Qualident
  4598.  
  4599. Es kommt h╨öufig vor, dass in einer Anweisungsfolge der gleiche Typenschutz 
  4600. mehrfach auftritt. Deshalb w╨öre ein Typenschutz mit einem erweiterten 
  4601. textuellen Sichtbarkeitsbereich w╨ænschenswert. Dieser w╨ærde die Klarheit 
  4602. verbessern und den Verwaltungsaufwand verringern. Die erweiterte Form der 
  4603. With-Anweisung bietet genau den geforderten regionalen Typenschutz. Im 
  4604. Gegensatz zur normalen Modula-2- With-Anweisung macht diese erweiterte Form 
  4605. nicht automatisch in einem neuen lokalen Sichtbarkeitsbereich die Verbundfelder 
  4606. verf╨ægbar. Verbundfelder m╨æssen selbst innerhalb dieser erweiterten 
  4607. With-Anweisung immer noch mit einem Verbund- Bezeichner qualifiziert werden. 
  4608.  
  4609. Beispiel: 
  4610.  
  4611.   TYPE
  4612.     (* common graphics base type *)
  4613.     Figure       = POINTER TO FigureRec;
  4614.     FigureRec    = RECORD
  4615.       selected     : BOOLEAN;
  4616.     END;
  4617.     ...
  4618.     (* extended Figure *)
  4619.     Rectangle    = POINTER TO RectangleRec;
  4620.     RectangleRec = RECORD( FigureRec )
  4621.       x,y,w,h      : INTEGER;
  4622.     END;
  4623.     ...
  4624.     (* extended Rectangle *)
  4625.     TextBox      = POINTER TO TextBoxRec;
  4626.     TextBoxRec   = RECORD( RectangleRec )
  4627.       text         : ARRAY [0..31] OF CHAR;
  4628.     END;
  4629.     ...
  4630.   VAR
  4631.     MyFigure     : Figure;
  4632.     ...
  4633.   BEGIN
  4634.     ...
  4635.     IF MyFigure IS Rectangle THEN
  4636.       WITH MyFigure : Rectangle DO
  4637.         (* Designator 'MyFigure' treated as if it were of type
  4638.            POINTER TO RectangleRec inside this scope
  4639.         *)
  4640.         MyFigure^.x := 1;
  4641.         MyFigure^.y := 2;
  4642.         MyFigure^.w := 10;
  4643.         MyFigure^.h := 15;
  4644.       END;
  4645.     END;
  4646.     ...
  4647.   END
  4648.   ...
  4649.  
  4650.  
  4651. ΓòÉΓòÉΓòÉ 14.3.5. Typ-gebundene Prozeduren ΓòÉΓòÉΓòÉ
  4652.  
  4653. ΓûÉ ProcedureHeading = [ NEAR | FAR ] PROCEDURE
  4654. ΓûÉ                    [ Receiver ] Ident [ FormalParameters ]
  4655. ΓûÉ Receiver         = "(" [ [ NEAR | FAR ] VAR ] Ident : Ident ")"
  4656.  
  4657. Dieser ╨¬bersetzer f╨ær Modula-2 unterst╨ætzt das Konzept der Typ-gebundenen 
  4658. Prozeduren. Es ist nur dann verf╨ægbar, wenn die Spracherweiterungen akitviert 
  4659. sind. Typ-gebundene Prozeduren wurden erstmalig mit der neuen Sprache Oberon-2 
  4660. eingef╨æhrt. Oberon-2 ist der Objekt-orientierte Nachfolger von Modula-2. Dies 
  4661. ist auch der Grund daf╨ær, dass dieser ╨¬bersetzer f╨ær Modula-2 viele 
  4662. Objekt-orientierte Merkmale von Oberon-2 ╨æbernommen hat, und zwar in Form einer 
  4663. Spracherweiterung f╨ær Modula-2. 
  4664.  
  4665. Global deklarierte Prozeduren k╨ñnnen an einem Verbundtyp, welcher im selben 
  4666. Modul deklariert ist, gekoppelt sein. Man sagt, dass diese Prozeduren dann an 
  4667. den Verbundtyp gebunden sind. Somit kann der Verbundtyp dann als eine Klasse 
  4668. aufgefasst werden, wobei seine Typ-gebundene Prozeduren als seine Methoden 
  4669. dienen. Die Methoden sind f╨ær die Zugriffe und Ver╨önderungen auf die 
  4670. (m╨ñglicherweise mehrfach auftretende) Instanz einer Klasse verantwortlich. 
  4671.  
  4672. Die Bindung wird durch den Typ vom Empf╨önger angegeben. Der Empf╨önger steht in 
  4673. dem Kopf einer Prozedur-Deklaration. Der Empf╨önger darf entweder als ein 
  4674. VAR-Parameter eines Verbundtyps T oder als einen Wert-Parameter mit einem 
  4675. Zeigertyp zum Verbundtyp T angegeben werden. Die Prozedur ist dann an den Typ T 
  4676. gebunden und wird innerhalb von T als lokal betrachtet. 
  4677.  
  4678. Die Bindung einer Prozedur P zu einem Typ T0 beinhaltet auch die Bindung zu 
  4679. einem Typ T1, sofern letzterer eine Erweiterung von T0 ist.  Eine Prozedur P' 
  4680. (mit gleichem Namen wie P) darf aber auch explizit an T1 gebunden werden, 
  4681. wodurch die Bindung von P ╨æberschrieben wird. P' wird dann als eine 
  4682. Redefinition von P f╨ær T1 aufgefasst. Die formalen Parameter von P und P' 
  4683. m╨æssen ╨æbereinstimmen. Sowohl P' als auch T1 m╨æssen im gleichen Modul 
  4684. deklariert werden. Dies gilt auch f╨ær die urspr╨ænglichen P und T. Wenn T1 
  4685. exportiert wird, dann darf auch P' exportiert werden. Im Gegensatz zu Oberon-2 
  4686. akzeptiert dieser ╨¬bersetzer f╨ær Modula-2 auch die Deklarationen von privaten 
  4687. Typ-gebundenen Prozeduren, selbst wenn sie vererbte Methoden, die aus anderen 
  4688. Definitions-Modulen exportiert werden, ╨æberschreiben. Eine Typ-gebundene 
  4689. private Methode kann nur in einem Implementations-Modul oder in einem 
  4690. Programm-Modul angegeben werden, w╨öhrend sein Typ selbst im entsprechenden 
  4691. Definitions-Modul deklariert sein kann. 
  4692.  
  4693. Falls ein Bezeichner v auf einen Verbund zeigt und P eine Typ-gebundene 
  4694. Prozedur ist, dann gibt v^.P diejenige Prozedur an, die an den dynamischen Typ 
  4695. von v gebunden ist. Sie kann dabei eine andere Prozedur sein als diejenige, 
  4696. welche an den statischen Typ von v gebunden ist. Die Variable v wird gem╨öss den 
  4697. Regeln zur ╨¬bergabe von Parametern einer Prozedure-Deklaration. weitergereicht. 
  4698.  
  4699. Es kann auch eine Eltern-Prozedur bezeichnet werden. Wenn r als Empf╨önger mit 
  4700. einem VAR-Parameter und einem Verbundtyp T deklariert worden ist, gibt r.P^ die 
  4701. redefinierte, und an den Basistyp von T gebundenene, Prozedur P an. Ebenso 
  4702. gilt, falls p als ein Empf╨önger mit einem VAL-Parameter und einem formalen 
  4703. Zeigertyp P auf dem Verbundtyp T deklariert worden ist, dass p^.P^ diejenige 
  4704. redefinierte Prozedur P bezeichnet, welche an den Basistyp von T gebunden ist. 
  4705. Die Bezeichnung einer Eltern-Prozedur ergibt immer eine statische Bezugnahme 
  4706. zur Prozedur, ohne  sich um etwaige dynamische Bindungen zu k╨ænmern. 
  4707.  
  4708. Bei einer vorw╨örts deklararierten Typ-gebundenen Prozedur mittels FORWARD muss 
  4709. der als Empf╨önger angegebene Parameter mit der aktuellen Prozedur-Deklaration 
  4710. typenm╨össig identisch sein. Das gleiche gilt auch f╨ær alle in einem 
  4711. Definitions-Modul angegebenen Prozedurk╨ñpfe mit Typ-Bindung, da sie erst im 
  4712. Implementations-Modul voll deklariert werden. Die formalen Parameter m╨æssen f╨ær 
  4713. beide Deklarationen ╨æbereinstimmen. 
  4714.  
  4715. Beispiel: 
  4716.  
  4717.   TYPE
  4718.     TREE =  POINTER TO NODE;
  4719.     NODE =  RECORD
  4720.       key   : INTEGER;
  4721.       left  : TREE;
  4722.       right : TREE;
  4723.             END;
  4724.  
  4725.   TYPE
  4726.     CENTERTREE = POINTER TO CENTERNODE;
  4727.     CENTERNODE = RECORD( NODE )
  4728.       width      : INTEGER;
  4729.       subnode    : TREE;
  4730.                  END;
  4731.  
  4732.   (* declaring method Insert for TREE *)
  4733.   PROCEDURE( self : TREE ) Insert( node : TREE );
  4734.     VAR p, father : TREE;
  4735.   BEGIN
  4736.     p := self;
  4737.     REPEAT
  4738.       father := p;
  4739.       IF node^.key = p^.key THEN
  4740.         RETURN
  4741.       ELSIF node^.key < p^.key THEN
  4742.         p := p^.left
  4743.       ELSE
  4744.         p := p^.right;
  4745.       END;
  4746.     UNTIL p = NIL;
  4747.     IF node^.key < father^.key THEN
  4748.       father^.left := node;
  4749.     ELSE
  4750.       father^.right := node;
  4751.     END;
  4752.     node^.left := NIL;
  4753.     node^.right := NIL;
  4754.   END Insert;
  4755.  
  4756.   (* overriding method Insert for extended CENTERTREE *)
  4757.   PROCEDURE( self : CENTERTREE ) Insert( node : TREE );
  4758.   BEGIN
  4759.     WriteInt( node( CENTERTREE )^.width );
  4760.     (* now calling parent method bound to TREE *)
  4761.     self^.Insert^( node );
  4762.   END Insert:
  4763.  
  4764.  
  4765. ΓòÉΓòÉΓòÉ 14.4. System Object Model ΓòÉΓòÉΓòÉ
  4766.  
  4767. OS/2 besitzt ein besonderes System-Object-Model (SOM). Es stellt eine 
  4768. Objekt-orientierte Schnittstelle zur Erzeugung, Darstellung und ╨₧nderung von 
  4769. Software-Objekten dar. Die Software-Objekte werden in bin╨öre 
  4770. Klassen-Bibliotheken zusammengefasst. Im Gegensatz zu den Modellen f╨ær Objekte, 
  4771. wie man sie in den formalen Objekt-orientierten Sprachen wie z.B. C++ oder 
  4772. Oberon-2 findet, ist der Ansatz f╨ær SOM sprachneutral. Das bedeutet, dass 
  4773. Benutzer und Entwerfer eines Objektes ihre Programmierung nicht in der gleichen 
  4774. Sprache durchf╨æhren m╨æssen. Diese Unabh╨öngigkeit der Entwurfs- und Benutzer- 
  4775. Sprachen erstreckt sich sogar auf das Konzept der Unterklassen (oder, um es in 
  4776. Modula-2 oder Oberon-2 auszudr╨æcken: erweiterte Verbunde ). Der Benutzer einer 
  4777. SOM-Klasse kann eine neue Unterklasse entwerfen. Diese kann, muss aber nicht, 
  4778. in der gleichen Sprache wie die der ╨æbergeordneten Klasse formuliert werden. 
  4779.  
  4780. Prinzipiell ist es von Vorteil, SOM zu gebrauchen. Denn SOM gestattet auch 
  4781. ╨₧nderungen von Einzelheiten aus der Implementierung und teilweise sogar von der 
  4782. Schnittstelle einer Klasse. Dabei ensteht kein Bruch mit der bin╨ören 
  4783. Schnittstelle der Klasse, und es ist auch keine Neu-╨¬bersetzung von 
  4784. Klient-Programmen erforderlich. Man kann also festhalten, dass, wenn ╨₧nderungen 
  4785. einer SOM-Klasse keine ╨₧nderungen in Klient-Programmen erfordern, das f╨ær jene 
  4786. Klient-Programme keine Neu-╨¬bersetzung notwendig wird. Dies ist bei vielen 
  4787. Objekt-orientierten Sprachen nicht der Fall. Und deshalb ist es auch von 
  4788. besonderem Vorteil, wenn man SOM benutzt. SOM-Klassen k╨ñnnen folgende 
  4789. strukturelle ╨₧nderungen erfahren, ohne die bin╨öre R╨æckw╨örts-Vertr╨öglichkeit 
  4790. aufzugeben: 
  4791.  
  4792.  -    Hinzuf╨ægen von neuen Methoden 
  4793.  
  4794.  -    ╨₧ndern der Gr╨ñsse eines Objektes durch Hinzuf╨ægen oder Entfernen von 
  4795.       Instanz-Variablen 
  4796.  
  4797.  -    Hinzuf╨ægen von neuen Klassen oberhalb der eigenen Klasse in der 
  4798.       Hierarchie der Vererbungen 
  4799.  
  4800.  -    Versetzen von Methoden auf eine h╨ñhere Stufe innerhalb der Hierarchie der 
  4801.       Klasse 
  4802.  
  4803.  Kurzgefasst: Typische Arten von Ver╨önderungen k╨ñnnen an der Implementierung 
  4804.  vorgenommen werden. Diese m╨ñgen sich erst w╨öhrend der Software-Entwicklung 
  4805.  ergeben. 
  4806.  
  4807.  SOM soll wegen der folgenden drei Gr╨ænde sprachunabh╨öngig sein: 
  4808.  
  4809.  1.   Alle SOM-Interaktionen bestehen aus standard-m╨össigen Prozedur-Aufrufen. 
  4810.       Auf Systemen mit standardisierten Binder-Konventionen f╨ær 
  4811.       Prozedur-Aufrufe unterst╨ætzen die SOM-Interaktionen entsprechende 
  4812.       Standards. Deshalb k╨ñnnen die meisten Programmiersprachen, welche externe 
  4813.       Prozedur-Aufrufe kennen, vollen Gebrauch von SOM machen. Unter Modula-2 
  4814.       f╨ær OS/2 bedeutet dies nichts anderes als der Aufruf von externen 
  4815.       Prozeduren, welche in den Definitions-Modulen f╨ær dynamische 
  4816.       Binder-Bibliotheken deklariert sein m╨æssen. Die dynamischen 
  4817.       Binder-Bibliotheken f╨ær OS/2 k╨ñnnen ╨ñffentliche SOM-Klassen enthalten. 
  4818.  
  4819.  2.   Die Form der Programmier-Schnittstelle, oder kurz API, mag von Sprache zu 
  4820.       Sprache unterschiedlich sein. Dies wird durch sogenannte SOM-Bindungen 
  4821.       erreicht. Die Art und Weise, in der Programmierer Methoden aufrufen, 
  4822.       Objekte erzeugen, und so weiter, kann mit Leichtigkeit in die 
  4823.       semantischen Regeln aus einem grossen Bereich verschiedenster 
  4824.       kommerzieller Objekt-orientierter Programmier-Sprachen umgesetzt werden. 
  4825.       Dies gilt zum Beispiel f╨ær die Sprache C++. Selbst prozedurale Sprachen 
  4826.       wie zum Beispiel C oder Modula-2 bleiben nicht aussen vor. Die 
  4827.       SOM-Bindungen bestehen aus einer Menge von Makros und Prozedur-Aufrufen, 
  4828.       die die Implementierung und Benutzung von SOM-Klassen vereinfachen, denn 
  4829.       die jeweilige Schnittstelle ist auf die spezielle Programmiersprache 
  4830.       anpassbar. 
  4831.  
  4832.  3.   SOM unterst╨ætzt verschiedene Mechanismen zur Methoden-Aufl╨ñsung, welche 
  4833.       in die jeweilige Semantik aus einer grossen Auswahl von 
  4834.       Objekt-orientierten Sprachen umgesetzt werden k╨ñnnen. Deshalb k╨ñnnen 
  4835.       SOM-Klassen ╨æber die Grenzen verschiedener Objekt-Modelle hinweg 
  4836.       gemeinsam benutzt werden. Aus diesem Grund gibt es drei verschiedene 
  4837.       zugreifbare Verfahren zur Methoden-Aufl╨ñsung. 
  4838.  
  4839.  Die Mechanismen zur Methoden-Aufl╨ñsung unter SOM sind wie folgt: 
  4840.  
  4841.  Offset-Aufl╨ñsung Diese entspricht in etwa dem Konzept der virtuellen Funktion 
  4842.       von C++, oder auch dem Konzept der Typ-gebundenen Prozeduren aus Oberon-2 
  4843.       oder aus dieser erweiterten Modula-2-Sprache. Die Offset-Aufl╨ñsung 
  4844.       beinhaltet im wesentlichen ein statisches Schema von Objekt-Typen. Das 
  4845.       polymorphe Verhalten basiert streng auf die Klassen-Vererbung. Die 
  4846.       Offset-Aufl╨ñsung bietet die schnellste Leistung bei einer 
  4847.       SOM-Methoden-Aufl╨ñsung. Methoden, die durch die Offset-Aufl╨ñsung 
  4848.       zug╨önglich werden, k╨ñnnen als statische Methoden betrachtet werden, weil 
  4849.       sie als einen festen Bestandteil einer Objekt-Schnittstelle gelten. 
  4850.  
  4851.  Namens-Aufl╨ñsung Diese entspricht in etwa den Verfahren aus Objective-C und 
  4852.       Smalltalk. Die Namens-Aufl╨ñsung unterst╨ætzt typenlose Zugriffe auf 
  4853.       Objekte. Man spricht auch manchmal davon, dass solche Objekte lediglich 
  4854.       einen dynamischen Typ besitzen. Der polymorphe Charakter basiert auf den 
  4855.       akuellen Protokollen, denen die Objekte gehorchen. Die Namens-Aufl╨ñsung 
  4856.       bietet die M╨ñglichkeit, Code zur Manipulation von Objekten, welche zur 
  4857.       Zeit der ╨¬bersetzung weder den Typ noch das Aussehen vom Objekt kennen, 
  4858.       zu schreiben. 
  4859.  
  4860.  Aufl╨ñsung durch Abfertigungs-Funktionen Die Abfertigungs-Funktion (engl. 
  4861.       dispatch function) ist ein besonderes Merkmal von SOM. Sie erlaubt eine 
  4862.       auf besondere Regeln basierende Methoden-Aufl╨ñsung. Dies ist sonst nur in 
  4863.       der Dom╨öne der empfangenden Objekte gebr╨öuchlich. Sprachen, die eine 
  4864.       besondere Eingangs- oder Ausgangs- Sequenz erfordern, oder lokale Objekte 
  4865.       aus verteilten Objekt-Dom╨önen, sind gute Kandidaten f╨ær den Gebrauch von 
  4866.       Abfertigungs-Funktionen zur Methoden-Aufl╨ñsung. Diese Technik bietet das 
  4867.       h╨ñchste Mass an Kapselung f╨ær die Implementierung eines Objektes, 
  4868.       allerdings auf Kosten der System-Leistung. 
  4869.  
  4870.  Die urspr╨ængliche Planungsphilosophie von SOM sieht den Gebrauch eines 
  4871.  speziellen SOM-╨¬bersetzers vor. Dieser SOM-╨¬bersetzer liest eine 
  4872.  sprach-neutrale Klassenbeschreibung ein und erzeugt als Ausgabe 
  4873.  sprachspezifische SOM-Bindungen. Dieser ╨¬bersetzer f╨ær Modula-2 bietet einen 
  4874.  direkteren Ansatz. Dadurch ist kein spezieller sprach-neutraler SOM-╨¬bersetzer 
  4875.  mehr erforderlich. Existierende oder neue SOM-Klassen werden einfach als 
  4876.  vertraute Definitions-Module f╨ær Modula-2 formuliert. Und neue SOM-Klassen 
  4877.  k╨ñnnen in einem Implementations-Modul f╨ær Modula-2 eingef╨æhrt werden. 
  4878.  Nat╨ærlich bietet dieser direkte Ansatz keine automatische Erzeugung von 
  4879.  Sprach-Bindungen f╨ær andere Sprachen an. Aber die mit Modula-2 erzeugten 
  4880.  bin╨ören Bibliotheken mit neuen SOM-Klassen sind voll kompatibel mit dem OS/2 
  4881.  System Object Model. Und falls der Implementierer die sprach-neutrale Form der 
  4882.  Beschreibung einer SOM-Klasse anbieten m╨ñchte, kann er immer noch den OS/2 
  4883.  SOM-╨¬bersetzer nebst dazugeh╨ñrigen Handb╨æchern erwerben, und die 
  4884.  sprach-unabh╨öngige Form einer Beschreibungsdatei, d.h. 'interface description 
  4885.  file' (IDL-file), f╨ær den SOM-╨¬bersetzer erstellen. Der SOM-╨¬bersetzer w╨ærde 
  4886.  wiederum die Bindungen f╨ær die anderen Sprachen erzeugen k╨ñnnen. 
  4887.  
  4888.  Es gibt nur eine vordefinierte Basis-Klasse von all den SOM-Klassen. Alle 
  4889.  ╨æbrigen SOM-Klassen werden also letztlich von dieser Basis-Klasse hergeleitet. 
  4890.  Diese Basis-Klasse heisst 'SOMObject'. Sie bietet grundlegende Methoden an, 
  4891.  deren F╨öhigkeiten f╨ær jede SOM-Klasse n╨ætzlich sind. SOM bietet auch das 
  4892.  Konzept der Metaklassen an. Eine Metaklasse ist eine Klasse, dessen Instanzen 
  4893.  s╨ömtlich wiederum aus Klassen bestehen (auch unter den Bezeichnungen 
  4894.  Klassen-Objekte oder Klassen-Deskriptoren bekannt). Die Metaklasse bietet 
  4895.  Fabrizierungs-Methoden f╨ær eine regul╨öre Klasse, w╨öhrend eine regul╨öre Klasse 
  4896.  Instanz-Methoden bereith╨ölt. Fabrizierungs-Methoden beinhalten Methoden zur 
  4897.  Erzeugung oder Konstruktion von Instanzen f╨ær regul╨öre Klassen. Die 
  4898.  Basis-Klasse f╨ær alle Metaklassen von SOM heisst 'SOMClass'. Sie ist selbst 
  4899.  wiederum von 'SOMObject' hergeleitet. Eine neue SOM-Klasse wird gew╨ñhnlich mit 
  4900.  einer entsprechenden Metaklasse zu einem einzigen Modul geb╨ændelt. 
  4901.  
  4902.  
  4903. ΓòÉΓòÉΓòÉ 14.4.1. SOM-Klassen-Definition ΓòÉΓòÉΓòÉ
  4904.  
  4905. Jede unter OS/2 vorhandene SOM-Klasse wird schliesslich als eine bin╨öre Datei 
  4906. in einer dynamischen Binder-Bibliothek gespeichert. Falls ein Programmierer auf 
  4907. solch eine Bibliothek zugreifen m╨ñchte, wird er eine sprach-spezifische 
  4908. Schnittstelle zur Programmierung von Anwendungen, genannt die API (engl. f╨ær 
  4909. application programming interface) gebrauchen. Solch eine API besteht aus einer 
  4910. Klassenbeschreibung, die geeignet ist, um in den Prozess einer ╨¬bersetzung 
  4911. eingef╨ægt zu werden. Zum Beispiel verwendet die C-Sprache zu diesem Zweck 
  4912. spezielle Kopf-Dateien (engl. header files). Dieser ╨¬bersetzer f╨ær Modula-2 
  4913. gebraucht Definitions-Module, welche die dynamischen Binder-Bibliotheken mit 
  4914. ihren SOM-Klassen beschreiben. Das Fehlen entsprechender Implementations-Module 
  4915. verursacht nicht unbedingt eine Fehlermeldung durch diesen ╨¬bersetzer. Der 
  4916. ╨¬bersetzer versucht vielmehr, eine dynamische Binder-Bibliothek oder eine 
  4917. Import-Bibliothek gleichen Namens zu finden, welche mit einem anderen 
  4918. Sprach╨æbersetzer erzeugt worden ist. Das Definitions-Modul bezieht sich dann 
  4919. auf diese Bibliothek. Oder um es in Begriffen von OS/2 SOM auszudr╨æcken: Das 
  4920. Definitions-Modul, welches die Objekt-orientierte Beschreibung einer Klasse 
  4921. enth╨ölt, stellt die erforderliche Sprach-Bindung f╨ær Modula-2 dar. 
  4922.  
  4923. Die ╨ñffentliche Schnittstelle einer SOM-Klasse kann f╨ær diesen ╨¬bersetzer in 
  4924. einem Definitions-Modul f╨ær Modula-2 ausgedr╨æckt werden. Das Definitions-Modul 
  4925. beschreibt die neue Klasse in Begriffen, welche sich an eine 
  4926. Sprachen-erweiterte Objekt-orientierte Syntax anlehnen. Dabei werden erweiterte 
  4927. Verbundtypen und Typ-gebundene Prozeduren benutzt. Das folgende Beispiel 
  4928. demonstriert alle Merkmale der Beschreibung einer Schnittstelle von einer neuen 
  4929. SOM-Klasse: 
  4930.  
  4931. (*$DLL       soll eine dynamische Binderbibliothek werden               *)
  4932. (*$XL+       Modula-2 Sprach-Erweiterung : '_' zul╨össig f╨ær Symbole     *)
  4933. (*$CDECL+    C-artige Prozeduren                                        *)
  4934. (*$A         Standard-Ausrichtung f╨ær Verbundfelder                     *)
  4935.  
  4936. DEFINITION MODULE Dog;
  4937.  
  4938. (************************************************************************
  4939.   ╨⌐ffentliche Schnittstelle f╨ær eine SOM-Klasse namens 'Dog'.
  4940. *************************************************************************)
  4941.  
  4942. IMPORT SOM;  (* n╨ñtig f╨ær generelle SOM-Merkmale *)
  4943.  
  4944.  
  4945. (************************************************************************
  4946.   Zus╨ötzliche IMPORT-, TYPE-, und CONST-Deklarationen zur Unterst╨ætzung
  4947.   von 'Dog'
  4948. *************************************************************************)
  4949.  
  4950. IMPORT ANIMAL;   (* Dieses Modul enth╨ölt die Schnittstelle der Elternklasse *)
  4951. IMPORT OS2DEF;
  4952. TYPE PSZ         = OS2DEF.PSZ;
  4953.  
  4954.  
  4955. (*************************************************************************
  4956.   SOM-Klasse API f╨ær 'Dog', einschl. Typ-gebundener Prozeduren
  4957. **************************************************************************)
  4958.  
  4959. (* Diese Typen werden fast immer f╨ær eine SOM-Klasse gebraucht *)
  4960.  
  4961. TYPE PSOMClass              = SOM.PSOMClass;
  4962. TYPE INTEGER4               = SOM.INTEGER4;
  4963. TYPE somMToken              = SOM.somMToken;
  4964. TYPE somDToken              = SOM.somDToken;
  4965. TYPE somMethodProc          = SOM.somMethodProc;
  4966. TYPE PDog                   = POINTER TO Dog;
  4967. TYPE PM_Dog                 = POINTER TO M_Dog;
  4968.  
  4969. (* Haupt- und Unter-Version f╨ær die neue SOM-Klasse 'Dog' *)
  4970.  
  4971. CONST
  4972.   Dog_MajorVersion     = 0;
  4973.   Dog_MinorVersion     = 0;
  4974.  
  4975. (* Jede SOM-Klasse hat eine ╨ñffentliche Struktur namens <class>ClassData,
  4976.    dessen Felder aus Kennungen zur Methodenaufl╨ñsung bestehen.
  4977.    Dieses Beispiel besteht aus 4 Kennungen f╨ær die 4 Methoden
  4978.    der SOM-Klasse 'Dog'.
  4979. *)
  4980. TYPE
  4981.   DogClassDataStructure     = RECORD
  4982.     classObject               : PSOMClass;
  4983.     setBreed                  : somMToken;
  4984.     setColor                  : somMToken;
  4985.     getBreed                  : somMToken;
  4986.     getColor                  : somMToken;
  4987.                               END;
  4988.  
  4989. VAR
  4990.   DogClassData : DogClassDataStructure;
  4991.  
  4992.  
  4993. (* Klasse 'Dog' wird als eine Erweiterung vom Verbundtyp 'Animal'
  4994.    ausgedr╨æckt. Letztere vererbt alle Verbundfelder und Typ-gebundene
  4995.    Prozeduren. Die Direktive '$SOM+' teilt dem ╨¬bersetzer mit,
  4996.    dass der neue Verbundtyp 'Dog' als eine erweiterte SOM-Klasse
  4997.    und nicht als ein erweiterter Modula-2-Verbund zu behandeln ist.
  4998. *)
  4999. TYPE
  5000.   (*$SOM+ *)
  5001.   Dog = RECORD( ANIMAL.Animal ) END;
  5002.   (*$SOM- *)
  5003.  
  5004.  
  5005. (* Jede SOM-Klasse muss eine Prozedur namens <class>NewClass enthalten *)
  5006.  
  5007. PROCEDURE DogNewClass
  5008. (
  5009.   majorVersion  : INTEGER4;
  5010.   minorVersion  : INTEGER4
  5011. )               : PSOMClass;
  5012.  
  5013.  
  5014. (* Eine SOM-Klasse mag Typ-gebundene Prozeduren (auch als Methoden bekannt)
  5015.    enthalten. F╨ær jede der folgenden Typ-gebundenen Prozeduren
  5016.    muss in der vorherigen Verbund-Variable namens <class>ClassData
  5017.    ein entsprechendes Kennungsfeld angegeben worden sein.
  5018. *)
  5019. PROCEDURE( Self : PDog ) setBreed
  5020. (
  5021.   myBreed       : OS2DEF.PSZ
  5022. );
  5023.  
  5024. PROCEDURE( Self : PDog ) setColor
  5025. (
  5026.   myColor       : OS2DEF.PSZ
  5027. );
  5028.  
  5029. PROCEDURE( Self : PDog ) getBreed() : OS2DEF.PSZ;
  5030.  
  5031. PROCEDURE( Self : PDog ) getColor() : OS2DEF.PSZ;
  5032.  
  5033.  
  5034. (*************************************************************************
  5035.   SOM-Klassen-API f╨ær M_Dog, einschliesslich Typ-gebundene Prozeduren.
  5036.   Dies ist die Metaklasse.
  5037.  
  5038.   Die Metaklasse ist optional, und sollte, sofern vorhanden, nur f╨ær
  5039.   Fabrizierungs-Methoden wie z.B. Konstruktoren oder Destruktoren
  5040.   benutzt werden. Die Syntax der Metaklasse ist ansonsten ╨öhnlich
  5041.   der einer regul╨ören Klasse aufgebaut.
  5042. **************************************************************************)
  5043.  
  5044. CONST
  5045.   M_Dog_MajorVersion   = 0;
  5046.   M_Dog_MinorVersion   = 0;
  5047.  
  5048. TYPE
  5049.   M_DogClassDataStructure   = RECORD
  5050.     classObject               : PSOMClass;
  5051.     newDog                    : somMToken;
  5052.                               END;
  5053.  
  5054. VAR
  5055.   M_DogClassData : M_DogClassDataStructure;
  5056.  
  5057. TYPE
  5058.   (*$SOM+ *)
  5059.   M_Dog = RECORD( ANIMAL.M_Animal ) END;
  5060.   (*$SOM- *)
  5061.  
  5062.  
  5063. PROCEDURE M_DogNewClass
  5064. (
  5065.   majorVersion : INTEGER4;
  5066.   minorVersion : INTEGER4
  5067. )              : PSOMClass;
  5068.  
  5069.  
  5070. PROCEDURE( Self : PM_Dog ) newDog
  5071. (
  5072.   sound         : OS2DEF.PSZ;
  5073.   breed         : OS2DEF.PSZ;
  5074.   color         : OS2DEF.PSZ
  5075. )               : PDog;
  5076.  
  5077.  
  5078. END Dog.
  5079.  
  5080.  
  5081. ΓòÉΓòÉΓòÉ 14.4.2. SOM-Klassen-Verwendung ΓòÉΓòÉΓòÉ
  5082.  
  5083. Ein Anwendungsprogrammierer kann von einer vordefinierten SOM-Klasse vollen 
  5084. Gebrauch machen. Die Definition einer SOM-Klasse wird f╨ær ein Programm in 
  5085. Modula-2 durch eine IMPORT-Anweisung verf╨ægbar gemacht. Meistens wird das 
  5086. Programm eine oder mehrere Instanzen von der SOM-Klasse erzeugen. In diesem 
  5087. ╨¬bersetzer kann dies einfach durch den Gebrauch der Standard-Prozedur NEW 
  5088. erreicht werden. Letztere m╨ændet in einen internen Aufruf der SOM-Prozedur 
  5089. 'somNew'. Nahezu alle Objekt-orientierte Konstrukte dieses ╨¬bersetzers k╨ñnnen 
  5090. auch auf Instanzen von SOM-Klassen angewandt werden. Dies schliesst dynamische 
  5091. Typen-Tests, designierte Typenschutz-Selektoren, regionale Typenschutze, und 
  5092. Aufrufe Typ-gebundener Prozeduren ein. Das Arbeiten mit Instanzen von 
  5093. SOM-Klassen ist somit genauso einfach wie mit regul╨ören erweiterten Verbunden. 
  5094. Lediglich die Datenfelder einer SOM-Klasse k╨ñnnen nicht direkt angesprochen 
  5095. werden. Auf sie kann man nur indirekt zugreifen. Dies geschieht in der Regel 
  5096. nur innerhalb der Typ-gebundenen Prozeduren, d.h. den ╨ñffentlichen Methoden, 
  5097. einer Implementation. Aus diesem Grund werden in der Definition eines Verbundes 
  5098. die Feld-Komponenten nie als Verbundfelder angegeben. 
  5099.  
  5100. Dieser ╨¬bersetzer wandelt folgende Sprachkonstrukte in entsprechende interne 
  5101. Aufrufe von SOM-Prozeduren um, sofern sie auf SOM-Klassen angewandt werden: 
  5102.  
  5103.  Dynamische Typen-Tests Der dynamische Typ eines SOM-Objektes kann durch die 
  5104.       IS-Relation getestet werden. Der ╨¬bersetzer produziert Code zum Aufruf 
  5105.       der SOM-internen Funktions-Prozedur 'somIsA'. Die Methode 'somIsA' wird 
  5106.       von der Grundklasse 'SOMObject' geerbt. 
  5107.  
  5108.  Typenschutz Jeder designierte Typenschutz-Selektor und jeder regionale 
  5109.       Typenschutz wird f╨ær SOM-Objekte durch diesen ╨¬bersetzer in einen Aufruf 
  5110.       der SOM-Prozedur 'somIsA' umgewandelt. Sein R╨æckgabe-Wert vom Typ BOOLEAN 
  5111.       wird zur Laufzeit getestet. Und 'SYSTEM.ExitProgram' wird im Falle einer 
  5112.       Typenschutz-Verletzung zwecks vorzeitiger Programm-Terminierung 
  5113.       aufgerufen. 
  5114.  
  5115.  Aufruf von Typ-gebundenen Prozeduren Der Aufruf einer Prozedur, welche an eine 
  5116.       SOM-Klasse gebunden ist, beinhaltet den internen Aufruf der 
  5117.       Laufzeit-Prozedur 'SYSTEM.somResolve'. Letztere ruft wiederum die 
  5118.       SOM-Prozedur 'somResolve' auf. 
  5119.  
  5120.  Aufruf einer Eltern-Methode Der Aufruf einer Eltern-Methode bewirkt den 
  5121.       direkten Sprung zu einer Prozedur, welche an den Basistyp des 
  5122.       augenblicklichen erweiterten Verbundes gebunden ist. Die Prozedur von 
  5123.       diesem Basis-Verbundtyp tr╨ögt den selben Namen. Dieser ╨¬bersetzer 
  5124.       ╨æbersetzt solch einen Aufruf in eine statische Methoden-Aufl╨ñsung. Dazu 
  5125.       wird 'SYSTEM.somFindSMethodOk' benutzt. Letztere ruft wiederum die 
  5126.       SOM-Prozedur 'somFindSMethodOk' auf. 
  5127.  
  5128.  Erzeugung eines SOM-Objektes mit NEW Ein Prozedur-Aufruf NEW( p ) wird durch 
  5129.       diesen ╨¬bersetzer in eine Code-Sequenz, welche u.a. die SOM-Prozedur 
  5130.       'somNew' aufruft, umgewandelt. 
  5131.  
  5132.  L╨ñschen eines SOM-Objektes mit DISPOSE Ein Prozedur-Aufruf DISPOSE( p ) wird 
  5133.       durch diesen ╨¬bersetzer in eine Code-Sequenz, welche u.a. die 
  5134.       SOM-Prozedur 'somFree' aufruft, umgewandelt. 
  5135.  
  5136.  
  5137. ΓòÉΓòÉΓòÉ 14.4.3. SOM-Klassen-Implementierung ΓòÉΓòÉΓòÉ
  5138.  
  5139. Dieser ╨¬bersetzer f╨ær Modula-2 unterst╨ætzt die Erstellung neuer SOM-Klassen, 
  5140. welche von bereits existierenden Klassen abzuleiten sind. Die ╨ñffentliche 
  5141. Schnittstelle der neuen SOM-Klasse muss in einem Definitions-Modul angegeben 
  5142. werden, w╨öhrend die Klasse selbst mit all den neuen oder ╨æberschriebenen 
  5143. Methoden in einem Implementations-Modul geschrieben werden muss. Die Details 
  5144. der Implementierung sind f╨ær andere Klienten-Programme nicht sichtbar. Der 
  5145. durch ╨¬bersetzung erzeugte Maschinen-Code von den Methoden der Klasse wird 
  5146. gew╨ñhnlich in einer dynamischen Binder-Bibliothek gespeichert. Deshalb muss, 
  5147. falls eine neue SOM-Klasse in Modula-2 implementiert werden soll, das 
  5148. Definitions-Modul zu Beginn eine in einem Kommentar einzubettende $DLL+ - 
  5149. Direktive f╨ær den Sprach╨æbersetzer enthalten. 
  5150.  
  5151. Die folgenden Sektionen sollen die Implementierung einer SOM-Klasse 
  5152. illustrieren. Die Implementierung einer neuen SOM-Klasse ist etwas 
  5153. komplizierter als die Implementierung einer neuen und lediglich erweiterteten 
  5154. Klasse nur f╨ær Modula-2 (d.h. nach der Art von OBERON-2). Letztere erfordert 
  5155. nur die Deklaration von all den Typ-gebundenen Prozeduren, welche als 
  5156. entsprechende Prozedurk╨ñpfe im Definitions-Modul angegeben wurden. SOM unter 
  5157. OS/2 benutzt ein komplizierteres Verfahren zur Methoden-Aufl╨ñsung, bevor der 
  5158. Zugriff auf eine ╨ñffentliche Typ-gebundene Prozedur einer SOM-Klasse m╨ñglich 
  5159. wird. Die letztlich erzeugte dynamische Binder-Bibliothek offeriert eine 
  5160. ╨ñffentliche Verbund-Variable, die die Felder mit den Kennungen f╨ær alle 
  5161. Methoden der SOM-Klasse enth╨ölt. W╨öhrend der Laufzeit kann eine solche Kennung 
  5162. zu dem gew╨ænschten Zeiger auf die Prozedur umgewandelt werden. Letztere kann 
  5163. dann als Typ-gebundene Prozedur aufgerufen werden. Das Auffinden einer Methode 
  5164. auf dieser Art ist auch als Offset-Aufl╨ñsung bekannt, weil SOM die ╨ñffentlichen 
  5165. Kennungen der Methoden aus der dynamischen Binder-Bibliothek als eine Art von 
  5166. Index auf eine SOM-interne virtuelle Methoden-Tabelle behandelt. Letztere wird 
  5167. ausserhalb der zu Modula-2 geh╨ñrenden Laufzeitbibliotheken unterhalten. Ausser 
  5168. der eben genannten Offset-Aufl╨ñsung bietet SOM auch die sogenannte 
  5169. Namens-Aufl╨ñsung sowie die Aufl╨ñsung durch Abfertigungs-Funktionen an, um den 
  5170. Zugriff auf eine Methode zu bekommen. Dies ist deshalb notwendig, weil einige 
  5171. Programmiersprachen nicht f╨öhig sind, die grundlegende Offset-Aufl╨ñsung zu 
  5172. verwenden. Schliesslich soll SOM ja Sprachen-neutral sein. Aus o.g. Gr╨ænden ist 
  5173. also die Implementierung einer SOM-Klasse in Modula-2 (und f╨ær jede andere 
  5174. Objekt-orientierte Sprache) im Gegensatz zur Implementierung einer Klasse aus 
  5175. der jeweiligen Sprache etwas komplizierter durchzuf╨æhren, aber nicht unm╨ñglich. 
  5176.  
  5177. Das Implementations-Modul sollte folgende Komponenten enthalten: 
  5178.  
  5179.      (1)    SOM-spezifische, in Kommentare einzubettende, 
  5180.             ╨¬bersetzer-Direktiven. 
  5181.      (2)    G╨öngige IMPORT-Anweisungen, und individuelle Deklarationen f╨ær 
  5182.             Konstanten, Typen, und Variablen. 
  5183.      (3)    Implementierungs-Kopf mit g╨öngigen Deklarationen f╨ær Konstanten, 
  5184.             Typen, und Variablen. 
  5185.      (4)    Prozedur-R╨æmpfe zur Anwendung und Abfertigung (engl. apply and 
  5186.             redispatch stubs) f╨ær all die neuen Methoden. 
  5187.      (5)    FORWARD-Deklarationen von allen privaten (oder privat 
  5188.             ╨æberschriebenen) Methoden. 
  5189.      (6)    Prozeduren f╨ær die Erzeugung der neuen SOM-Klasse. 
  5190.      (7)    Methoden-Prozeduren f╨ær die neue SOM-Klasse. 
  5191.      (8)    Modul-Initialisierung. 
  5192.  
  5193.  Wenn eine explizite Metaklasse existiert, sollte sie im gleichen Modul 
  5194.  implementiert werden, indem man auch f╨ær sie die in (3) bis (7) genannten 
  5195.  Komponenten angibt. Eine Metaklasse stellt Klassen-Methoden wie zum Beispiel 
  5196.  Instanz-erzeugende Prozeduren oder Konstruktor-Methoden zur Verf╨ægung. Falls 
  5197.  keine explizite Metaklasse existiert, dann wird diejenige aus der 
  5198.  Eltern-Klasse benutzt. 
  5199.  
  5200.  Die folgenden Sektionen aus dieser Dokumentation beinhalten eine genauere 
  5201.  Beschreibung aller Komponenten f╨ær die Implementierung. Die Programm-Beispiele 
  5202.  enthalten Platzhalter, welche durch '<' und '>' begrenzt sind, wie etwa 
  5203.  <class> oder <identifier>. Sie m╨æssen beim Schreiben eines 
  5204.  Implementations-Moduls durch die tats╨öchlichen Namens-Symbole ersetzt werden. 
  5205.  Der Platzhalter <class> ist immer durch den aktuellen Namen der neuen 
  5206.  SOM-Klasse zu ersetzen. 
  5207.  
  5208.  
  5209. ΓòÉΓòÉΓòÉ 14.4.3.1. SOM-Klassen-Implementierung (╨¬bersetzer-Direktiven) ΓòÉΓòÉΓòÉ
  5210.  
  5211. Ein Implementations-Modul f╨ær eine neue SOM-Klasse sollte immer mit einigen in 
  5212. Kommentaren eingebetteten Direktiven f╨ær den ╨¬bersetzer beginnen, und zwar wie 
  5213. folgt: 
  5214.  
  5215. IMPLEMENTATION MODULE <module-identifier>;
  5216.  
  5217. (*$XL+       Modula-2 Spracherweiterung: '_' im Symbol, OOP-F╨öhigkeit   *)
  5218. (*$CDECL+    C-artige Prozeduren                                        *)
  5219. (*$A         Standard-Ausrichtung f╨ær Verbundfelder                     *)
  5220.  
  5221. (*$LINK
  5222.   LIBRARY <module-identifier>
  5223.     INITINSTANCE
  5224.   PROTMODE
  5225.   DATA
  5226.     MULTIPLE NONSHARED LOADONCALL
  5227. *)
  5228.  
  5229. Der $LINK - Schalter teilt dem ╨¬bersetzer f╨ær Modula-2 mit, dass die 
  5230. schliessliche SOM-Klasse eine dynamische Binder-Bibliothek werden soll, die 
  5231. aber im Gegensatz zu Standard-Konventionen w╨öhrend der Laufzeit f╨ær jede 
  5232. Anwendung ein neues Datensegment erzeugen soll. 
  5233.  
  5234.  
  5235. ΓòÉΓòÉΓòÉ 14.4.3.2. SOM-Klassen-Implementierung (IMPORTs und Deklarationen) ΓòÉΓòÉΓòÉ
  5236.  
  5237. Das Implementations-Modul beginnt mit einer Reihe von g╨öngigen 
  5238. IMPORT-Anweisungen, welche immer f╨ær eine neue SOM-Klasse gebraucht werden. Es 
  5239. folgen weitere Programmzeilen f╨ær Modula-2, welche dem f╨ær die Zielsprache 
  5240. weiterzureichenden Block vom SOM-╨¬bersetzer entsprechen. Sie enthalten weitere 
  5241. individuelle IMPORTs und Deklarationen f╨ær Konstanten, Typen, und Variablen. 
  5242.  
  5243. (*************************************************************************
  5244.    G╨öngige IMPORTs f╨ær die Implementierung einer SOM-Klasse.
  5245. **************************************************************************)
  5246.  
  5247. IMPORT SOM;             (* grundlegendes SOM-Modul, wird immer gebraucht *)
  5248. IMPORT <parent-module>; (* Modul mit Eltern-Klasse, wird immer gebraucht *)
  5249. IMPORT Conversions;     (* Datenkonvertierungen *)
  5250. FROM   SOMMISC IMPORT somDebug;        (* Debugger-Unterst╨ætzung *)
  5251. FROM   SOMMISC IMPORT somWriteString;  (* Debugger-Unterst╨ætzung *)
  5252. FROM   SOMMISC IMPORT somWriteLn;      (* Debugger-Unterst╨ætzung *)
  5253. FROM   SYSTEM  IMPORT currentFile;     (* Debugger-Unterst╨ætzung *)
  5254. FROM   SYSTEM  IMPORT currentLine;     (* Debugger-Unterst╨ætzung *)
  5255. FROM   SYSTEM  IMPORT ADR;
  5256.  
  5257. (*************************************************************************
  5258.    Dies ist Modula's Gegenst╨æck zum sprachneutralen SOM-erzeugten
  5259.    Zeilenblock, der sonst f╨ær die Zielsprache vor der SOM-Klasse
  5260.    weiterzureichen w╨öre.
  5261.  
  5262.    Er besteht aus weiteren individuellen IMPORTs f╨ær die Implementation.
  5263. **************************************************************************)
  5264.  
  5265. IMPORT ..... ;
  5266.  
  5267. (*************************************************************************
  5268.    Dies ist Modula's Gegenst╨æck zum sprachneutralen SOM-erzeugten
  5269.    Zeilenblock, der sonst f╨ær die Zielsprache hinter der SOM-Klasse
  5270.    weiterzureichen w╨öre.
  5271.  
  5272.    Er besteht aus privaten Typen, Konstanten, Variablen,
  5273.    und/oder Prozeduren f╨ær die Implementierung der Klasse.
  5274. **************************************************************************)
  5275.  
  5276. CONST
  5277.   .....
  5278. TYPE
  5279.   .....
  5280. VAR
  5281.   .....
  5282.  
  5283.  
  5284. ΓòÉΓòÉΓòÉ 14.4.3.3. SOM-Klassen-Implementierung (Implementatierungs-Kopf) ΓòÉΓòÉΓòÉ
  5285.  
  5286. Der Implementatierungs-Kopf f╨ær eine neue SOM-Klasse wird gew╨ñhnlich durch den 
  5287. SOM-╨¬bersetzer aus einer Sprachen-neutralen Form der Definition der Klasse 
  5288. erzeugt. F╨ær diesen ╨¬bersetzer f╨ær Modula-2 muss er jedoch manuell angegeben 
  5289. werden, weil die augenblicklichen SOM-Versionen noch keine Sprachen-Bindungen 
  5290. f╨ær Modula-2 generieren k╨ñnnen. Der grundlegende Aufbau vom 
  5291. Implementatierungs-Kopf ist immer der gleiche, unabh╨öngig von der neuen Klasse. 
  5292. Er kann nur hinsichtlich der Anzahl der Instanz-Felder oder der Anzahl der 
  5293. Methoden variieren. 
  5294.  
  5295. (*************************************************************************
  5296.    Implementatierungs-Kopf f╨ær die neue SOM-Klasse.
  5297.    (Konstanten, Typen, und Variablen)
  5298. **************************************************************************)
  5299.  
  5300. CONST
  5301.   <class>_MaxNoMethods = <number>;  (* Anzahl der neuen Methoden *)
  5302.   <class>Debug         = FALSE;     (* an/aus Testanweisungen in Methoden *)
  5303.  
  5304. (*
  5305.  * Deklaration der C-spezifischen Datenstruktur f╨ær die Klasse;
  5306.  * Plaziere sie hier oder in das Definitionsmodul.
  5307.  *)
  5308. TYPE
  5309.   <class>CClassDataStructure  = RECORD
  5310.     parentMtab                  : SOM.somMethodTabs;
  5311.     instanceDataToken           : SOM.somDToken;
  5312.                                 END;
  5313. VAR
  5314.   <class>CClassData           : <class>CClassDataStructure;
  5315.  
  5316. (*
  5317.  * Tempor╨öre Datenstruktur f╨ær die Klasse, wird nur zur
  5318.  * Erzeugung der Klasse gebraucht
  5319.  *)
  5320. VAR
  5321.   <class>tempClassData        : SOM.somClassDataStructure;
  5322.  
  5323. (*
  5324.  * Interne Datenfelder f╨ær die Instanz
  5325.  *)
  5326. TYPE
  5327.   <class>Data          = RECORD
  5328.     <1st field>          : <1st type>;
  5329.        ..........................
  5330.     <nth field>          : <nth type>;
  5331.                          END;
  5332.   P<class>Data         = POINTER TO <class>Data;
  5333.  
  5334. (*
  5335.  *   Funktion <class>GetData, gibt Zugriff zu den Instanz-Daten, falls da
  5336.  *)
  5337. PROCEDURE <class>GetData( Self : P<class> ) : P<class>Data;
  5338. BEGIN
  5339.   RETURN SOM.somDataResolve( Self, <class>CClassData.instanceDataToken );
  5340. END <class>GetData;
  5341.  
  5342. (*
  5343.  *  SOM-spezifische Kennungen f╨ær all
  5344.  *  die neuen und auch den ╨æberschriebenen Methoden
  5345.  *)
  5346. VAR
  5347.   somId_<method-1>         : SOM.somId;
  5348.     ................................
  5349.   somId_<method-n>         : SOM.somId;
  5350.  
  5351.  
  5352. ΓòÉΓòÉΓòÉ 14.4.3.4. SOM-Klassen-Implementierung (Anwendung/Abfertigung) ΓòÉΓòÉΓòÉ
  5353.  
  5354. Der Implementierungs-Kopf muss auch f╨ær jede neue Methode Prozedur-St╨æmpfe zur 
  5355. Anwendung und Abfertigung (engl. apply stub and redispatch stub) angeben. Diese 
  5356. sind zus╨ötzlich zu den jeweiligen Methoden-Prozeduren erforderlich, weil SOM 
  5357. mehrere Techniken zur Methodenaufl╨ñsung w╨öhrend der Laufzeit unterst╨ætzen muss. 
  5358. Denn ein Anwendungsprogramm mag nicht immer die normale Offset-Aufl╨ñsung 
  5359. beherrschen. 
  5360.  
  5361. Jede Methode kann eine unbestimmte Anzahl formaler Parameter, welche gew╨ñhnlich 
  5362. als Doppelworte (DWORD) auf dem Stapelspeicher geschrieben werden, enthalten. 
  5363. Der Anwendungsstumpf hat zu diesem Zweck einen formalen Parameter, welcher auf 
  5364. die offene Parameterliste f╨ær die Methode zeigt. Er wird gew╨ñhnlich als eine 
  5365. offene Reihung von Doppelworten ausgedr╨æckt, also ARRAY OF DWORD. Jedes 
  5366. Doppelwort entspricht einem aktuellen numerischen Wertparameter. F╨ær Strukturen 
  5367. und Reihungen werden gew╨ñhnlich nur Referenzen, d.h. deren Adressen, 
  5368. weitergereicht. Jede Adresse entspricht dann einem DWORD. Ein LONGREAL besteht 
  5369. aus 2 Doppelworten. Man kann als Wertparameter auch lange Strukturen und 
  5370. nicht-offene Reihungen f╨ær die Zielmethode vorsehen. Sie sind jedoch dann nicht 
  5371. immer ein genaues Vielfaches von Doppelworten. Daher sollten sie die Ausnahme 
  5372. bilden. Wenn n╨ñtig, kann man f╨ær den Anwendungsstumpf die Parameter-Liste der 
  5373. Zielmethode auch als ARRAY OF BYTE ausdr╨æcken, der zu allen erdenklichen 
  5374. Parametern beliebiger Gr╨ñsse kompatibel ist. 
  5375.  
  5376. Der Anwendungsstumpf muss aus der offenen Parameterliste die einzelnen 
  5377. Parameter f╨ær die aufzurufende Zielmethode extrahieren und weiterreichen. 
  5378. Danach wird die Zielmethode, welche zum 'Self'-Objekt geh╨ñrt, aufgerufen. 
  5379.  
  5380. Die Prozedur-St╨æmpfe zur Anwendung und Abfertigung sind f╨ær eine Prozedur ohne 
  5381. R╨æckgabewert wie folgt zu implementieren: 
  5382.  
  5383. (*
  5384.  *  Anwendungs-Stunpf f╨ær eine neue Methoden-Prozedur ohne R╨æckgabe
  5385.  *)
  5386. PROCEDURE somAP_<method>
  5387. (
  5388.   somSelf   : P<class>;
  5389.   id        : SOM.somId;
  5390.   desc      : SOM.somId;
  5391.   VAR args  : ARRAY OF SOM.DWORD
  5392. );
  5393. VAR
  5394.   <param-0> : <basic-type>;
  5395.     ....................
  5396.   <param-n> : <basic-type>;
  5397. BEGIN
  5398.   <param-0> := args[0];
  5399.     .................
  5400.   <param-n> := args[n];
  5401.   somSelf^.<method>( <param-0>, ... <param-n> );
  5402. END somAP_<method>;
  5403.  
  5404. (*
  5405.  * Abfertigungs-Stumpf f╨ær eine neue Methoden-Prozedur ohne R╨æckgabe
  5406.  *)
  5407. PROCEDURE somRD_<method>
  5408. (
  5409.   somSelf      : P<class>;
  5410.   <param-0>    : <basic-type>;
  5411.     .......................
  5412.   <param-n>    : <basic-type>
  5413. );
  5414. VAR
  5415.   retBuffer    : SOM.somToken;
  5416.   retValue     : SOM.somToken;
  5417.   args         : SOM.ADDRESS;
  5418.   dispatched   : BOOLEAN;
  5419. BEGIN
  5420.   retValue := ADR( retBuffer );
  5421.   args := ADR( somSelf ) + SIZE( somSelf );
  5422.   dispatched := somSelf^.somDispatch( retValue, somId_<method>, args^ );
  5423. END somRD_<method>;
  5424.  
  5425. Wenn die Methode eine Funktions-Prozedur mit R╨æckgabewert ist, dann sehen die 
  5426. Anwendungs- und Abfertigungs-St╨æmpfe etwas anders aus: 
  5427.  
  5428. (*
  5429.  *  Anwendungs-Stumpf f╨ær eine neue Funktions-Methode
  5430.  *)
  5431. PROCEDURE somAP_<method>
  5432. (
  5433.   somSelf   : P<class>;
  5434.   id        : SOM.somId;
  5435.   desc      : SOM.somId;
  5436.   VAR args  : ARRAY OF SOM.DWORD
  5437. )           : <returning-type>;
  5438. VAR
  5439.   <param-0> : <basic-type>;
  5440.     ....................
  5441.   <param-n> : <basic-type>;
  5442. BEGIN
  5443.   <param-0> := args[0];
  5444.     .................
  5445.   <param-n> := args[n];
  5446.   RETURN somSelf^.<method>( <param-0>, ... <param-n> );
  5447. END somAP_<method>;
  5448.  
  5449. (*
  5450.  *  Abfertigungs-Stumpf f╨ær eine neue Funktions-Methode
  5451.  *)
  5452. PROCEDURE somRD_<method>
  5453. (
  5454.   somSelf      : P<class>;
  5455.   <param-0>    : <basic-type>;
  5456.     .......................
  5457.   <param-n>    : <basic-type>
  5458. )              : <returning-type>;
  5459. VAR
  5460.   retBuffer    : <returning-type>;
  5461.   retValue     : SOM.somToken;
  5462.   args         : SOM.ADDRESS;
  5463.   dispatched   : BOOLEAN;
  5464. BEGIN
  5465.   retValue := ADR( retBuffer );
  5466.   args := ADR( somSelf ) + SIZE( somSelf );
  5467.   dispatched := somSelf^.somDispatch( retValue, somId_<method>, args^ );
  5468.   RETURN retBuffer;
  5469. END somRD_<method>;
  5470.  
  5471.  
  5472. ΓòÉΓòÉΓòÉ 14.4.3.5. SOM-Klassen-Implementierung (FORWARD-Deklarationen) ΓòÉΓòÉΓòÉ
  5473.  
  5474. W╨öhrend der Erzeugung einer Klasse werden einige vorweggenommene statische 
  5475. Bezugnahmen auf private (oder privat ╨æberschriebene) Methoden gemacht. F╨ær 
  5476. letztere existieren keine K╨ñpfe im Definitions-Modul der neuen SOM-Klasse. F╨ær 
  5477. jede dieser Methoden muss deshalb eine vorweggenommene Deklaration geschrieben 
  5478. werden. Solch eine Deklaration enth╨ölt nur den Prozedurkopf, gefolgt vom 
  5479. Schl╨æsselwort FORWARD. 
  5480.  
  5481. (*
  5482.  *  Beispiel einer vorweggenommenen Deklaration
  5483.  *  einer echten privaten Methoden-Prozedur
  5484.  *)
  5485. PROCEDURE( Self : P<class> ) <private-method-id>
  5486. ( <parameters> );
  5487. FORWARD;
  5488.  
  5489. (*
  5490.  *  Beispiel einer vorweggenommenen Deklaration
  5491.  *  einer privaten Funktions-Methode
  5492.  *)
  5493. PROCEDURE( Self : P<class> ) <private-method-id>
  5494. ( <parameters> ) : <returning-type>;
  5495. FORWARD;
  5496.  
  5497.  
  5498. ΓòÉΓòÉΓòÉ 14.4.3.6. SOM-Klassen-Implementierung (Klassen-Erzeugung) ΓòÉΓòÉΓòÉ
  5499.  
  5500. Das OS/2-System f╨ær SOM muss f╨ær jede Klasse, welche w╨öhrend der 
  5501. Informations-Verarbeitung irgendwann ins Dasein kommen mag, 
  5502. Laufzeitinformationen bereit halten. Eine SOM-Klasse kann sogar ╨æber Prozesse 
  5503. hinaus erhalten bleiben. Aber jede SOM-Klasse muss vor ihrem ersten Gebrauch 
  5504. erst einmal erzeugt werden. Die Instanzen einer SOM-Klasse k╨ñnnen erst nach der 
  5505. Erzeugung der Klasse selbst erzeugt werden. Die Erzeugung einer Klasse 
  5506. geschieht durch den Aufruf spezieller SOM-Prozeduren aus den dynamischen 
  5507. Binder-Bibliotheken. Das grundlegende Aussehen der Prozeduren zur Erzeugung von 
  5508. Klassen gleicht sich immer. SOM unterh╨ölt erzeugte Klassen mittels interner 
  5509. Klassen-Deskriptoren. Solch ein interner Klassen-Deskriptor wird von SOM als 
  5510. eine Instanz der Metaklasse betrachtet und wird daher Klassen-Objekt genannt. 
  5511. Ein Zeiger auf letzteren wird nach Beendigung der Klassen-Erzeugung verf╨ægbar 
  5512. gemacht. 
  5513.  
  5514. (*************************************************************************
  5515.     Erzeugungs-Prozeduren f╨ær eine SOM-Klasse.
  5516.     Nur die Prozedur <class>NewClass() ist ╨ñffentlich
  5517.     verf╨ægbar f╨ær Klienten-Programme.
  5518. **************************************************************************)
  5519.  
  5520. (*
  5521.  *  Klassen-Initialisierung
  5522.  *)
  5523. PROCEDURE <class>somInitializeClass;
  5524. VAR
  5525.   m  : <class>;     (* n╨ñtig f╨ær statisch angesprochene Methoden *)
  5526.   c  : SOM.PSOMClass;
  5527.   md : SOM.somId;
  5528. BEGIN
  5529.  
  5530.   c := <class>tempClassData.classObject;
  5531.   md := SOM.somIdFromString( "----" );
  5532.  
  5533.   (* F╨æge zur neuen SOM-Klasse die neuen Methoden einschliesslich
  5534.      den Anwendungs- und Abfertigungs- St╨æmpfen hinzu.
  5535.   *)
  5536.   <class>ClassData.<method-1> := c^.somAddStaticMethod
  5537.   ( somId_<method-1>, md, m.<method-1>, somRD_<method-1>, somAP_<method-1> );
  5538.     ......................................................................
  5539.   <class>ClassData.<method-n> := c^.somAddStaticMethod
  5540.   ( somId_<method-n>, md, m.<method-n>, somRD_<method-n>, somAP_<method-n> );
  5541.  
  5542.   (* ╨¬berschreibe eventuell geerbte Methoden *)
  5543.   c^.somOverrideSMethod( somId_<override-method-1>, m.<override-method-1> );
  5544.     .....................................................................
  5545.   c^.somOverrideSMethod( somId_<override-method-n>, m.<override-method-n> );
  5546.  
  5547. END <class>somInitializeClass;
  5548.  
  5549. (*
  5550.  *  Prozedur zur Erzeugung der Klasse
  5551.  *)
  5552. PROCEDURE <class>somCreateClass
  5553. (
  5554.   pClsObj    : SOM.PSOMClass;
  5555.   mClsObj    : SOM.PSOMClass
  5556. );
  5557. VAR
  5558.   classObject : SOM.PSOMClass;
  5559. BEGIN
  5560.   classObject := mClsObj^.somNew();
  5561.   <class>tempClassData.classObject := classObject;
  5562.   classObject^.somInitClass
  5563.   (
  5564.     "<class>",
  5565.     pClsObj,
  5566.     SIZE( <class>Data ),
  5567.     <class>_MaxNoMethods,
  5568.     <class>_MajorVersion,
  5569.     <class>_MinorVersion
  5570.   );
  5571.   <class>CClassData.instanceDataToken := classObject^.somGetInstanceToken();
  5572.   <class>somInitializeClass();
  5573.   <class>CClassData.parentMtab := classObject^.somGetPClsMtab();
  5574.   classObject^.somSetClassData( SYSTEM.ADR( <class>ClassData ) );
  5575.   classObject^.somClassReady();
  5576.  
  5577.   (* mache nun das neu erzeugte Klassen-Objekt sichtbar *)
  5578.   <class>ClassData.classObject := classObject;
  5579. END <class>somCreateClass;
  5580.  
  5581. (*
  5582.  *   ╨ñffentliche NewClass-Prozedur
  5583.  *)
  5584. PROCEDURE <class>NewClass
  5585. (
  5586.   majorVersion  : SOM.INTEGER4;
  5587.   minorVersion  : SOM.INTEGER4
  5588. )               : SOM.PSOMClass;
  5589. VAR
  5590.   pClsObj       : SOM.PSOMClass;
  5591.   mClsObj       : SOM.PSOMClass;
  5592.   line          : LONGCARD;
  5593.   b             : BOOLEAN;
  5594. BEGIN
  5595.   (* ╨¬berpr╨æfe die Versions-Nummern *)
  5596.   IF ((majorVersion <> 0) AND (majorVersion <> <class>_MajorVersion)) OR
  5597.      ((minorVersion <> 0) AND (minorVersion > <class>_MinorVersion)) THEN
  5598.     somWriteString( "<class>NewClass: Error, bad version numbers." );
  5599.     somWriteLn();
  5600.     b := Conversions.StrToLongCard( currentLine(), line );
  5601.     SOM.SOMError( SOM.SOMERROR_BadVersion, currentFile(), line );
  5602.   END;
  5603.  
  5604.   (* Keine weiteren Aktivit╨öten, wenn Klassen-Objekt schon existiert *)
  5605.   IF <class>ClassData.classObject <> NIL THEN
  5606.     RETURN <class>ClassData.classObject;
  5607.   END;
  5608.  
  5609.   (* Stelle sicher, dass die Umgebung initialisiert ist *)
  5610.   IF SOM.SOMClassMgrObject = NIL THEN
  5611.     SOM.SOMClassMgrObject := SOM.somEnvironmentNew();
  5612.     IF SOM.SOMClassMgrObject = NIL THEN
  5613.       b := Conversions.StrToLongCard( currentLine(), line );
  5614.       SOM.SOMError( SOM.SOMERROR_CouldNotStartup, currentFile(), line );
  5615.     END;
  5616.     (* SOMClassMgrObject initialisiert... *)
  5617.   END;
  5618.  
  5619.   (* Erhalte das Eltern-Klassen-Objekt *)
  5620.   pClsObj := <parent-module>.<parent-class>NewClass( 0, 0 ); (* static *)
  5621.   pClsObj := SOM.SOMClassMgrObject^.somFindClass
  5622.   ( SOM.somIdFromString( "<parent-class>" ), 0, 0 );
  5623.   IF pClsObj = NIL THEN
  5624.     b := Conversions.StrToLongCard( currentLine(), line );
  5625.     SOM.SOMError( SOM.SOMERROR_NoParentClass, currentFile(), line );
  5626.   END;
  5627.  
  5628.   (* Erhalte das Metaklassen-Objekt *)
  5629.   (* Falls explizite Metaklasse, erhalte sie von dort ... *)
  5630.     mClsObj := <metaclass>NewClass( 0, 0 );       (* statisch*)
  5631.     mClsObj := SOM.SOMClassMgrObject^.somFindClass
  5632.     ( SOM.somIdFromString( "<metaclass>" ), 0, 0 );
  5633.   (* ... sonst benutze die Metaklasse von der Elternklasse:
  5634.     mClsObj := pClsObj^.mtab^.classObject;
  5635.   *)
  5636.   IF mClsObj = NIL THEN
  5637.     b := Conversions.StrToLongCard( currentLine(), line );
  5638.     SOM.SOMError( SOM.SOMERROR_NoMetaClass, currentFile(), line );
  5639.   END;
  5640.  
  5641.   SOM.somConstructClass
  5642.   ( <class>somCreateClass, pClsObj, mClsObj, SYSTEM.ADR( <class>tempClassData ) );
  5643.  
  5644.   RETURN <class>ClassData.classObject;
  5645. END <class>NewClass;
  5646.  
  5647.  
  5648. ΓòÉΓòÉΓòÉ 14.4.3.7. SOM-Klassen-Implementierung (Methoden-Prozeduren) ΓòÉΓòÉΓòÉ
  5649.  
  5650. Der letzte Bestandteil der Implementierung einer neuen SOM-Klasse besteht aus 
  5651. den Deklarationen f╨ær all die neuen und ╨æberschriebenen Methoden. Jede Methode 
  5652. muss als eine vollst╨öndige Typ-gebundene Prozedur deklariert werden. Die 
  5653. folgenden Beispiele zeigen den grundlegenden Aufbau zur Implementierung von 
  5654. echten Methoden und von Funktions-Methoden: 
  5655.  
  5656. (*
  5657.  *  Beispiel einer echten Methoden-Prozedur, Typ-gebunden an neue SOM-Klasse
  5658.  *)
  5659. PROCEDURE( Self : P<class> ) <method-id> ( <parameters> );
  5660. VAR
  5661.   somThis   : P<class>Data;
  5662. BEGIN
  5663.   somThis := <class>GetData( Self );
  5664.   IF <class>Debug THEN
  5665.     somDebug( "<class>", "<method-id>", currentFile(), currentLine() );
  5666.   END;
  5667.   .........
  5668. END <method-id>;
  5669.  
  5670. (*
  5671.  *  Beispiel einer Funktions-Methode, Typ-gebunden an neue SOM-Klasse
  5672.  *)
  5673. PROCEDURE( Self : P<class> ) <method-id> ( <parameters> ) : <return-type>;
  5674. VAR
  5675.   somThis   : P<class>Data;
  5676. BEGIN
  5677.   somThis := <class>GetData( Self );
  5678.   IF <class>Debug THEN
  5679.     somDebug( "<class>", "<method-id>", currentFile(), currentLine() );
  5680.   END;
  5681.   .........
  5682.   RETURN <expression>;
  5683. END <method-id>;
  5684.  
  5685.  
  5686. ΓòÉΓòÉΓòÉ 14.4.3.8. SOM-Klassen-Implementierung (Modul-Initialisierung) ΓòÉΓòÉΓòÉ
  5687.  
  5688. Eine SOM-Klasse wird gew╨ñhnlich in einem Modul implementiert. Das Modul kann 
  5689. durch Sprach╨æbersetzung und Linkerlauf in eine dynamische Binderbibliohek 
  5690. umgewandelt werden. Solch eine Bibliothek muss eine Initialisierungsroutine 
  5691. enthalten. Sie wird pro Prozess einmal aufgerufen mit je einem 
  5692. Prozess-bezogenen Datensegment. Diese Routine sieht wie folgt aus: 
  5693.  
  5694. (*
  5695.  * Beispiel einer Modul-Initialisierung f╨ær eine neue SOM-Klasse
  5696.  *)
  5697. BEGIN (* Eintrittspunkt vom Klassen-Modul *)
  5698.   (* initialisiere SOM's Umgebung, falls letztere noch nicht aktiviert ist *)
  5699.   IF SOM.SOMClassMgrObject = NIL THEN
  5700.     SOM.SOMClassMgrObject := SOM.somEnvironmentNew();
  5701.   END;
  5702.  
  5703.   (* initialisiere einige Felder aus Klassen-unterst╨ætzenden Verbunden *)
  5704.   <class>CClassData.parentMtab := NIL;
  5705.   <class>ClassData.classObject := NIL;
  5706.  
  5707.   (* Finde die Identifizierungskennungen f╨ær alle neue oder ╨æberschriebene
  5708.    * Methoden
  5709.    *)
  5710.   somId_<method_0>      := SOM.somIdFromString( "<method_0>"     );
  5711.     ............................................................
  5712.   somId_<method_n>      := SOM.somIdFromString( "<method_n>"     );
  5713.  
  5714.   (* falls eine explizite Metaklasse im gleichen Modul deklariert worden ist,
  5715.    * dann initialisiere einige Felder f╨ær Metaklasse-unterst╨ætzende
  5716.    * Verbunde
  5717.    *)
  5718.   M_<class>CClassData.parentMtab := NIL;
  5719.   M_<class>ClassData.classObject := NIL;
  5720.  
  5721.   (* falls eine explizite Metaklasse im gleichen Modul deklariert worden ist,
  5722.    * dann finde die Identifizierungskennungen f╨ær alle neue oder
  5723.    * ╨æberschriebene Methoden, die zur Metaklasse geh╨ñren.
  5724.    *)
  5725.   somId_<method_0>      := SOM.somIdFromString( "<method_0>"     );
  5726.     ............................................................
  5727.   somId_<method_n>      := SOM.somIdFromString( "<method_n>"     );
  5728.  
  5729. END <Modul-Identifizierer>.
  5730.  
  5731.  
  5732. ΓòÉΓòÉΓòÉ 14.5. Bitweise Operatoren ΓòÉΓòÉΓòÉ
  5733.  
  5734. Dieser ╨¬bersetzer f╨ær Modula-2 bietet erweiterte bitweise arithmetische 
  5735. Operatoren an. Sie sind f╨ær Cardinal- oder Integer- Operanden anwendbar und 
  5736. werden Bit f╨ær Bit bearbeitet. Bitweise Operatoren sind nur dann verf╨ægbar, 
  5737. wenn entweder der Schalter auf der Kommandozeile oder die entsprechende 
  5738. ╨¬bersetzer- Direktive f╨ær die Spracherweiterungen aktiviert worden ist. Sie 
  5739. vereinfachen z.B. den Zugriff auf Bitfelder von den Schnittstellen der APIs von 
  5740. Betriebssystemen wie OS/2 2.x/3.0. Und sie vereinfachen auch die Portierung von 
  5741. maschinennahen Code, welcher in anderen Programmiersprachen geschrieben worden 
  5742. ist. Die meisten der bitweisen Operatoren k╨ñnnten auch durch den Gebrauch von 
  5743. Mengen-Operatoren f╨ær Variablen mit Mengentypen implementiert werden. Der 
  5744. Gebrauch von Variablen mit Mengentypen und den dazugeh╨ñrigen Mengen-Operatoren 
  5745. ist immer dann f╨ær die Implementierung von bitweisen Operationen zu empfehlen, 
  5746. wenn die M╨ñglichkeit der Portierung des Quellencodes im Vordergrund steht. Die 
  5747. Benutzung der neuen bitweisen Operatoren sollte auf maschinennahe Module 
  5748. beschr╨önkt bleiben. Die folgende Tabelle gibt eine ╨¬bersicht ╨æber die neuen 
  5749. arithmetischen bitweisen Operatoren: 
  5750.  
  5751.      OR        Bitweises Oder 
  5752.      XOR       Bitweises exklusives Oder 
  5753.      AND       Bitweises Und 
  5754.      &         Bitweises Und, wie AND 
  5755.      SHL       Bitweises Schiften nach links 
  5756.      SHR       Bitweises Schiften nach Rechts 
  5757.      NOT       Un╨öre bitweise Negation 
  5758.      ~         Un╨öre bitweise Negation 
  5759.  
  5760.  
  5761. ΓòÉΓòÉΓòÉ 14.6. Neue logische Operatoren ΓòÉΓòÉΓòÉ
  5762.  
  5763. Modula-2 bietet eine gewisse Menge von logischen Operatoren f╨ær Bool'sche 
  5764. Ausdr╨æcke an. Es gibt jedoch keine direkte Implementation f╨ær das logische 
  5765. exklusive 'OR'. Ein exklusives 'OR' ergibt nur dann TRUE, wenn entweder der 
  5766. erste oder zweite Bool'sche Ausdruck TRUE ergibt, aber nicht beide 
  5767. gleichzeitig. Beispiel: 
  5768.  
  5769.   IF (Contition1 AND NOT Condition2) OR
  5770.      (NOT Condition1 AND Condition2) THEN
  5771.     (* execute if either, but not both conditions are met *)
  5772.   END
  5773.  
  5774. Wenn entweder der Schalter auf der Kommandozeile oder die entsprechende 
  5775. ╨¬bersetzer- Direktive f╨ær die Spracherweiterungen aktiviert ist, dann kann das 
  5776. o.g. Beispiel mit dem neuen Operator 'XOR' wie folgt vereinfacht werden: 
  5777.  
  5778.   IF Condition1 XOR Condition2 THEN
  5779.     (* execute if either, but not both conditions are met *)
  5780.   END
  5781.  
  5782.  
  5783. ΓòÉΓòÉΓòÉ 14.7. Typisierte Konstanten ΓòÉΓòÉΓòÉ
  5784.  
  5785. ΓûÉ ConstDecl      = ConstDef | ConstVarDecl "=" TypedConst
  5786. ΓûÉ ConstVarDecl   = Ident ":" FormalType
  5787. ΓûÉ TypedConst     = ConstExpr | PointerConst | ArrayConst | RecordConst
  5788. ΓûÉ PointerConst   = POINTER TO Qualident |
  5789. ΓûÉ                  PROCEDURE Qualident |
  5790. ΓûÉ                  "^" Qualident
  5791. ΓûÉ RecordConst    = "(" FieldConstList ")"
  5792. ΓûÉ FieldConstList = FieldConst { ";" FieldConst }
  5793. ΓûÉ FieldConst     = [ FieldId ":" TypedConst ]
  5794. ΓûÉ FieldId        = Ident
  5795. ΓûÉ ArrayConst     = "[" TypedConstList "]"
  5796. ΓûÉ TypedConstList = TypedConst { "," TypedConst }
  5797.  
  5798. Die urspr╨ængliche Sprachdefinition von Modula-2 bietet keine M╨ñglichkeit zur 
  5799. Darstellung von initialisierten Variablen an. Deshalb ist man auf Module mit 
  5800. Anweisungsfolgen zur Zuweisung von Startwerten an Variablen angewiesen. Obwohl 
  5801. Module automatisch zu Programmbeginn ausgef╨æhrt werden, sind sie in gewisser 
  5802. Hinsicht wegen der Zuweisungen verschwenderisch. 
  5803.  
  5804. Dieser ╨¬bersetzer bietet daher einen weiteren Weg an, um Variablen 
  5805. initialisieren zu k╨ñnnen. Wenn entweder der Schalter auf der Kommandozeile oder 
  5806. die entsprechende ╨¬bersetzer- Direktive f╨ær die Spracherweiterungen aktiviert 
  5807. worden ist, dann k╨ñnnen Variablen gleich mit Startwerten deklariert werden, 
  5808. ohne explizite Zuweisungen zu benutzen. Derart initialisierte Variablen nennt 
  5809. man typisierte Konstanten. Typisierte Konstanten sind nicht auf elementare 
  5810. Typen beschr╨önkt. Sie k╨ñnnen auch f╨ær strukturierte Typen wie zum Beispiel 
  5811. Reihungen oder Verbunde benutzt werden. Typisierte Konstanten werden wie 
  5812. Deklarationen von normalen Variablen eingef╨æhrt. Sie enthalten jedoch 
  5813. zus╨ötzliche Angaben ╨æber ihre Startwerte. Das Binder-Programm plaziert alle 
  5814. typisierten Konstanten in ein spezielles initialisiertes Segment, welches auch 
  5815. intern erzeugte Zeichenketten und andere Konstanten aufnimmt. Wenn die 
  5816. Datensegmente durch das Betriebssystem zur sp╨öteren Programmausf╨æhrung in den 
  5817. Arbeitsspeicher geladen werden, dann werden auch alle initialen Werte mit ihnen 
  5818. geladen. Typisierte Konstanten sind insbesondere f╨ær lange initialisierte 
  5819. Tabellen von Nutzen. Konstante Variable-Deklarationen mit typisierten 
  5820. Konstanten sind nur innerhalb einer 'CONST' -Sektion zul╨össig. Der konstante 
  5821. Wert muss mit dem Typ der entsprechenden konstanten Variable-Deklaration 
  5822. Zuweisungs- kompatibel sein. 
  5823.  
  5824. Eine typisierte Konstante f╨ær einen Reihungstyp besteht aus einer Liste von 
  5825. typisierten Konstanten f╨ær die Elemente der Reihung. Die Elemente dieser Liste 
  5826. werden durch Kommas voneinander getrennt. Und die Liste selbst muss in eckige 
  5827. Klammern eingeschlossen sein. Falls die Anzahl der typisierten Konstanten aus 
  5828. der Liste kleiner ist als die Anzahl der deklarierten Elemente der Reihung, 
  5829. dann werden die ╨æbrigen Elemente automatisch mit bin╨ören Nullen initialisiert. 
  5830. Wenn die deklarierte Variable eine Zeichenreihung als Typ hat, kann auch eine 
  5831. Zeichenkette als entsprechende typisierte Konstante angegeben werden. 
  5832.  
  5833. Eine typisierte Konstante f╨ær einen Verbundtyp besteht aus einer Liste von 
  5834. Feldkonstanten. Die Feldkonstanten werden durch Semikolons ';' voneinander 
  5835. getrennt. Jede Feldkonstante wird durch den Feldnamen eingef╨æhrt, und muss 
  5836. durch einen Doppelpunkt ':' und der typisierten Konstante gefolgt werden. Die 
  5837. Liste der Feldkonstanten selbst muss durch die runde Klammerung '(' und ')' 
  5838. eingeschlossen sein. Die Reihenfolge der Feldkonstanten muss die gleiche sein 
  5839. wie die in dem entsprechenden Verbundtyp. Jedes Feld ohne entsprechende 
  5840. Feldkonstante wird mit bin╨ören Nullen initialisiert (es sei denn, sie ist durch 
  5841. Case-Varianten mit dort angegebenen Feldkonstanten ╨æberlagert). 
  5842.  
  5843. Eine Zeigerkonstante (pointer constant) kann f╨ær Datenzeiger oder f╨ær Prozedur- 
  5844. Variablen angegeben werden. Sie werden endg╨æltig durch den Binder korrigiert, 
  5845. weil sie die Adressen von Variablen oder Prozeduren repr╨ösentieren sollen. Ein 
  5846. Datenzeiger wird durch die Folge 'POINTER TO' eingef╨æhrt, w╨öhrend vor einer 
  5847. Prozedur-Konstante das Schl╨æsselwort 'PROCEDURE' stehen muss. Es kann auch eine 
  5848. alternative Kurzform zur Darstellung f╨ær Zeigerkonstanten benutzt werden, indem 
  5849. man nur das zeichen '^' voranstellt. In diesem Fall konsultiert der ╨¬bersetzer 
  5850. den Typ der deklarierten Variablen, um die korrekte Wahl zwischen Daten- und 
  5851. Prozedur-Zeiger vornehmen zu k╨ñnnen. Die Zeigerkonstante wird immer durch einen 
  5852. (m╨ñglicherweise qualifizierten) Namen f╨ær die Variable oder Prozedur, deren 
  5853. Adresse als Konstante dienen soll, abgeschlossen. 
  5854.  
  5855. Beispiele: 
  5856.  
  5857.   TYPE
  5858.     ArrayType  = ARRAY [0..10] OF CHAR;
  5859.     RecType    = RECORD
  5860.       Str        : ArrayType;
  5861.       Len        : INTEGER;
  5862.       Handler    : PROC;
  5863.       Next       : POINTER TO RecType;
  5864.                  END;
  5865.     ...
  5866.  
  5867.   PROCEDURE MyProc();
  5868.   BEGIN
  5869.     ...
  5870.   END MyProc;
  5871.   ...
  5872.  
  5873.   VAR
  5874.    YourRecVar  : RecType;
  5875.    ...
  5876.  
  5877.   CONST
  5878.     MyRecVar     : RecType =
  5879.     (
  5880.       Str        : "MyString";
  5881.       Len        : 8;
  5882.       Handler    : ^MyProc;
  5883.       Next       : ^YourRecVar;
  5884.     );
  5885.   ...
  5886.  
  5887. Die konstante Variable-Deklaration darf auch eine eindimensionale offene 
  5888. Reihung als ihren Typ angeben. In diesem Fall wird die Anzahl der Elemente 
  5889. durch die Anzahl der typisierten Konstanten festgelegt. Beispiel: 
  5890.  
  5891.   CONST
  5892.     (* zero terminated initialized text string variables *)
  5893.     Msg1  : ARRAY OF CHAR = "This is message 1";
  5894.     Msg2  : ARRAY OF CHAR = "This is another text string";
  5895.     (* initialized integer array variable with 6 elements *)
  5896.     Token : ARRAY OF INTEGER = [ 1, 2, 3, 4, 5, 6 ];
  5897.  
  5898.  
  5899. ΓòÉΓòÉΓòÉ 14.8. Multidimensionale offene Reihungsparameter ΓòÉΓòÉΓòÉ
  5900.  
  5901. ΓûÉ FormalType       = { ARRAY OF } Qualident
  5902.  
  5903. Der Standardsprachumfang von Modula-2 bietet offene Reihungen f╨ær formale 
  5904. Parameter in Prozedur-Deklarationen oder in Prozedur-Typen an. In diesem 
  5905. ╨¬bersetzer sind auch multidimensionale offene Reihungen erlaubt, wenn entweder 
  5906. der Schalter auf der Kommandozeile oder die entsprechende ╨¬bersetzer- Direktive 
  5907. f╨ær die Spracherweiterungen aktiviert ist. Der entsprechende aktuelle Parameter 
  5908. muss eine Zuweisungs-kompatible Reihung sein mit der gleichen Anzahl von 
  5909. Dimensionen. Die Obergrenzen (HIGHs) aller Dimensionen werden automatisch vor 
  5910. den eigentlichen aktuellen Parametern auf den Stapelspeicher abgelegt. Jede 
  5911. Dimensionsgr╨ñsse kann durch Ausdr╨æcke wie HIGH(x) oder SYSTEM.LEN(x) ermittelt 
  5912. werden. Beispiel: 
  5913.  
  5914.   PROCEDURE MyProc( x : ARRAY OF ARRAY OF ARRAY OF INTEGER );
  5915.   VAR
  5916.     High0 : LONGCARD;
  5917.     High1 : LONGCARD;
  5918.     High2 : LONGCARD;
  5919.     Len0  : LONGCARD;
  5920.     Len1  : LONGCARD;
  5921.     Len2  : LONGCARD;
  5922.   BEGIN
  5923.     High0 := HIGH( x );            (* HIGH outer dimension *)
  5924.     High1 := HIGH( x[0] );         (* HIGH middle dimension *)
  5925.     High2 := HIGH( x[0][0] );      (* HIGH inner dimension *)
  5926.     Len0 := SYSTEM.LEN( x, 0 );    (* outer dimension length *)
  5927.     Len1 := SYSTEM.LEN( x, 1 );    (* middle dimension length *)
  5928.     Len2 := SYSTEM.LEN( x, 2 );    (* inner dimension length *)
  5929.     ...
  5930.   END MyProc;
  5931.   ...
  5932.  
  5933.  
  5934. ΓòÉΓòÉΓòÉ 14.9. Segmentierung ΓòÉΓòÉΓòÉ
  5935.  
  5936. Wie schon vorher in der Dokumentation in der Sektion ╨æber Speicher-Modelle 
  5937. erkl╨ört, bietet die Intel 80x86 CPU-Familie nur einen segmentierten 
  5938. Speicherzugriff an. In den 16-Bit- Speicher-Modellen bedeutet es, dass ein 
  5939. Zeiger nur einen Bereich von 64 KB adressieren kann. Um auf verschiedene 
  5940. Segmente zuzugreifen, benutzt man man 16 Bits grosse Selektoren. Das 
  5941. Betriebssystem f╨æhrt spezielle Deskriptoren f╨ær die Segmente. Dort werden 
  5942. Informationen ╨æber Segmentgr╨ñssen und ihren linearen Startadressen gespeichert. 
  5943. Es sind daher zwei verschiedene Arten von Zeigertypen verf╨ægbar. Ein NEAR 
  5944. Zeiger enth╨ölt den Offset relativ zum Beginn des Segments. Als dazugeh╨ñriger 
  5945. Segment-Selektor wird f╨ær Daten der Wert aus dem Segment-Register DS und f╨ær 
  5946. Code der Wert aus dem Segment-Register CS angenommen. Ein FAR Zeiger enth╨ölt 
  5947. zus╨ötzlich zum Offset immer einen expliziten Segment-Selektor. 
  5948. Segment-Selektoren sind 16 Bits grosse Indizes auf entsprechende 
  5949. Segment-Deskriptoren. 
  5950.  
  5951. In Abh╨öngigkeit vom gew╨öhlten Speicher-Modell ist f╨ær eine ╨¬bersetzung der 
  5952. Zeiger standardm╨össig eine FAR oder NEAR Einheit. Wenn aber entweder der 
  5953. Schalter auf der Kommandozeile oder die entsprechende ╨¬bersetzer- Direktive f╨ær 
  5954. die Spracherweiterungen aktiviert ist, dann k╨ñnnen die Schl╨æsselworte 'FAR' 
  5955. oder 'NEAR' benutzt werden, um die Zeigerart zu modifizieren. Diese neuen 
  5956. Schl╨æsselworte sind in folgenden Zusammenh╨öngen verf╨ægbar: 
  5957.  
  5958. ΓûÉ ProcedureHeading = [ NEAR | FAR ] PROCEDURE
  5959. ΓûÉ                    [ Receiver ] Ident [ FormalParameters ]
  5960. ΓûÉ Receiver         = "(" [ [ NEAR | FAR ] VAR ] Ident : Ident ")"
  5961. ΓûÉ FormalParameters = "(" FPSectionList ")" [ ":" Qualident ]
  5962. ΓûÉ FPSectionList    = [ FPSection { ";" FPSection } ]
  5963. ΓûÉ FPSection        = [ [ NEAR | FAR ] VAR ] IdentList ":" FormalType
  5964.  
  5965. ΓûÉ PointerType    = [ NEAR | FAR ] POINTER TO Type
  5966.  
  5967. ΓûÉ ProcedureType  = [ NEAR | FAR ] PROCEDURE [ FormalTypeList ]
  5968. ΓûÉ FormalTypeList = "(" FTSectionList ")" [ ":" Qualident ]
  5969. ΓûÉ FTSectionList  = [ FTSection { "," FTSection } ]
  5970. ΓûÉ FTSection      = [ [ NEAR | FAR ] VAR ] FormalType
  5971.  
  5972. Eine Prozedur oder ein Prozedur-Typ kann als FAR oder NEAR deklariert werden. 
  5973. Eine FAR Prozedur wird segmentiert aufgerufen und beendet. Dazu erzeugt der 
  5974. Code-Generator segmentierte Instruktionen f╨ær Calls oder Returns. Eine NEAR 
  5975. Prozedur wird von Code, der im gleichen Segment steht, aufgerufen und 
  5976. unsegmentiert beendigt. Der Code-Generator produziert f╨ær die Call- und 
  5977. Return-Instruktionen nur Offset-Werte f╨ær die Code-Adressen. 
  5978.  
  5979. Ein Zeigertyp kann auch als FAR oder NEAR deklariert werden, indem er die 
  5980. Standard-Attribute ╨æberschreibt. Das Standard-Attribut ist NEAR f╨ær die 
  5981. Speicher-Modelle Tiny, Small, Compact, oder Flat32, sonst wird FAR angenommen. 
  5982. Ein FAR Zeiger besteht aus den Angaben 
  5983.  16-Bit Segment : 16-oder-32-Bit Offset, 
  5984. w╨öhrend ein NEAR Zeiger nur aus dem 
  5985.  16-oder-32-Bit Offset 
  5986. besteht. 
  5987.  
  5988. Ein formaler VAR-Parameter darf durch eines der beiden Schl╨æsselworte 'FAR' 
  5989. oder 'NEAR' eingeleitet werden. Dadurch werden die Standard-Attribute 
  5990. ╨æberschrieben. Als Standard-Attribut wird f╨ær die Speicher-Modelle Compact oder 
  5991. Large FAR angenommen, sonst NEAR. Ein FAR VAR-Parameter zeigt auf eine 
  5992. Variable, die durch Referenz ╨æ bergeben worden ist, und die in einem anderen 
  5993. Datensegment stehen kann. Ein NEAR VAR-Parameter, der ebenfalls durch Referenz 
  5994. ╨æbergeben wird, zeigt immer auf eine Variable, die im Standard-Datensegment 
  5995. steht. 
  5996.  
  5997.  
  5998. ΓòÉΓòÉΓòÉ 14.10. Erweiterte Importe ΓòÉΓòÉΓòÉ
  5999.  
  6000. ΓûÉ Import          = FROM Ident IMPORT IdentList ";" |
  6001. ΓûÉ                   IMPORT [ FROM ] Ident { "," [ FROM ] Ident }
  6002.  
  6003. Standard-Modula bietet keine M╨ñglichkeit, aus einem anderen Definitionsmodul 
  6004. alle Namen unqualifiziert zu importieren, es sei denn, man spezifiziert alle 
  6005. gew╨ænschten Namen in einer expliziten Liste. Beispiel: 
  6006.  
  6007.   FROM WINFRAME IMPORT
  6008.     WinCreateStdWindow,
  6009.     WinFlashWindow,
  6010.     :
  6011.   BEGIN
  6012.     (* unqualifizierte Bezugnahme auf importiertes WinCreateStdWindow *)
  6013.     WinCreateStdWindow( ... );
  6014.     (* qualifizierte Bezugnahme ebenso m╨ñglich *)
  6015.     WINFRAME.WinCreateStdWindow( ... );
  6016.   END ...;
  6017.  
  6018. Wenn man es mit einer grossen Anzahl von Objekten zu tun hat, die alle 
  6019. unqualifiziert importiert werden sollen, muss man in m╨æhsamer Kleinarbeit alle 
  6020. Namen in langen Importlisten angeben. Dies ist oftmals der Fall, wenn man f╨ær 
  6021. den OS/2 Presentation Manager oder der Workplace Shell Programme schreibt. Aus 
  6022. diesem Grund bietet dieser Sprach╨æbersetzer eine besondere Erweiterung f╨ær die 
  6023. Import-Anweisung, n╨ömlich den unqualifizierten Import eines ganzen 
  6024. Definitionsmoduls. Diese Erweiterung veranlasst den Sprach╨æbersetzer, w╨öhrend 
  6025. der Einlesephase nicht nur im aktuellen Modul nach Namen zu suchen, sondern 
  6026. auch im importierten Definitionsmodul. Der Sichtbarkeitsbereich erstreckt sich 
  6027. somit auch auf alle unqualifiziert importierten Definitionsmodule. Selbst wenn 
  6028. zwei unqualifiziert importierte Module ein Objekt gleichen Namens exportieren, 
  6029. wird das erste vom zweiten ╨æberschattet. Um das o.g. Beispiel wieder 
  6030. aufzugreifen, diesmal mit der neuen Import-Konstruktion: 
  6031.  
  6032.   IMPORT FROM WINFRAME;
  6033.     :
  6034.   BEGIN
  6035.     (* unqualifizierte Bezugnahme auf importiertes WinCreateStdWindow *)
  6036.     WinCreateStdWindow( ... );
  6037.     (* qualifizierte Bezugnahme ebenfalls immer noch m╨ñglich *)
  6038.     WINFRAME.WinCreateStdWindow( ... );
  6039.   END ...;
  6040.  
  6041.  
  6042. ΓòÉΓòÉΓòÉ 15. Sprachgrammatik ΓòÉΓòÉΓòÉ
  6043.  
  6044. Die Sprachen f╨ær Modula-2 und f╨ær den INLINE-Assemblierer werden nach einer 
  6045. bestimmten Menge von Grammatikregeln geformt. Zur Beschreibung der Syntax wird 
  6046. eine erweiterte Notation nach Backus-Naur benutzt. 
  6047.  
  6048. Die Modula-2-Grammatik unterst╨ætzt nicht nur Wirth's Standard-Syntax, sondern 
  6049. auch einige m╨öchtige Spracherweiterungen. 
  6050.  
  6051. Die INLINE-Assemblierer-Grammatik ist mit dem Ziel einer einfachen Benutzung 
  6052. entworfen worden. Einige der reservierten Worte wie z.B. die Namen von 
  6053. 32-Bit-Registern sind nur f╨ær 32-Bit-Programme verf╨ægbar. 
  6054.  
  6055.  
  6056. ΓòÉΓòÉΓòÉ 15.1. Modula-2-Grammatik ΓòÉΓòÉΓòÉ
  6057.  
  6058. CompilationUnit = DefModule | [ IMPLEMENTATION ] ProgramModule
  6059. ProgramModule   = MODULE Ident Priority ";" { Import } Block Ident "."
  6060. Priority        = [ "[" ConstExpr "]" ]
  6061. Import          = FROM Ident IMPORT IdentList ";" |
  6062.                   IMPORT [ FROM ] Ident { "," [ FROM ] Ident }
  6063. IdentList       = Ident { "," Ident }
  6064.  
  6065. DefModule = DEFINITION MODULE Ident ";" { Import } { Def } END Ident "."
  6066. Def       = CONST { ConstDef ";" } | TYPE { TypeDef ";" } |
  6067.             VAR { VarDecl ";" } | ProcedureHeading ";"
  6068.  
  6069. ConstDef  = Ident "=" ConstExpr
  6070. TypeDef   = TypeDecl | Ident
  6071.  
  6072. ProcedureHeading = [ NEAR | FAR ] PROCEDURE
  6073.                    [ Receiver ] Ident [ FormalParameters ]
  6074. Receiver         = "(" [ [ NEAR | FAR ] VAR ] Ident : Ident ")"
  6075. FormalParameters = "(" FPSectionList ")" [ ":" Qualident ]
  6076. FPSectionList    = [ FPSection { ";" FPSection } ]
  6077. FPSection        = [ [ NEAR | FAR ] VAR ] IdentList ":" FormalType
  6078. FormalType       = { ARRAY OF } Qualident
  6079.  
  6080. Qualident        = { Qualifier "." } Ident
  6081. Qualifier        = Ident
  6082.  
  6083. Block         = { Decl } [ BEGIN StmtSeq ] END
  6084. Decl          = CONST { ConstDecl ";" } | TYPE { TypeDecl ";" } |
  6085.                 VAR { VarDecl ";" } | ProcedureDecl | ModuleDecl
  6086.  
  6087. ConstDecl       = ConstDef | ConstVarDecl "=" TypedConst
  6088. ConstVarDecl    = Ident ":" FormalType
  6089. TypeDecl        = Ident = Type
  6090. VarDecl         = VarIdent { "," VarIdent } ":" Type
  6091. VarIdent        = Ident [ FarPointerConst ]
  6092. FarPointerConst = "[" ConstExpr ":" ConstExpr "]"
  6093. ProcedureDecl   = ProcedureHeading ";" Block Ident |
  6094.                   ProcedureHeading ";" FORWARD
  6095. ModuleDecl      = MODULE Ident [ Priority ] { Import } [ Export ]
  6096.                   Block Ident
  6097. Export          = EXPORT [ QUALIFIED ] IdentList ";"
  6098.  
  6099. TypedConst     = ConstExpr | PointerConst | ArrayConst | RecordConst
  6100. PointerConst   = POINTER TO Qualident |
  6101.                  PROCEDURE Qualident |
  6102.                  "^" Qualident
  6103. RecordConst    = "(" FieldConstList ")"
  6104. FieldConstList = FieldConst { ";" FieldConst }
  6105. FieldConst     = [ FieldId ":" TypedConst ]
  6106. FieldId        = Ident
  6107. ArrayConst     = "[" TypedConstList "]"
  6108. TypedConstList = TypedConst { "," TypedConst }
  6109.  
  6110. Type           = SimpleType | ArrayType | RecordType | SetType |
  6111.                  PointerType | ProcedureType
  6112. SimpleType     = Qualident | Enumeration | SubrangeType
  6113. Enumeration    = "(" IdentList ")"
  6114. SubrangeType   = [ BaseType ] "[" ConstExpr ".." ConstExpr "]"
  6115. BaseType       = Qualident
  6116. ArrayType      = ARRAY IndexType { "," IndexType } OF Type
  6117. IndexType      = SimpleType
  6118. RecordType     = RECORD [ "(" RecordBase ")" ] FieldListSeq END
  6119. RecordBase     = Qualident
  6120. FieldListSeq   = FieldList { ";" FieldList }
  6121. FieldList      = [ IdentList ":" Type | Variants ]
  6122. Variants       = CASE [ Ident ":" ] Qualident
  6123.                  OF VariantList ElseVariant END
  6124. VariantList    = Variant { "|" Variant }
  6125. ElseVariant    = ELSE FieldListSeq
  6126. Variant        = CaseLabelList ":" FieldListSeq
  6127. SetType        = SET OF SimpleType
  6128. PointerType    = [ NEAR | FAR ] POINTER TO Type
  6129. ProcedureType  = [ NEAR | FAR ] PROCEDURE [ FormalTypeList ]
  6130. FormalTypeList = "(" FTSectionList ")" [ ":" Qualident ]
  6131. FTSectionList  = [ FTSection { "," FTSection } ]
  6132. FTSection      = [ [ NEAR | FAR ] VAR ] FormalType
  6133.  
  6134. StmtSeq        = Stmt { ";" Stmt }
  6135. Stmt           = [ Assignment | ProcedureCall | IfStmt | CaseStmt |
  6136.                  WhileStmt | RepeatStmt | LoopStmt | ForStmt |
  6137.                  WithStmt | EXIT | ReturnStmt ]
  6138. Assignment     = Designator ":=" Expr
  6139. ProcedureCall  = Designator [ ActualParams ]
  6140. ActualParams   = "(" [ Expr { "," Expr } ] ")"
  6141. IfStmt         = IF BoolExpr THEN StmtSeq
  6142.                  { ELSIF BoolExpr THEN StmtSeq }
  6143.                  [ ELSE StmtSeq ] END
  6144. BoolExpr       = Expr
  6145. CaseStmt       = CASE Expr OF Case { "|" Case } [ ELSE StmtSeq ] END
  6146. Case           = CaseLabelList ":" StmtSeq
  6147. CaseLabelList  = CaseLabels { "," CaseLabels }
  6148. CaseLabels     = ConstExpr [ ".." ConstExpr ]
  6149. WhileStmt      = WHILE BoolExpr DO StmtSeq END
  6150. RepeatStmt     = REPEAT StmtSeq UNTIL BoolExpr
  6151. LoopStmt       = LOOP StmtSeq END
  6152. ForStmt        = FOR ControlVar ":=" Expr TO Expr [ BY ConstExpr ]
  6153.                  DO StmtSeq END
  6154. ControlVar     = Ident
  6155. WithStmt       = WITH RecDesignator DO StmtSeq END
  6156. RecDesignator  = Designator | Guard
  6157. Guard          = Qualident ":" Qualident
  6158. ReturnStmt     = RETURN [ Expr ]
  6159.  
  6160. ConstExpr       = Expr
  6161. Expr            = SimpleExpr [ Relation SimpleExpr ]
  6162. SimpleExpr      = [ "+" | "-" ] Term { AddOperator Term }
  6163. Term            = Factor { MulOperator Factor }
  6164. Factor          = CharConst | Number | String | Set |
  6165.                   Designator [ ActualParams ] | "(" Expr ")" |
  6166.                   Not Factor
  6167. Set             = Qualident "{" [ ElemList ] "}"
  6168. ElemList        = Elem { "," Elem }
  6169. Elem            = Expr { ".." Elem }
  6170. Relation        = "=" | "<>" | "#" | "<" | "<=" | ">" | ">=" | IN | IS
  6171. AddOperator     = "+" | "-" | OR | XOR
  6172. MulOperator     = "*" | "/" | DIV | MOD | AND | "&" | SHL | SHR
  6173. Not             = NOT | "~"
  6174.  
  6175. Designator  = Qualident { Selector }
  6176. Selector    = "." Ident | "[" IndexList "]" | "^" | TypeGuard
  6177. IndexList   = Expr { "," Expr }
  6178. TypeGuard   = "(" Qualident ")"
  6179.  
  6180. CharConst   = "'" Character "'" | Digit { HexDigit } "X" |
  6181.               OctalDigit { OctalDigit } "C"
  6182. String      = "'" { Character } "'" | """ { Character } """
  6183. Number      = Integer | Real
  6184. Integer     = Digit { Digit } | OctalDigit { OctalDigit } "B" |
  6185.               Digit { HexDigit } "H"
  6186. Real        = Digit { Digit } "." { Digit } [ ScaleFactor ]
  6187. ScaleFactor = "E" [ "+" | "-" ] Digit { Digit }
  6188. HexDigit    = Digit | "A" | "B" | "C" | "D" | "E" | "F"
  6189. Digit       = "0"  | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
  6190. OctalDigit  = "0"  | "1" | "2" | "3" | "4" | "5" | "6" | "7"
  6191. Ident       = FirstLetter { "_" | Letter | Digit }
  6192. FirstLetter = "_" | Letter
  6193.  
  6194.  
  6195. ΓòÉΓòÉΓòÉ 15.2. INLINE-Assemblierer-Grammatik ΓòÉΓòÉΓòÉ
  6196.  
  6197. Jeder Name aus den Eingabedaten einer Quelldatei wird einem der Symbole 
  6198. 'Ident', 'ConstId', 'Qualifier' oder 'Keyword' zugeordnet. Von einem strengen 
  6199. lexikalischen Standpunkt aus betrachtet scheinen sie keine 
  6200. Unterscheidungsmerkmale zu haben. Die lexikalische Pr╨æfung in diesem 
  6201. INLINE-Assemblierer ist jedoch dahingehend erweitert worden, dass durch 
  6202. zus╨ötztliche semantische (kontext-sensitive) Pr╨æfungen festgestellt werden 
  6203. kann, zu welchen der o.g. Symbole ein Name geh╨ñren soll. Die lexikalischen 
  6204. Regeln f╨ær Zahlen und Zeichenkonstanten sind mit denen von Modula-2 identisch. 
  6205.  
  6206. Inline     = "(" InlineList ")"
  6207. InlineList = CodeList { InstrList }
  6208. InstrList  = CSEG eol CodeList | DSEG eol DataList |
  6209.              SSEG eol DataList | ISEG eol InitList
  6210. CodeList   = Code { eol Code }
  6211. Code       = CodeInstr | CondCode
  6212. DataList   = Data { eol Data }
  6213. Data       = DataInstr | CondData
  6214. InitList   = Init
  6215. Init       = InitInstr | CondInit
  6216.  
  6217. CondCode   = IF CondExpr [ THEN | eol ] CodeList [ ELSE CodeList ] ENDIF
  6218. CondData   = IF CondExpr [ THEN | eol ] DataList [ ELSE DataList ] ENDIF
  6219. CondInit   = IF CondExpr [ THEN | eol ] InitList [ ELSE InitList ] ENDIF
  6220. CondExpr   = ImmedExpr
  6221.  
  6222. CodeInstr  = [ Label ] [ CodeStmt ]
  6223. CodeStmt   = InstrId [ Operand [ Operand [ Operand ] ] ] |
  6224.              CodeDirective CodeConstLst
  6225. Label      = AnyId ":"
  6226. InstrId    = [ RepPrefix ] AnyId | AND | OR | XOR | NOT | DIV | SHL | SHR
  6227. RepPrefix  = REP | REPE | REPZ | REPNE | REPNZ
  6228. AnyId      = Ident | ConstId
  6229.  
  6230. Operand    = UserReg | SegReg | MemDesignator | ImmedExpr | SegExpr |
  6231.              OfsExpr | FloatStack | ControlReg | DebugReg | TestReg
  6232.  
  6233. UserReg    = AX | BX | CX | DX | SI | DI | BP | SP |
  6234.              AL | AH | BL | BH | CL | CH | DL | DH | Reg32
  6235. Reg32      = EAX | EBX | ECX | EDX | ESI | EDI | EBP | ESP
  6236. SegReg     = CS | DS | ES | SS | FS | GS
  6237. FloatStack = ST [ "(" ImmedExpr ")" ]
  6238. ControlReg = CR0 | CR2 | CR3
  6239. DebugReg   = DR0 | DR1 | DR2 | DR3 | DR6 | DR7
  6240. TestReg    = TR6 | TR7
  6241.  
  6242. MemDesignator = [ Attr ] Mem
  6243. Mem           = MemId [ DispExpr | "[" IndexExpr "]" ]  |  "[" MemExpr "]"
  6244. DispExpr      = Unary DispTerm { Unary DispTerm }
  6245. DispTerm      = ImmedTerm
  6246. IndexExpr     = IndexStart { Unary DispTerm | RegTerm }
  6247. IndexStart    = [ "-" ] DispTerm | RegTerm
  6248. RegTerm       = BX | BP | SI | DI | reg32 [ "*" ScaleFactor ]
  6249. ScaleFactor   = ImmedFactor
  6250.  
  6251. MemExpr       = MemStart { Unary DispTerm | "+" RegTerm }
  6252. MemStart      = [ "-" ] DispTerm | RegTerm | MemId
  6253. MemId         = Designator
  6254.  
  6255. Attr          = FAR | NEAR | SHORT |
  6256.                 SegReg ":" | SizeAttr | SizeAttr SegReg ":"
  6257. SizeAttr      = SizeId [ PTR ] | LOW | HIGH
  6258. SizeId        = BYTE | WORD | DWORD | FWORD | QWORD | TBYTE
  6259.  
  6260. SegExpr       = SEG MemId
  6261. OfsExpr       = OFFSET MemId
  6262.  
  6263. Designator     = Qualident { "." MemberId }
  6264. Qualident      = { QualifierList "." } UserId
  6265. QualifiedConst = { QualifierList "." } ConstId
  6266. QualifierList  = Qualifier { "." Qualifier }
  6267. UserId         = Ident | Keyword
  6268. MemberId       = AnyId | Keyword
  6269.  
  6270. CodeDirective   = DataDirective
  6271. CodeConstLst    = CodeConst { "," CodeConst }
  6272. CodeConst       = ImmedExpr | SegExpr | OfsExpr | FarPointerConst |
  6273.                   Designator | DupSize DUP "(" CodeConstLst ")"
  6274. FarPointerConst = "[" ImmedExpr ":" ImmedExpr "]"
  6275.  
  6276. DataInstr     = [ DataName DataDirective DataAttrLst ]
  6277. DataName      = [ AnyId ]
  6278. DataDirective = DB | DW | DD | DF | DQ | DT
  6279. DataAttrLst   = DataAttr { ",' DataAttr }
  6280. DataAttr      = "?" | DupSize DUP "(" DataAttrLst ")"
  6281. DupSize       = ImmedExpr
  6282.  
  6283. InitInstr     = [ InitName InitDecl ]
  6284. InitName      = [ AnyId ]
  6285. InitDecl      = CodeDirective CodeConstLst
  6286.  
  6287. ImmedExpr        = SimpleImmedExpr { Relation SimpleImmedExpr }
  6288. SimpleImmedExpr  = [ Unary ] ImmedTerm { AddOperator ImmedTerm }
  6289. ImmedTerm        = ImmedFactor { MulOperator ImmedFactor }
  6290. ImmedFactor      = QualifiedConst | Number | String | CharConst |
  6291.                    "(" ImmedExpr ")" | NOT ImmedFactor |
  6292.                    TYPE VarId | SIZE VarId | LENGTH VarId
  6293. VarId            = Designator
  6294.  
  6295. AddOperator   = "+" | "-" | OR | XOR
  6296. MulOperator   = "*" | "/" | DIV | MOD | "&" | AND | SHL | SHR
  6297. Unary         = "+" | "-"
  6298.  
  6299.