home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 02 / texte / pascomp.6 < prev    next >
Encoding:
Text File  |  1980-01-03  |  6.4 KB  |  144 lines

  1.  
  2.  
  3.  
  4. PASCOMP
  5.  
  6. PASCAL baut einen Pascal-Compiler
  7.  
  8. Teil 7: Der P-Code Interpreter
  9.         von Johannes Velmans
  10.  
  11. Unser PASCOMP-Projekt nimmt langsam Gestalt an. Beschäftigten wir
  12. uns  in  den  ersten  Folgen hauptsächlich mit den Grundlagen und
  13. Theorien  des Compilerbaus, so ist es jetzt an der Zeit, sich Ge-
  14. danken  über den interpretativen Teil zu machen. Mit den bisheri-
  15. gen  Hilfsmitteln  sind  wir  in der Lage, ein beliebiges Pascal-
  16. Programm  in  ein äquivalentes P-Code- Programm zu übersetzen. Da
  17. der  Prozessor unserer benutzten Maschine aber keinen P-Code ver-
  18. steht,  müssen  wir  ein Programm schreiben, das in der Lage ist,
  19. eine  P-Code-Maschine  zu simulieren und somit unser Pascal- Pro-
  20. gramm auszuführen - den P-Code- Interpreter.
  21.  
  22. Die  letzte  Folge  dieser Serie war darauf ausgerichtet, einiges
  23. über die Struktur des P-Codes zu vermitteln. Dieser Teil baut nun
  24. im  wesentlichen  auf  dem  Wissen der letzten Folge auf. Deshalb
  25. sollte  man sich ruhig noch einmal die letzte Folge zur Hand neh-
  26. men, damit man die eine oder andere Sache in diesem Kapitel nicht
  27. direkt als "böhmisches Dorf" betrachtet.
  28.  
  29.  
  30. Zweiteilung des Interpreters
  31. Beim  Aufruf des Interpreters werden zwei große Prozesse nachein-
  32. ander  bearbeitet.  Der erste Prozeß ist der Assembler. In dieser
  33. Phase wird der vom Compiler abgelieferte P-Code-Text in eine äqu-
  34. ivalente  Folge  von  P-Code-Maschinenbefehlen, die aus einzelnen
  35. Integer-Zahlen  bestehen, umgewandelt. Im zweiten Prozeß, der In-
  36. terpretation, wird dann das Programm effektiv ausgeführt.
  37.  
  38. Der  Assembler  erzeugt zwei Datenstrukturen für den späteren Ge-
  39. brauch  durch  den  Interpreter. Die erste ist die erzeugte Code-
  40. Folge,  welche  die P-Code-Befehle in assemblierter Form, also in
  41. Zahlendarstellung  beinhaltet.  Diese  Struktur ist intern in der
  42. Implementierung  des  Interpreters ein Array, das in jeder Kompo-
  43. nente  drei Zahlen aufnehmen kann. Die erste Zahl ist der P-Code-
  44. Befehl  -  der  Operator, die zweite und dritte Zahl können even-
  45. tuelle Parameter sein.
  46. In der zweiten durch den Assembler erzeugten Struktur werden Kon-
  47. stanten  abgespeichert, die später vom Interpreter benutzt werden
  48. können.  Dabei  werden  Konstanten bis auf die Ausnahme von Text-
  49. strings  in  separaten Arrays zur Speicherplatzersparnis unterge-
  50. bracht.  Diese Konstantentabellen sind im Interpreter als globale
  51. Variable untergebracht und haben folgende Bezeichnung:
  52.  
  53. Boundtable:
  54. Diese  Tabelle  findet bei der Grenzbereichsüberprüfung ihre Ver-
  55. wendung.  In ihr werden die zu testenden Grenzen in Paarform (Un-
  56. tergrenze, Obergrenze) abgelegt.
  57.  
  58. Longtable:
  59. Hier werden Longinteger-Konstanten untergebracht.
  60.  
  61. Realtable, Settable:
  62. Entsprechende  Konstanten-Tabellen für Realzahlen und Mengen-Kon-
  63. stanten.
  64.  
  65. Alle  anderen in einem Pascal-Programm verwendeten Konstanten wie
  66. integer,  char,  boolean usw. haben aufgrund ihrer geringen Spei-
  67. chergröße  im Code-Array Platz und benötigen daher keine explizi-
  68. ten Tabellen zur Abspeicherung ihrer Werte.
  69.  
  70.  
  71. Aufruf des Assemblers
  72. Der  Assembler-Prozess  wird in der Implementierung des Interpre-
  73. ters  durch  eine Prozedur mit dem Namen 'Load' gestartet und er-
  74. zeugt zu jeder P-Code- Quellzeile einen äquivalenten Indexeintrag
  75. im Code-Array. Beispielsweise wird durch die P-Code-Zeile
  76.  
  77. lodr 4 5
  78. der Eintrag
  79. '124 4 5'
  80.  
  81. im Code-Array erzeugt. Parallel zu der Erzeugung des Maschinenco-
  82. des  wird  eine Tabelle zur Verwaltung der benutzten Sprungmarken
  83. aufgebaut  und  gewartet.  Somit können direkte Sprünge berechnet
  84. und in den Code eingefügt werden. Diese Labeltabelle wird für die
  85. spätere  Phase der Interpretation nicht mehr benötigt. Daher wird
  86. der  für  diese Tabelle benötigte Speicherplatz nach Abschluß der
  87. Assemblerphase  dem  Hauptspeicher des Rechners wieder zur Verfü-
  88. gung gestellt.
  89.  
  90.  
  91. Der Interpreter
  92. Nachdem  der Assembler den P-Code in das Code-Array transformiert
  93. und  eventuell aufgetretene Konstanten in den entsprechenden Kon-
  94. stanten-Tabellen  untergebracht hat, tritt nun der Interpreter in
  95. Aktion.  Dieser  führt  die P-Code-Befehle in einer großen While-
  96. Schleife  aus. Innerhalb dieser Schleife befindet sich eine Case-
  97. Anweisung  über alle P-Code-Befehle. Das Konzept des Interpreters
  98. ist,  wie  man sieht, eigentlich ganz trivial und dürfte dem mit-
  99. tlerweile  erfahrenen  PASCOMP-Leser keine Schwierigkeiten berei-
  100. ten.  In der zentralen Schleife gibt es scheinbar nur wenige Pro-
  101. zeduren, die dem Namen nach nichts mit den P-Code-Befehlsnamen zu
  102. tun  haben.  Dazu  gehören die Prozeduren 'Compareblock', 'Basis'
  103. sowie  die  Prozedur  'Callstdprocs'. Die Bedeutung der einzelnen
  104. Prozeduren sei hier kurz erklärt:
  105.  
  106. Basis:
  107. Die  Funktion  'Basis'  wird vom Interpreter dazu benutzt, um die
  108. Verbindung zu unterschiedlichen Laufzeitschachteln herzustellen.
  109.  
  110. Compareblock:
  111. Die  Prozedur  'Compareblock'  vergleicht Strings miteinander und
  112. legt  das Ergebnis dieses Vergleichs als boole'schen Wert auf den
  113. Stack ab.
  114.  
  115. Callstdprocs:
  116. Die Prozedur 'Callstdprocs' führt den Aufruf von Standardprozedu-
  117. ren aus, die in der P-Code-Source mit 'csp <stdprocname>' gekenn-
  118. zeichnet sind.
  119.  
  120. Alle  anderen  Prozeduraufrufe, die in der zentralen Schleife des
  121. Interpreters  auftreten,  stehen in direktem Zusammenhang mit der
  122. Ausführung der P-Code-Befehle. Die Namen dieser Prozeduren setzen
  123. sich  aus einem 'P' gefolgt von dem zugehörigen P-Code-Befehl zu-
  124. sammen - PEQU, PNEQ, PUNI, PCHK...
  125.  
  126. Um die Analyse des Programms zu vereinfachen, stehen dem Benutzer
  127. des Interpreters während der Laufzeit einige Hilfsmittel zur Ver-
  128. fügung.  Dazu gehört eine Prozedur 'Postmortemdump', die nach ei-
  129. nem  erfolgten Absturz des Benutzerprogramms den Inhalt des Stack
  130. darstellt  und  die  Werte des Programmzählers PC, des Markstack-
  131. pointers  MP  und des Newpointers NP ausgibt. Eine weitere Hilfs-
  132. Prozedur  ist 'Writekeller', die bei einem Laufzeitfehler die Na-
  133. men  sämtlicher auf dem Stack befindlichen Laufzeitschachteln auf
  134. dem  Bildschirm  ausgibt  und  somit  die  aktuelle Situation des
  135. Stacks wiederspiegelt.
  136.  
  137. Dadurch  wird  eine  Rückverfolgung der dynamischen Vorgänger we-
  138. sentlich  vereinfacht.  Als letztes Laufzeithilfsmittel steht dem
  139. Benutzer  die Abbruchsfunktion zur Verfügung, das heißt, ein Pro-
  140. gramm kann zu jeder Zeit seiner Ausführung durch den Benutzer mit
  141. Ctrl-C  abgebrochen werden. Als Abschluß ist hier noch ein Auszug
  142. aus dem Interpreter dargestellt, der nochmals das Prinzip und die
  143. Arbeitsweise desselbigen verdeutlicht.
  144.