DE69625948T2 - Kompiler mit generischem Front-End und dynamisch ladbaren Back-Ends - Google Patents
Kompiler mit generischem Front-End und dynamisch ladbaren Back-EndsInfo
- Publication number
- DE69625948T2 DE69625948T2 DE69625948T DE69625948T DE69625948T2 DE 69625948 T2 DE69625948 T2 DE 69625948T2 DE 69625948 T DE69625948 T DE 69625948T DE 69625948 T DE69625948 T DE 69625948T DE 69625948 T2 DE69625948 T2 DE 69625948T2
- Authority
- DE
- Germany
- Prior art keywords
- backend
- node
- tree
- pseudo
- syntax tree
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
- 238000000034 method Methods 0.000 claims description 19
- 238000012545 processing Methods 0.000 claims description 9
- 230000004044 response Effects 0.000 claims description 2
- 238000010586 diagram Methods 0.000 description 4
- 230000001419 dependent effect Effects 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 239000000284 extract Substances 0.000 description 2
- 238000010276 construction Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/47—Retargetable compilers
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
- Computer And Data Communications (AREA)
Description
- Die Erfindung betrifft Verfahren und Systeme zum Kompilieren von Quellcode-Datensätzen in zahlreiche ausführbare und zugehörige Ausgangsdatensätze, insbesondere Verfahren und Systeme, die dynamisches Laden von Compiler-Rückenden für variable Kompilierungsausgaben nutzen.
- In einer herkömmlichen Computercode-Entwicklungsumgebung wird ein Compiler genutzt, um verschiedene Arten von Zielcode-Datensätzen aus Quellcode-Datensätzen zu erzeugen. Herkömmliche Compiler umfassen eine Frontende-Einheit und eine oder mehrere zweckbestimmte Rückende-Einheiten. Das Frontende umfaßt typischerweise einen Scanner, der die Eingabequellcode-Datensätze liest und Token ausgibt, die für die in dem Quellcode genutzte Programmiersprache von Bedeutung sind. Das Frontende umfaßt darüber hinaus typischerweise einen Parser, der die Tokensequenz des Scanners entgegennimmt und einen Pseudo- Syntaxbaum des Datensatzes erzeugt, welcher die grammatikalische Struktur der Token repräsentiert. Ein typischer Compiler kann ein oder mehrere Rückenden umfassen, die jeweils die Datentypen der Token in dem Pseudo-Syntaxbaum, deren Quellorte und andere Informationen identifizieren, und erzeugt einen Rückende-Baum aus dieser Information. Aus seinem Rückende-Baum erzeugt ein Rückende eine spezielle Art von Zielausgabe. Die Zielausgaben bzw. -ausgänge der Rückenden umfassen Code-Datensätze, beispielsweise Kopfdatensätze, Datentyp-Datensätze, Skelettcode-Datensätze, Programmrohlingcode-Datensätze und dergleichen oder eine spezielle Folge von Aktionen, beispielsweise das Laden eines Schnittstellen- Verwahrungsorts für Objektdefinitionen oder das Erzeugen einer dauerhaften Speicherdatenbank.
- In einem herkömmlichen Compiler sind die Rückenden für den Compiler vorgesehen und integral mit diesem ausgebildet. Diese bedeutet, daß der Nutzer des Compilers neue Rückenden für die Nutzung mit dem Compiler-Frontende zum Erzeugen von Zielcode, der für die speziellen Bedürfnisse des Nutzers geeignet ist, nicht erzeugen kann. Dieses hält den Verkäufer, anders als den Verkäufer des Compilers, davon ab, unabhängige Rückenden zu erzeugen, die maschinenabhängigen Zielausgaben zur Nutzung mit mehreren Frontenden erzeugen. Darüber hinaus arbeitet jedes Rückende auf einem spezifischen Zwischendatensatz- Formataus-gang des Frontendes, auch wenn Mehrfach-Rückenden vorhanden sind. Das Frontende muß in der Lage sein, diese unterschiedlichen Zwischendatensätze für jedes Rückende zu erzeugen. Weil der Compiler verschiedene Rückende-Ausgaben liefern kann, muß das Frontende deshalb jedesmal ausgeführt werden, um die gewünschten Zwischendatensätze zu erzeugen, wodurch der Zeitbedarf zum Kompilieren der verschiedenen Zielcode- Datensätze zunimmt.
- P. J. Hatcher et al. "Efficient retargetable compiler code generation", 9. Oktober 1988, Internationale Konferenz über Computersprachen, Miami, 9.-13. Oktober 1988, Nr. 1988, Seiten 25 bis 30, Institute of Electrical and Electronics Engineers XP000013646 offenbart eine Vorrichtung zum Kompilieren eines Quellcode-Datensatzes und zum Erzeugen variabler Zielausgänge hieraus mit einem Frontende, wenigstens einem Rückende und einem generischen Rückende, welches das wenigstens eine Rückende steuert, um einen zugehörigen Rückende- Baum zu erzeugen. Die Rückzielbarkeit des Compilersystems wird dadurch erreicht, daß jedes Rückende als ein Interpretierer der maschinenabhängigen Treibertabellen ausgeführt wird, und daß der Compiler dynamisch ausgeführt wird, um Code für eine spezifische Maschine zu erzeugen.
- Die Druckschrift Communications of the ACM, September 1983, USA, Vol. 26, Nr. 9, ISSN 0001-078, Seiten 654-660, XP002026989, A. S. Tanenbaum et al. "A practical tool kit for making protable compilers" beschreibt ein Werkzeug zum Bilden portierbarer Kompilierer und offenbart, daß es für die Geschwindigkeit nützlich ist, daß das Rückende in der Treibertabelle nicht einmalig tatsächlich liest. Demgegenüber werden die Tabellen zusammen mit dem Rückende auf einmal kompiliert, was zu einem Binärprogramm für die Zielmaschine führt.
- Es ist deshalb wünschenswert, eine Compilergestaltung anzugeben, bei der die Rückenden unabhängig von dem Frontende sind und zur Kompilierzeit gemäß dem Wunsch des Nutzers dynamisch aufgerufen werden. Es ist weiterhin wünschenswert, ein Frontende anzugeben, das mit Mehrfach-Rückenden effizient zusammenarbeiten kann, ohne daß Zwischendatensätze erzeugt werden müssen.
- Die Erfindung liefert eine Vorrichtung und ein Verfahren zum Kompilieren eines Quellcode- Datensatzes und zum Erzeugen variabler Zielausgaben hiervon gemäß den Ansprüchen 1 bzw. 10.
- Die Erfindung überwindet diese verschiedenen Begrenzungen, indem ein Compiler mit einem generischen Rückende zur Verfügung gestellt wird, das in der Lage ist, mit einer Anzahl unabhängiger Rückenden zusammenzuarbeiten, die zur Laufzeit geladen werden. Jedes Rückende erzeugt seinen eigenen Rückende-Baum, der für die Ausgaben des Rückendes angepaßt ist. Der Compiler umfaßt ein Frontende, das einen Pseudo-Syntaxbaum aus einem Eingabe- Quellcode-Datensatz erzeugt. Der Pseudo-Syntaxbaum umfaßt Knoten, die Token in dem Quellcode-Datensatz repräsentieren. Das generische Rückende umfaßt eine Anlagerungs- bzw. Anbindungsoperation, die an einen ausgewählten Knoten des Pseudo-Syntaxbaums ein Rückende-Knoten von einem gegebenen Rückende-Baum anbindet. Das generische Rückende iterriert über die Knoten des Pseudo-Syntaxbaums, wobei für jeden Knoten des ursprünglichen Pseudo-Syntaxbaums alle Knoten des Rückende-Baums aufgerufen werden, die hier angebunden sind. Jedes solche Rückende umfaßt eine Additionsoperation, die einen Knoten des Pseudo-Syntaxbaums verarbeitet, um festzustellen, ob der Rückende-Baum zum Einschließen eines oder mehrerer Rückende-Knoten für den Pseudo-Syntaxbaum-Knoten multipliziert werden soll. Wenn ein neuer Rückende-Knoten hinzugefügt wird, kann er auch einen anderen Knoten des Pseudo-Syntaxbaums angehängt werden. Auf diese Art und Weise kann jedes unabhängige Rückende auf Basis nur eines einzelnen Durchgangs mittels des Frontende-Compilers zum Erzeugen des Pseudo-Syntaxbaums seinen eigenen Rückende-Baum erzeugen. Das generische Rückende managt die Operation der einzelnen Rückenden, so daß jedes Rückende den Pseudo-Syntaxbaum bezüglich der anderen Rückenden in der korrekten Reihenfolge analysiert. Das generische Rückende umfaßt auch eine Nachschlageoperation, die als Reaktion auf die Anforderung von anderen Knoten in anderen Rückende-Bäumen null oder mehr Knoten in einem Rückende-Baum auf Basis von spezifizierten Familien- Identifikationswerten zurückgibt. Dieses ermöglicht es einem Knoten in einem Rückende- Baum, sich auf einen Knoten in einem anderen Rückende zu beziehen.
- Die Erfindung wird im folgenden anhand von Ausführungsbeispielen unter Bezugnahme auf eine Zeichnung näher erläutert. Hierbei zeigen:
- Fig. 1 ein Blockdiagramm eines Computersystems mit einem erfindungsgemäßen Compiler;
- Fig. 2 ein Datenflußdiagramm des Betriebs und der Struktur des erfindungsgemäßen Compilers;
- Fig. 3a bis 3f verschiedene Darstellungen eines kanonischen Pseudo-Syntaxbaums in verschiedenen Verarbeitungsstufen;
- Fig. 4a bis 4c Flußdiagramme des Betriebs des generischen Rückendes und individueller Rückenden; und
- Fig. 4d eine Darstellung der Aufrufreihenfolge der Do_Add-Operation nach Fig. 4b.
- Fig. 1 zeigt eine Ausführungsform eines Systems, welches den verbesserten Compiler mit den dynamisch ladbaren Rückenden liefert. Das System 100 umfaßt einen Computer 101 mit einem adressierbaren Speicher 103, einem Texteditor 107, dem Compiler 109 und mehreren unabhängigen Rückenden 123. Der Computer 101 ist von herkömmlichem Design, einschließlich eines Prozessors 115, Eingabe- 117 und Ausgabeeinrichtungen 119, einer Netzwerk-Schnittstelle 113 und einer Massenspeichereinrichtung 111. Der Computer 101 kann mit Hilfe der meisten Allzweckcomputer realisiert werden, beispielsweise als ein SPARCstationTM-Computer, der von Sun Microsystems, Inc. aus Mountain View, Ka. hergestellt ist. Jeder andere Allzweckcomputer kann ebenfalls für die Nutzung mit der Erfindung angepaßt werden. Der Computer 101 führt ein Allzweck-Betriebssystem 105 aus, beispielsweise Sun Microsystems' Solaris® Betriebssystem. Der Prozessor 115 führt den Texteditor 107, den Compiler 109 und die Rückenden 123 aus, einschließlich aller Operationen hiervon. Der Prozessor 115 liest und schreibt auch die Quellcode-Datensätze und die Zielausgabe-Datensätze in die und aus der Massenspeichereinrichtung 111 während der Ausführung des Texteditors 107 und des Compilers 109.
- Der Texteditor 107 ist ein herkömmlicher Editor zum Erzeugen und zum Editieren von Quellcode-Textdatensätzen. Der Editor 107 liefert eine herkömmliche Quellcode-Ausgabe als als einen ASCII-Textdatensatz oder einen äquivalenten Textdatensatz. Der Quellcode kann in jeder beliebigen höheren Sprache ausgeführt sein, beispielsweise in C, C++, SmallTalk oder dergleichen.
- Fig. 2 zeigt ein Datenflußdiagramm des Compilers 109 zusammen mit den Rückenden 123. Der Compiler 109 umfaßt ein Frontende 201, das die Quellcode-Textdatensätze empfängt und hiervon in herkömmlicher Art und Weise einen Pseudo-Syntaxbaum erzeugt. Der Pseudo- Syntaxbaum ist eine graphische Repräsentation der Syntax und der Struktur des Quellcode- Textdatensatzes. Bei einer bevorzugten Ausführungsform arbeitet der Compiler 109 mit Schnittstellen-Definitionssprache (IDL)-Datensätzen, die Objektschnittstellen für verteilte Objekte definieren. Bei dieser bevorzugten Ausführungsform erzeugt das Frontende 201 einen Pseudo-Syntaxbaum aus einem Eingabe-IDL-Datensatz oder -Datensätzen.
- In Verbindung mit den Rückenden 123 erzeugt der Compiler 109 mehrere verschiedene Zielausgaben. Diese Zielausgaben umfassen verschiedene Kopf oder Code-Datensätze oder Aktionen bezüglich anderer Datensätze oder Quellen. Für einen gegebenen Eingabe-Datensatz x.idl kann eine bevorzugte Ausführungsform des Compilers 109 und der Rückenden 123 beispielsweise Zielausgabe-Datensätze wie x.hh, xsurrogates.hh, xsurrogates.cc, xmarshal.hh, xmarshal.cc, xtypes.hh und xtypes.cc erzeugen. Jeder dieser Zielausgabe-Datensätze enthält Beschreibungen von Datentypen, Programmstumpen oder Skeletten und unterstützenden Sortierroutinen und wird von einem der Rückenden 123 erzeugt. Anstelle des Erzeugens von Datensätzen kann ein Rückende 123 eine beliebige Anzahl von Aktionen als Zielausgaben erzeugen. Beispielsweise kann ein Rückende 123 einen Schnittstellen-Verwaltungsort mit Schnittstellen-Definitionen laden, die aus einem gegebenen IDL-Datensatz abgeleitet werden. Um seine spezielle Ausgabe zu erzeugen, benötigt jedes Rückende üblicherweise mehr Informationen als sie in dem Pseudo-Syntaxbaum verfügbar sind. In ähnlicher Weise kann ein Rückende 123 nur bestimmte Information von dem Pseudo-Syntaxbaum nutzen. Wegen dieser beiden Gründe erzeugt jedes Rückende 123 seinen eigenen Rückende-Baum, der für seine Zielausgaben speziell angepaßt ist.
- Das Frontende 201 liefert den Pseudo-Syntaxbaum an ein generisches Rückende 203. Das generische Rückende 203 koordiniert die Konstruktion der Rückende-Bäume durch die einzelnen Rückenden 123. Jeder Rückende-Baum wird aus dem Pseudo-Syntaxbaum abgeleitet und ist an ein einzelnes Rückende 123 zum Erzeugen der Zielausgabe aus diesem Rückende 123 speziell angepaßt. Die vorliegende Diskussion bezieht sich auf den Pseudo-Syntaxbaum und die einzelnen Rückende-Bäume, ist jedoch so zu verstehen, daß solche "Bäume" allgemeiner als Graphen definiert sind, ohne die formalen Begrenzungen von Baumstrukturen.
- Fig. 3e ist eine kanonische Darstellung eines beispielhaften Pseudo-Syntaxbaums, der hier als "AST." abgekürzt wird. Der Pseudo-Syntaxbaum 300 umfaßt Knoten, einschließlich des Haupt- bzw. Wurzel-AST-Knotens 301 und einer Anzahl von Kinder-AST-Knoten 303. Jeder Knoten in dem Pseudo-Syntaxbaum 300 ist ein Objekt mit Attributen, welches den Quellcode-Token, den es repräsentiert, und Operationen zum Zurückgeben oder modifizieren der Knoteninformation beschreibt. Sowohl der Haupt-AST-Knoten 301 als auch die Kinder- AST-Knoten 303 werden gemeinsam als AST-Knoten 309 (nicht dargestellt) bezeichnet, sofern dieses notwendig ist. Zur Erleichterung der einzelnen Identifikation sind die verschiedenen Knoten 309 mit T1 bis T6 bezeichnet, um ihre relative Position in dem Pseudo- Syntaxbaum 300 zu kennzeichnen. Ein gegebener AST-Knoten kann sich nicht nur auf seine Kinder-Knoten beziehen, sondern auf jeden anderen AST-Knoten in dem Pseudo-Syntaxbaum 300, beispielsweise um eine Definition eines Datentyps oder andere nützliche Information zu liefern. Beispielsweise enthält der Knoten T6 eine Referenz auf den Knoten T4.
- Jedes Rückende 123 erzeugt seinen eigenen Rückende-Baum 500 in Verbindung mit dem generischen Rückende 201. Fig. 3f ist eine Darstellung eines beispielhaften Rückende- Baums, der von dem Pseudo-Syntaxbaum 300 abgeleitet ist. Jeder Rückende-Baum 500 umfaßt einen Hauptrückende-Knoten 501 und eine Anzahl von Kinder-Rückende-Knoten 503. Sowohl der Hauptrückende-Knoten 501 als auch die Kinder-Rückende-Knoten 503 werden gemeinsam als Rückende-Knoten 509 (nicht dargestellt) bezeichnet, wenn dieses notwendig ist. Jeder der Rückende-Knoten 509 kann einem oder mehreren der AST-Knoten 309 entsprechen. Dementsprechend muß die Struktur eines Rückende-Baums 500 nicht notwendigerweise eine Unterfolge des Pseudo-Syntaxbaums 300 sein. Dieses ist in Fig. 3d gezeigt, bei dem der Knoten D6 eher von dem Hauptrückende-Knoten D1 als von dem Knoten D5 abhängt. Darüber hinaus kann jeder Rückende-Knoten 509 an einem oder mehreren AST-Knoten 309 hängen; diese Form der Anbindung ist in Fig. 3d für den Knoten D5 gezeigt, welcher an die AST-Knoten T5 und T6 angehängt ist. Eine Rückende-Knoten 509 kann direkt an einen AST- Knoten 309 oder indirekt über eine Zwischendatenstruktur angehängt sein. Referenzen auf dem Rückende-Baum 500 und die Rückende-Knoten 509 im Rest dieser Beschreibung sollen sich auf jeden Rückende-Baum 500 und jeden Knoten 509 im allgemeinen und nicht auf die spezifisch dargestellten Bäume in den Fig. 3a-fr beziehen.
- Gemäß Fig. 2 existieren in der bevorzugten Ausführungsform drei Rückenden 123 vom allgemeinen Typ: ein Kommentar-Rückende 123a, ein ereigniserzeugendes Rückende 123b und eine codeerzeugendes Rückende 123c. Ein Kommentar-Rückende 123a liefert Information, die die einzelnen Datentypen beschreibt, welche in der Quellcode-Textdatensätze-Ausgabe von dem Texteditor 107 definiert sind. Diese Information umfaßt beispielsweise Typcode, Datentypgrößen, Namenszerreißunterstüzung und dergleichen für eine vorgegebene Zielsprache, beispielsweise C oder C++. Ein Kommentar-Rückende 123a erzeugt keinen Code, sondern eher seinen eigenen Rückende-Baum, der Information liefert, die von codeerzeugenden Rückenden 123c und einem ereigniserzeugenden Rückende 123b genutzt wird, um den gewünschten Zielausgabe-Datensatz oder Zielaktionen auszugeben. Ein ereigniserzeugendes Rückende 123b erzeugt Zielaktionen, die zusätzliche Funktionalität für das System liefern, beispielsweise das Laden eines Schnittstellen-Verwaltungsorts mit Schnittstellen-Definitionen in einem IDL-Datensatz. Ein codeerzeugendes Rückende 123 erzeugt tatsächliche Code- Datensätze, wie diese oben beschrieben wurde, in einer spezifizierten Sprache, beispielsweise C, C++ oder dergleichen. In alternativen Ausführungsformen können keine oder mehr Beispiele dieser verschiedenen Arten von Rückenden 123a-c genutzt werden.
- Die Rückenden 123 sind nicht direkt mit dem generischen Rückende 203 integriert, können jedoch während der Ausführung des Compilers 109 durch den Prozessor 115 selektiv geladen werden. Darüber hinaus kann ein Nutzer des Systems 100, beispielsweise ein Anwendungsentwickler, andere Rückenden konstruieren und diese direkt mit dem Compiler 109 nutzen, ohne daß der Compiler 109 selbst neu erzeugt werden muß.
- Das generische Rückende 203 umfaßt Operationen zum Manipulieren des Pseudo- Syntaxbaums 300. Diese Operationen umfassen eine Nachschlageoperation 207, die ein Rückende 123 mit null oder mehr Rückende-Knoten 509 anderer Rückende-Bäume 500 liefert, die an einen spezifizierten Knoten 309 des Pseudo-Syntaxbaums 300 angehängt sind. Das generische Rückende 203 umfaßt weiterhin vorzugsweise eine Anhängoperation 205. Die Anhängoperation 205 hängt einen spezifizierten Rückende-Knoten 509 an einen oder mehrere AST-Knoten 309 an. Die Rückenden 123 können diese Operationen des generischen Rückendes 203 während des Verarbeitens des Pseudo-Syntaxbaums 300 aufrufen. Die Rückenden 123 umfassen weiterhin spezifische Operationen, die von dem generischen Rückende 203 aufgehoben werden können. Eine Additionsoperation 209 eines Rückendes 123 addiert auf Basis eines spezifizierten Knotens 309 in dem Pseudo-Syntaxbaum 300 null oder mehr Knoten 509 zu einem Rückende-Baum 500. Eine Erzeugungsoperation 211 eines Rückendes 123 analysiert den Rückende-Baum 500, der mit dem Rückende 123 verbunden ist, und erzeugt die Zielausgabe, bei der es sich um Datensätze oder Aktionen handelt. Die Erzeugungsoperation 211 eines ereigniserzeugenden Rückendes 123 erzeugt speziell ausgewählte Zielereignisse oder -aktionen. Die Erzeugungsoperation 211 eines codeerzeugenden Rückendes 123 erzeugt Zielcode-Datensätze. Diese Operationen des generischen Rückendes 203 und der einzelnen Rückenden 123 werden im nächsten Abschnitt detaillierter beschrieben.
- Fig. 4a zeigt ein Flußdiagramm des Betriebs des Compilers 109 zum Erzeugen der Zielausgabe-Datensätze und -Aktionen mit Hilfe des dynamischen Ladens und Betreibens der einzelnen Rückenden 123. Der Compiler 309 wird mit einer Anzahl von Argumenten aufgerufen 401, die die zu verarbeitenden Quellcode-Datensätze, die zum Verarbeiten zu nutzenden Rückenden 123 und jegliche andere relevanten Operationen spezifizieren. Das Frontende 201 erzeugt dann 403 den Hauptknoten eines Pseudo-Syntaxbaums für den Quellcode-Datensatz oder die Quellcode-Datensätze. Fig. 3a zeigt den Pseudo-Syntaxbaum 300 nur mit seinem Haupt-AST-Knoten 301.
- Das generische Rückende 203 lädt 405 die Rückenden 123, die in den Befehlszeile- Argumenten spezifiziert sind. Weil jedes Rückende 123 geladen wird 405, erzeugt 406 jedes Rückende einen Hauptrückende-Knoten 501 für einen Rückende-Baum 500, der mit dem Rückende 123 in Verbindung steht. Das Rückende 123 hängt dann 408 seinen Hauptrückende-Knoten 501 an den Haupt-AST-Knoten 301 an. Die Hauptrückende-Knoten 501 werden gemäß einem Prioritätswert für jedes Rückende 123 angehängt 408, wie dies unten beschrieben wird. Dieses kann das Einfügen eines Hauptrückende-Knotens 501 vor anderen vorher angehängten Hauptrückende-Knoten 501 umfassen. Fig. 3b zeigt den Pseudo-Syntaxbaum 300 nach dem Anhängen von vier Hauptrückende-Knoten 501. Die Hauptrückende-Knoten 501 sind als A1 bis D1 bezeichnet.
- Das Frontende 201 liest dann 407 die Quellcode-Datensätze und besetzt 409 den Pseudo- Syntaxbaum 300 in herkömmlicher Art und Weise, was die Pseudo-Struktur des Quellcode- Datensatzes und jeglicher eingeschlossener Datensätze repräsentiert. Wenn in dem Quellcode- Datensatz ein Fehler festgestellt oder während der Baumbesetzung erzeugt wird, endet 411 der Compiler 109. Fig. 3c zeigt den Pseudo-Syntaxbaum 300 nach dem Besetzen 409.
- Fig. 3c zeigt vier Hauptrückende-Knoten 501 für vier Rückenden 123 die in Verbindung mit dem generischen Rückende 203 arbeiten. Diese Hauptrückende-Knoten 501 können für ein oder mehrere der folgenden Rückenden ausgebildet sein: ein Kommentar-Rückende 123a zum Erzeugen von Datentyp-Information, die von den Rückenden 123 genutzt wird, ein codeerzeugendes Rückende 123c zum Erzeugen von Zielcode-Datensätzen, beispielsweise x.hh oder xtypes.hh-Code-Datensätzen, oder ein ereigniserzeugendes Rückende 123b, beispielsweise zum Laden eines Schnittstellen-Verwaltungsorts mit einer Schnittstellen-Definition aus dem Quellcode-Datensatz.
- Wie oben beschrieben, umfaßt das generische Rückende 203 eine Anhängoperation 205, die einen Rückende-Knoten 509 an einen speziellen AST-Knoten 309 anhängt, der als ein Eingabeparameter zu der Anhängoperation spezifiziert ist. Die Anhängoperation 205 hat zwei logische, aber nicht notwendigerweise tatsächliche Parameter. Der erste Parameter spezifiziert einen AST-Knoten 309 in dem Pseudo-Syntaxbaum 300, an welchen ein Rückende-Knoten 509 angehängt wird, der in dem zweiten Parameter spezifiziert ist. In einer objektorientierten Ausführungsform wird die Anhängoperation von jedem AST-Knoten 309 umfaßt, so daß für einen gegebenen AST-Knoten 309 die Anhängoperation (in C++) als ast_node→ attach (back_end_node) aufgerufen wird, wobei die Knoten mit Zeigern spezifiziert werden. Andere äquivalente Notationen und Datentypen können in anderen objektorientierten Sprachen oder prozedurorientierten Sprachen genutzt werden. In einer prozedurorientierten Ausführungsform ist die Anhängoperation von dem prozedurorientierten Code des generischen Rückendes 203 umfaßt und würde die Parameter an die Operation direkt spezifizieren. In jeder Ausführungsform wird die Anhängoperation 205 von dem Prozessor 115 während der Ausführung des Compilers 109 und des generischen Rückendes 203 ausgeführt.
- Die spezielle Reihenfolgen, in welcher das generische Rückende 203 die Rückende-Knoten 509 anhängt, einschließlich der Reihenfolge, in welcher die Hauptrückende-Knoten 501 angehängt werden 408, kann gesteuert werden, um die Rückende-Verarbeitung des Pseudo- Syntaxbaums 300 zu verbessern. In vielen Fällen teilen sich verschiedene Rückenden 123 zugrundeliegende Datentyp-Information oder andere Information, die zur Produktion von deren einzelnen Rückende-Bäumen nützlich ist. Beispielsweise teilen sich codeerzeugende Rückenden 123c für C und C++ gemeinsamen Code zum Bestimmen der Größen von Datentypen in C oder C++ oder deren Typcodes. Dementsprechend ist es wünschenswert, Rückende-Knoten 509 zu haben, die solche gemeinsame Information repräsentieren, die in den Rückende-Bäumen 500 vor dem Bilden oder dem Hinzufügen anderer Rückende-Knoten 509 verfügbar ist, die von solchen Rückende-Knoten oder deren gemeinsamer Information abhängen oder hierauf verweisen.
- Bei einer bevorzugten Ausführungsform erfüllt das generische Rückende 203 diesen Bedarf mittels des Anforderns der Rückende-Knoten 509, die jedem AST-Knoten 309 gemäß einem Prioritätsniveau des Rückendes 123, welches mit jedem Rückende-Knoten 509 verbunden ist, angehängt sind. Bei dieser bevorzugte Ausführungsform hängt die Anhängoperation 205 einen spezifizierten Rückende-Knoten 509 gemäß einem Prioritätswert des Rückendes 123 an, welches mit dem Rückende-Knoten 509 verbunden ist. Das Prioritätsniveau der Rückenden 123 wird vorzugsweise mit Hilfe einer Erzeuger-Verbraucher-Beziehung zwischen den verschiedenen in dem System genutzten Rückenden 123 bestimmt. Erzeuger-Rückenden, beispielsweise ein Kommentar-Rückende 123a, haben eine höhere Priorität als Verbraucher- Rückenden, beispielsweise ein codeerzeugendes Rückende 123c oder ein ereigniserzeugendes Rückende 123b. Die spezielle Prioritätsordnung irgendeines tatsächlichen Rückendes 123 hängt von den anderen in dem System 100 genutzten Rückenden 123 ab. Der Entwickler des Compilers kann das Prioritätsniveau für jedes Rückende 123 spezifizieren. Darüber hinaus kann die Priorität zwischen Rückenden 123 eines vorgegebenen Typs ausgebildet werden. In alternativen Ausführungsformen können andere als die Erzeuger-Verbraucher-Beziehungen als Prioritätsschemata angewendet werden, um ein Prioritätsniveau für jedes Rückende 123 zu bestimmen.
- Dementsprechend werden die Hauptrückende-Knoten 501 an den Haupt-AST-Knoten 301 durch das generische Rückende 203 gemäß dem Prioritätsniveau der jeweiligen Rückenden 123 angehängt 408.
- Wenn der Pseudo-Syntaxbaum 300 besetzt ist 409, ruft das generische Rückende 203 eine Do_Add-Operation auf den Haupt-AST-Knoten 301 auf. Die Do_Add-Operation koordiniert die einzelnen Rückenden 123 zum Bilden ihrer Rückende-Bäume 500, wobei jedes Rückende 123 ausgewählte AST-Knoten 309 verarbeitet. Die Do_Add-Operation ruft jeden Rückende- Knoten 509 auf, der an jeden AST-Knoten 309 angehängt ist, so daß eine Additionsoperation 209 auf jedem Kind-AST-Knoten 303 aufgerufen wird. Die Additionsoperation 209 addiert einen Rückende-Knoten 502 zu dem Rückende-Baum 500, wobei der Quell-Token, der durch den AST-Knoten 309 repräsentiert wird, für die Funktionalität des Rückendes 123 relevant ist. In einigen Fällen fügt die Additionsoperation 209 dem Rückende-Baum 500 keinen Rückende-Knoten 503 hinzu, weil der zugrundeliegende AST-Knoten 309 für die Zielausgabe des Rückendes 123 nicht relevant ist. Die Do_Add-Operation ist vorzugsweise rekursiv, so daß beim Beenden von Do_Add auf dem Haupt-AST-Knoten 301 der gesamte Pseudo- Syntaxbaum 300 durchquert wurde, und jeder Rückende-Baum 500 repräsentiert die Ausgabe des jeweiligen Rückendes 123. Das generische Rückende 201 ruft dann 415 eine Do_Produce-Operation auf, welche ihrerseits die Erzeugungsoperation 211 jedes Rückendes 123 aufruft, um die relevanten Zielausgabe-Datensätze oder -Aktionen für das Rückende 123 zu erzeugen.
- Fig. 4b zeigt eine Ausführungsform der Logik der Do_Add-Operation. Wenn die Do_Add- Operation aufgerufen wird, wird ein hier als "X" spezifizierter AST-Knoten 309 als der Anfangsparameter eingeführt. Ein Paar verschachtelter Schleifen steuert die Verarbeitung in Do_Add. Die äußere Schleife iteriert 419 über jeden Kind-AST-Knoten Z des AST-Knotens X, und die innere Schleife iteriert 421 über jeden Rückende-Knoten Y, der an den AST- Knoten X angehängt ist. Dieses ermöglicht es jedem solchen Rückende-Knoten, jeden Kind- AST-Knoten Z zu verarbeiten. Diese Beziehungen der verschiedenen Knoten sind in Fig. 4d gezeigt. In Fig. 4d ist ein Teil eines Pseudo-Syntaxbaums 300 mit einem AST-Knoten 309, hier Knoten X, und irgendeiner Anzahl von Kinder-AST-Knoten 303 dargestellt, hier Knoten Z1 bis Zn. An den Knoten X ist irgendeine Anzahl von Rückende-Knoten 509 angehängt, die hier als Knoten Y1 bis Yn bezeichnet sind.
- Im Kern der Schleifen wird die Additionsoperation 209 eines Rückende-Knotens Y an den Kind-AST-Knoten Z aufgerufen 423. In dem Beispiel nach Fig. 4d würde die Additionsoperation 209 von Y1 auf Z1, und dann von Y2 auf Z1 usw. bis Yn aufgerufen. Die Additionsoperation 209 bestimmt, ob der Kind-AST-Knoten Z für den Rückende-Baum 500 des Rückendes 123 relevant ist. Diese Bestimmung kann auf den Datentyp des Kind-AST-Knotens Z oder seines Eltern-AST-Knotens X oder allgemein auf der gewünschten Struktur des Rückende-Baums 500 basieren. Beispielsweise würde die Additionsoperation 209 eines Rückende- Knotens 509 für ein codeerzeugendes Rückende 123c nicht einen Rückende-Knoten für einen AST-Knoten Z hinzufügen, der einen Token von einem umfaßten Quellcode-Datensatz repräsentiert. Wenn der Kind-AST-Knoten Z für die Funktionalität des Rückendes 123 relevant ist, dann werden ein oder mehrere neue Rückende-Knoten 509 erzeugt und zu dem Rückende- Baum 500 hinzugefügt. Darüber hinaus kann die Additionsoperation 209 die Anhängoperation 205 für irgendeine Anzahl von AST-Knoten 309 aufrufen, um die neu erzeugten Rückende-Knoten 509 an solche AST-Knoten 309 anzuhängen.
- Wie angezeigt, umfaßt die Additionsoperation 209 zwei logische, aber nicht notwendigerweise wirkliche Parameter. Ein erster Parameter spezifiziert den Rückende-Knoten Y in dem Rückende-Baum 500, der mit dem AST-Knoten X in Verbindung steht, auf dem die Additionsoperation 209 ausgeführt wird, und ein zweiter Parameter spezifiziert einen Kind-AST- Knoten Z des AST-Knotens X. In einer objektorientierten Umgebung ist die Additionsoperation 209 von jedem Knoten des Rückende-Baums 500 umfaßt. Beispielsweise ist der Aufruf in C++ Y→add(Z), wobei "Y" und "Z" Zeiger auf Knoten in den jeweiligen Bäumen sind. In einer prozedurorientierten Ausführungsform ist die Additionsoperation 209 Teil des prozedurorientierten Codes für jedes Rückende 123. In jedem Fall steuert jedes Rückende 123 die Funktionalität der Additionsoperation 209. Bei einer bevorzugten Ausführungsform existiert eine Additionsoperation 209 für jeden Datentyp, der in der Quellcode-Programmiersprache verfügbar ist. Beispielsweise existieren für einen Compiler 109, der auf IDL-Quellcode- Datensätzen arbeitet, individuelle Additionsoperationen zum Addieren von Rückende- Knoten, die Strukturgramme, Schnittstellen, Module, Konstanten, Ausnahmen, Typdefinitionen oder dergleichen für die individuellen Rückende-Bäume 500 repräsentieren. Jeder dieser speziellen Additionsoperationen 209 ist zum Analysieren Ihres zugehörigen Datentyps und zum Extrahieren von Information hiervon optimiert.
- Wenn die Additionsoperation 209 endet, bestimmt 425 das generische Ende 203, ob irgendwelche verbleibenden Rückende-Knoten Y für den AST-Knoten X existieren. Wenn dieses der Fall ist, wird die Verarbeitung fortgesetzt, bis alle solche angehängten Rückende-Knoten Y an dem Kind-AST-Knoten Z des AST-Knotens X verarbeitet sind. Das generische Rückende 203 ruft dann rekursiv 427 Do_Add an dem Kind-AST-Knoten Z des laufenden AST- Knotens X auf. Dieser rekursive Aufruf durchläuft den Pseudo-Syntaxbaum 300 abwärts bis zur Beendigung, wobei Do_Add für die Kinder des AST-Knotens Z wieder aufgerufen werden. Wenn dieser rekursive Aufruf beendet ist, bestimmt 429 das generische Rückende 203, ob irgendwelche verbleibende Kind-AST-Knoten Z des AST-Knotens X existieren. Wenn dieses der Fall ist, setzt sich die äußere Schleife fort 419. Dieses führt dazu, daß alle Kinder des AST-Knotens X wie beschrieben verarbeitet werden. In einer alternativen Ausführungsform können die innere und die äußere Schleife mit einer Einstellung des Zeitablaufs des rekursiven Aufrufs für Do_Add umgelagert werden.
- Fig. 3d zeigt das Ergebnis des Aufrufens 413 von Do_Add für den Haupt-AST-Knoten 301 des Pseudo-Syntaxbaums 300 in Fig. 3c. Zunächst wird Do_Add in T1 aufgerufen, so daß für jedes seiner Kinder, T2 und T3, die Hauptrückende-Knoten A1, B1, C1 und D1 in der Reihenfolge aufgerufen werden 421. Für jeden Kind-AST-Knoten T2 und T3 rekursiert Do_Add den Zweig abwärts, wobei die Additionsoperation 209 jedes Rückende-Knotens aufgerufen wird, der hier angehängt ist. Wenn dieses abgeschlossen ist, existieren vier Rückende-Bäume 500a-500d, deren Rückende-Knoten 503 jeweils an entsprechende AST-Knoten 309 angehängt sind. Fig. 3d zeigt auch die Variabilität der Rückende-Bäume 500. Der Rückende-Baum 500a ist eine Nachbildung des Pseudo-Syntaxbaums 300, wobei jedoch Baum 500b nur den Hauptrückende-Knoten 501 enthält, weil alle Informationen, die das Rückende 123 benötigt, bereits in geeigneter Form in dem Pseudo-Syntaxbaum 300 verfügbar sind. In ähnlicher Weise nutzt der Rückende-Baum 500c nur einen Zweig des Pseudo-Syntaxbaums 300, und die Rückende-Knoten 509 des Baums 500c können neue Informationen enthalten, die für das Rückende 123 zum Erzeugen seiner Zielausgabe nützlich sind. Der Rückende- Baum 500d zeigt eine mögliche Restrukturierung des Rückende-Baums, wobei der Knoten D6 von dem Hauptrückende-Knoten Dl abhängt, auch wenn der AST-Knoten T6 von dem AST-Knoten T5 in dem Pseudo-Syntaxbaum 300 abhängt.
- Gemäß Fig. 4a ruft 415 das generische Rückende 203 den Do_Produce-Prozeß nach dem Beenden des Do_Add-Prozesses auf, um das tatsächliche Erzeugen des Zielcodes und der Zielaktionen der Rückenden 123 zu initiieren. Fig. 4c zeigt die Logik von Do_Produce. Nach dem Aufruf iteriert 433 das generische Rückende 203 über jeden Hauptrückende- Knoten X, der an den Haupt-AST-Knoten 301 angehängt ist. In diesem Knoten ruft das generische Rückende 203 ein Erzeugungsverfahren auf, welches dann den speziellen Rückende- Baum 500 in Abhängigkeit von dem Hauptrückende-Knoten X quert, so daß die Zielcode- Datensätze oder -Aktionen in Übereinstimmung mit den Spezifikationen des Compiler- Designers erzeugt werden. Wenn alle Hauptrückende-Knoten verbraucht sind 417, endet 437 Do_Produce.
- Während der tatsächlichen Ausführung eines einzelnen Rückendes 123 kann ein weiterer Bedarf am Lokalisieren von Information bestehen, die von Rückende-Knoten 509 von Rückenden 123 mit höherer Priorität geliefert wird. Typischerweise benötigt ein Rückende 123 Information von einem oder mehreren Rückende-Knoten 509, wenn ein anderer AST-Knoten 309 oder ein Rückende-Knoten 509 verarbeitet werden. Es kann sein, daß solche Knoten nicht in dem selben Rückende-Baum 500 wie der gegenwärtig aktive Knoten sind. Um diese Art von Informationszugriff zur Verfügung zu stellen, wird mit jedem Rückende 123 ein Familienidentifikationswert geliefert. Der Familienidentifikationswert ist ein Attribut, das allen Rückende-Knoten gemeinsam ist, die mit einem vorgegebenen Rückende 123 in Verbindung stehen, und alle Knoten in den einzelnen Rückende-Bäumen 500 identifizieren hierdurch den Rückende-Knoten 509 als zu diesem speziellen Rückende 123 gehörig.
- Das generische Rückende 203 umfaßt hierdurch eine Nachschlageoperation 207, die als Parameter einen AST-Knoten 309 und einen Familienidentifikationswert nimmt. Das generische Rückende 203 gibt ein oder mehrere Rückende-Knoten 509 mit dem spezifizierten Familienidentifikationswert zurück, die an den spezifizierten AST-Knoten 309 angehängt sind. Aus diesem Knoten oder diesen Knoten kann das anfordernde Rückende 123 die benötigte Information extrahieren, beispielsweise Datentypgrößen, Typcodes oder dergleichen. Fig. 2 zeigt den Datenfluß der Nachschlageoperation 207. In Fig. 3d kann das Rückende 123, welches mit dem Rückende-Baum 500d in Verbindung steht, beispielsweise Information von dem Rückende-Knoten A3 benötigen, um in der Lage zu sein, den Rückende-Knoten D3 zu erzeugen und an den AST-Knoten T3 anzuhängen. Dementsprechend würde das mit dem Knoten D1 in Verbindung stehende Rückende 123, die Nachschlageoperation 207, die in dem AST- Knoten T3 vorbei geht, und einen Familienidentifikationswert für das Rückende 123 aufrufen, welches mit dem Rückende-Baum 500a in Verbindung steht. Das generische Rückende 203 würde dann den Rückende-Knoten A3 zurückgeben, aus dem das Rückende 123 die benötigte Information zum Erzeugen des Rückende-Knotens D3 extrahiert.
Claims (17)
1. Vorrichtung zum Kompilieren eines Quellcode-Datensatzes und zum Erzeugen variabler
Zielausgaben hiervon mit:
einem Frontende (201), daß den Quellcode-Datensatz akzeptiert und hieraus einen
Pseudo-Syntaxbaum (300) erzeugt, der die syntaktische Struktur des Quellcode-Datensatzes
repräsentiert, wobei der Pseudo-Syntaxbaum (300) wenigstens einen Pseudo-Syntaxbaum-
Knoten aufweist;
wenigstens einem Rückende (123), daß aus dem Pseudo-Synatxbaum (300) einen
zugehörigen Rückende-Baum (500) und aus dem Rückende-Baum (500) eine Zielausgabe
erzeugt, wobei der Rückende-Baum (500) wenigstens einen Rückende-Baumknoten
umfasst;
einem generischen Rückende (203), daß das wenigstens eine Rückende (123) zum
Erzeugen des zugehörigen Rückende-Baums (500) steuert, so daß jedes Rückende (123)
unabhängig von dem generischen Rückende (203) ist und von der Vorrichtung während der
Ausführung dynamisch geladen wird;
wobei das generische Rückende in der Lage ist, mit einer Anzahl unabhängiger
Rückenden zu arbeiten, die zur Laufzeit geladen werden, wodurch jedes Rückende seinen eigenen
Rückende-Baum erzeugt und wodurch sich mittels des generischen Rückendes ein Knoten
in einem Rückende-Baum auf einen Knoten in einem anderen Rückende beziehen kann.
2. Vorrichtung nach Anspruch 1, dadurch gekennzeichnet, daß das generische
Rückende (203) in einer ausgewählten Reihenfolge jedes Rückende (123) aufruft, welches mit
jedem Rückende-Knoten in Verbindung steht, der jedem Pseudo-Syntaxbaum-Knoten
angehängt ist.
3. Vorrichtung nach Anspruch 1 oder 2, dadurch gekennzeichnet, daß jedes
Rückende (123) eine Additionsoperation (209) umfasst, die von dem generischen Rückende (203)
aufgerufen werden kann und keinen oder mindestens einen Rückende-Knoten zu einem
Rückende-Baum (500) addiert.
4. Vorrichtung nach Anspruch 3 dadurch gekennzeichnet, daß das generische
Rückende (203) eine Anhängoperation (205) umfasst, die von einem Rückende (123) aufgerufen
werden kann und einem Rückende-Knoten eines Rückende-Baums (500) wenigstens
einen Knoten des Pseudo-Syntaxbaums (300) anhängt.
5. Vorrichtung nach Anspruch 4, dadurch gekennzeichnet, daß jeder Rückende-
Knoten (123) an den Pseudo-Synatxbaum (300) gemäß eines Prioritätswerts angehängt ist,
der einem Prioritätswert des Rückendes (123) entspricht, welches mit dem Rückende-
Knoten verbunden ist.
6. Vorrichtung nach Anspruch 5, dadurch gekennzeichnet, daß ausgewählte
Rückende-Knoten, die mit einem Rückende (123) in Verbindung stehen, dem Pseudo-
Synatxbaum (300) in einer vorbestimmten Reihenfolge angehängt werden.
7. Vorrichtung nach einem der Ansprüche 3 bis 6, dadurch gekennzeichnet, daß jeder
Rückende-Knoten ein Objekt ist und daß die Additionsoperation (209) ein Verfahren des
Objekts ist.
8. Vorrichtung nach einem der Ansprüche 1 bis 7, gekennzeichnet durch
eine Speichereinrichtung (103), die den Pseudo-Syntaxbaum (300), den wenigstens einen
Rückende-Baum (500), das generische Rückende (203) und das wenigstens eine
Rückende (123) speichert; und
eine Verarbeitungseinrichtung (115), die das generische Rückende (203) und das
wenigstens eine Rückende (123) ausführt, um aus dem wenigstens einen Rückende (123)
wenigstens eine Zielausgabe zu bilden.
9. Vorrichtung nach einem der Ansprüche 1 bis 8, dadurch gekennzeichnet, daß jedes
Rückende (123) und jeder Rückende-Knoten, der mit dem Rückende (123) in Verbindung
steht, einen Familienidentifikationswert aufweist, wobei das generische Rückende (203)
eine Nachschlageoperation (207) umfasst, die keinen oder wenigstens einen Knoten von
wenigstens einem Rückende-Baum (500) zurückgibt, welcher einen
Familienidentifikationswert aufweist und an einen Knoten des Pseudo-Syntaxbaums (300) angehängt ist, als
Reaktion auf eine Anforderung von einem Rückende (123), welches den
Familienidentifikationswert und den Knoten des Pseudo-Syntaxbaums (300) spezifiziert.
10. Verfahren zum Kompilieren eines Quellcode-Datensatzes und zum Erzeugen variabler
Zielausgaben hieraus, wobei das Verfahren die folgenden Schritte umfasst:
Liefern eines Quellcode-Datensatzes;
Ausführen eines Kompilierers (109), welcher ein Frontende (201) und ein generisches
Rückende (203) umfasst;
Laden einer Anzahl von Rückenden (123) zum Ausführen mit dem generischen Rückende
(203);
Erzeugen eines Pseudo-Syntaxbaums (300) aus dem Quellcode mit dem Frontende (201),
wobei der Pseudo-Syntaxbaum (300) einen Hauptknoten und wenigstens einen
Kindknoten aufweist;
wobei jedes Rückende (123) der Anzahl einen zugehörigen Rückende-Baum (500) aus
dem Pseudo-Syntaxbaum (300) und eine Zielausgabe aus dem Rückende-Baum (500)
erzeugt, wobei der Rückende-Baum (500) wenigstens einen Rückende-Baumknoten
aufweist; und
wobei das generische Rückende (203) jedes Rückende (123) der Anzahl steuert, um den
zugehörigen Rückende-Baum (500) so zu erzeugen, daß jedes Rückende (123) von dem
generischen Rückende (203) unabhängig ist und von der Vorrichtung während der
Ausführung dynamisch geladen wird;
wodurch jedes Rückende seinen eigenen Rückende-Baum erzeugt und mit Hilfe des
generischen Rückendes wenigstens ein Knoten in wenigstens einem Rückende-Baum sich auf
einen Knoten in einem anderen Rückende bezieht.
11. Verfahren nach Anspruch 10, dadurch gekennzeichnet, daß der Schritt zum
Erzeugen eines Rückende-Baums (500) mittels des selektiven Aufrufens jedes Rückendes (123)
in ausgewählten Knoten des Pseudo-Syntaxbaum (300) ausgeführt wird.
12. Verfahren nach Anspruch 10 oder 11, wobei das Verfahren weiterhin die folgenden
Schritte aufweist:
Anhängen eines Rückende-Knotens wenigstens eines Rückende-Baums (500) an den
Hauptknoten des Pseudo-Syntaxbaums (300);
Auswählen von Knoten des Pseudo-Syntaxbaums (300) und Hinzufügen von keinem oder
wenigstens einem Rückende-Knoten, welcher syntaktische Information repräsentiert, die
von dem Pseudo-Syntaxbaum (300) abgeleitet wurde, zu ausgewählten Rückende-Bäumen
(500) für jeden ausgewählten Knoten; und
Anhängen ausgewählter Rückende-Knoten an ausgewählte Knoten des Pseudo-
Syntaxbaums (300).
13. Verfahren nach Anspruch 12, dadurch gekennzeichnet, daß der Auswahlschritt für
jeden Rückende-Knoten, der an jedem Knoten des Pseudo-Syntaxbaums (300) angehängt
ist, wiederholt wird.
14. Verfahren nach Anspruch 12, dadurch gekennzeichnet, daß jeder Schritt zum
Anhängen einen Schritt zum Anhängen des Rückende-Knotens an den Pseudo-Syntaxbaum
(300) gemäß einem Prioritätswert umfasst, der einem Prioritätswert des Rückendes (123)
entspricht, welches mit dem Rückende-Knoten in Verbindung steht.
15. Verfahren nach Anspruch 14, dadurch gekennzeichnet, daß ausgewählte
Rückende-Knoten, die mit einem Rückende (123) in Verbindung stehen, an den Pseudo-
Syntaxbaum (300) in einer vorbestimmten Reihenfolge angehängt werden.
16. Verfahren nach einem der Ansprüche 10 bis 15, dadurch gekennzeichnet, daß der
Schritt zum Auswählen der Knoten des Pseudo-Syntaxbaums (300) rekursiv ausgeführt
wird.
17. Verfahren nach einem der Ansprüche 10 bis 16, dadurch gekennzeichnet, daß jedes
Rückende (123) und jeder Rückende-Knoten, der hiermit verbunden ist, einen
Familienidentifikationswert aufweist, daß eine Anforderung empfangen wird, die einen
Familienidentifikationswert und einen Knoten des Pseudo-Syntaxbaums (300) spezifiziert, und daß
kein oder wenigstens ein Rückende-Knoten von wenigstens einem Rückende-Baum (500)
zurückgegeben wird, welcher den selben Familienidentifikationswert aufweist und an den
Knoten des Pseudo-Syntaxbaums (300) angehängt ist.
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US41254695A | 1995-03-29 | 1995-03-29 |
Publications (2)
Publication Number | Publication Date |
---|---|
DE69625948D1 DE69625948D1 (de) | 2003-03-06 |
DE69625948T2 true DE69625948T2 (de) | 2003-11-13 |
Family
ID=23633438
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
DE69625948T Expired - Fee Related DE69625948T2 (de) | 1995-03-29 | 1996-03-14 | Kompiler mit generischem Front-End und dynamisch ladbaren Back-Ends |
Country Status (5)
Country | Link |
---|---|
US (1) | US5812851A (de) |
EP (1) | EP0735467B1 (de) |
JP (1) | JP3315857B2 (de) |
CA (1) | CA2171570C (de) |
DE (1) | DE69625948T2 (de) |
Families Citing this family (54)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
AU5657298A (en) * | 1996-11-27 | 1998-06-22 | Sony Europa B.V. | Data communication method using typed continuation |
US6059839A (en) * | 1997-01-09 | 2000-05-09 | Silicon Graphics, Inc. | Apparatus and method for compiler identification of address data |
GB2327786B (en) * | 1997-07-31 | 2002-04-03 | Ibm | Method and apparatus for strategic compilation of source programs into two or more target languages |
US20050021085A1 (en) * | 1998-05-11 | 2005-01-27 | Surgical Connections, Inc. | Surgical stabilizer devices and methods |
US6594783B1 (en) * | 1999-08-27 | 2003-07-15 | Hewlett-Packard Development Company, L.P. | Code verification by tree reconstruction |
US7168069B1 (en) | 2000-07-12 | 2007-01-23 | Stmicroelectronics, Inc. | Dynamic generation of multimedia code for image processing |
FR2812479B1 (fr) * | 2000-07-28 | 2003-01-31 | Airsys Atm S A | Generateur universel de code informatique |
US6993744B2 (en) * | 2000-12-19 | 2006-01-31 | Tajen Corporation | Method for enabling a compiler or interpreter to use identifiers found at run time in a map container object in a manner similar or identical to identifiers declared at compile time |
US7400668B2 (en) | 2001-03-22 | 2008-07-15 | Qst Holdings, Llc | Method and system for implementing a system acquisition function for use with a communication device |
US6577678B2 (en) | 2001-05-08 | 2003-06-10 | Quicksilver Technology | Method and system for reconfigurable channel coding |
US7215701B2 (en) | 2001-12-12 | 2007-05-08 | Sharad Sambhwani | Low I/O bandwidth method and system for implementing detection and identification of scrambling codes |
US20030108012A1 (en) * | 2001-12-12 | 2003-06-12 | Quicksilver Technology, Inc. | Method and system for detecting and identifying scrambling codes |
US7328414B1 (en) | 2003-05-13 | 2008-02-05 | Qst Holdings, Llc | Method and system for creating and programming an adaptive computing engine |
US8108656B2 (en) | 2002-08-29 | 2012-01-31 | Qst Holdings, Llc | Task definition for specifying resource requirements |
US20040068716A1 (en) * | 2002-10-04 | 2004-04-08 | Quicksilver Technology, Inc. | Retargetable compiler for multiple and different hardware platforms |
US8276135B2 (en) * | 2002-11-07 | 2012-09-25 | Qst Holdings Llc | Profiling of software and circuit designs utilizing data operation analyses |
US7051322B2 (en) * | 2002-12-06 | 2006-05-23 | @Stake, Inc. | Software analysis framework |
US7219338B2 (en) * | 2003-03-25 | 2007-05-15 | Microsoft Corporation | Multi-language compilation |
US7873992B1 (en) | 2003-12-04 | 2011-01-18 | Avaya Inc. | Dynamic system of autonomous parsers for interpreting arbitrary telecommunication equipment streams |
US7552137B2 (en) * | 2004-12-22 | 2009-06-23 | International Business Machines Corporation | Method for generating a choose tree for a range partitioned database table |
US7958493B2 (en) * | 2006-01-20 | 2011-06-07 | Kevin Edward Lindsey | Type inference system and method |
US20080141230A1 (en) * | 2006-12-06 | 2008-06-12 | Microsoft Corporation | Scope-Constrained Specification Of Features In A Programming Language |
US8145474B1 (en) | 2006-12-22 | 2012-03-27 | Avaya Inc. | Computer mediated natural language based communication augmented by arbitrary and flexibly assigned personality classification systems |
US20080182021A1 (en) * | 2007-01-31 | 2008-07-31 | Simka Harsono S | Continuous ultra-thin copper film formed using a low thermal budget |
US8850414B2 (en) * | 2007-02-02 | 2014-09-30 | Microsoft Corporation | Direct access of language metadata |
US8613080B2 (en) | 2007-02-16 | 2013-12-17 | Veracode, Inc. | Assessment and analysis of software security flaws in virtual machines |
US8914774B1 (en) | 2007-11-15 | 2014-12-16 | Appcelerator, Inc. | System and method for tagging code to determine where the code runs |
US8954989B1 (en) | 2007-11-19 | 2015-02-10 | Appcelerator, Inc. | Flexible, event-driven JavaScript server architecture |
US8260845B1 (en) | 2007-11-21 | 2012-09-04 | Appcelerator, Inc. | System and method for auto-generating JavaScript proxies and meta-proxies |
US8566807B1 (en) | 2007-11-23 | 2013-10-22 | Appcelerator, Inc. | System and method for accessibility of document object model and JavaScript by other platforms |
US8719451B1 (en) | 2007-11-23 | 2014-05-06 | Appcelerator, Inc. | System and method for on-the-fly, post-processing document object model manipulation |
US8806431B1 (en) | 2007-12-03 | 2014-08-12 | Appecelerator, Inc. | Aspect oriented programming |
US8819539B1 (en) | 2007-12-03 | 2014-08-26 | Appcelerator, Inc. | On-the-fly rewriting of uniform resource locators in a web-page |
US8756579B1 (en) | 2007-12-03 | 2014-06-17 | Appcelerator, Inc. | Client-side and server-side unified validation |
US8527860B1 (en) | 2007-12-04 | 2013-09-03 | Appcelerator, Inc. | System and method for exposing the dynamic web server-side |
US8938491B1 (en) | 2007-12-04 | 2015-01-20 | Appcelerator, Inc. | System and method for secure binding of client calls and server functions |
US8285813B1 (en) | 2007-12-05 | 2012-10-09 | Appcelerator, Inc. | System and method for emulating different user agents on a server |
US8335982B1 (en) | 2007-12-05 | 2012-12-18 | Appcelerator, Inc. | System and method for binding a document object model through JavaScript callbacks |
US8639743B1 (en) | 2007-12-05 | 2014-01-28 | Appcelerator, Inc. | System and method for on-the-fly rewriting of JavaScript |
US8954869B2 (en) * | 2007-12-17 | 2015-02-10 | International Business Machines Corporation | Generating a front end graphical user interface for a plurality of text based commands |
US8291079B1 (en) | 2008-06-04 | 2012-10-16 | Appcelerator, Inc. | System and method for developing, deploying, managing and monitoring a web application in a single environment |
US8880678B1 (en) | 2008-06-05 | 2014-11-04 | Appcelerator, Inc. | System and method for managing and monitoring a web application using multiple cloud providers |
US20100037213A1 (en) * | 2008-08-07 | 2010-02-11 | Microsoft Corporation | Grammar-based generation of types and extensions |
US7596620B1 (en) | 2008-11-04 | 2009-09-29 | Aptana, Inc. | System and method for developing, deploying, managing and monitoring a web application in a single environment |
US10564944B2 (en) * | 2010-01-07 | 2020-02-18 | Microsoft Technology Licensing, Llc | Efficient immutable syntax representation with incremental change |
US9286063B2 (en) | 2012-02-22 | 2016-03-15 | Veracode, Inc. | Methods and systems for providing feedback and suggested programming methods |
US10019259B2 (en) | 2013-01-29 | 2018-07-10 | Mobilize.Net Corporation | Code transformation using extensibility libraries |
US9459862B2 (en) | 2013-01-29 | 2016-10-04 | ArtinSoft Corporation | Automated porting of application to mobile infrastructures |
US10061573B2 (en) | 2013-01-29 | 2018-08-28 | Mobilize.Net Corporation | User interfaces of application porting software platform |
US9465608B2 (en) * | 2013-03-15 | 2016-10-11 | ArtinSoft Corporation | Code separation with semantic guarantees |
US9329844B2 (en) | 2014-05-30 | 2016-05-03 | Apple Inc. | Programming system and language for application development |
US10001978B2 (en) * | 2015-11-11 | 2018-06-19 | Oracle International Corporation | Type inference optimization |
CN111338944B (zh) * | 2020-02-21 | 2023-09-08 | 北京字节跳动网络技术有限公司 | 远程过程调用rpc接口测试方法、装置、介质及设备 |
CN116149670B (zh) * | 2023-04-21 | 2023-07-11 | 湖南泛联新安信息科技有限公司 | 一种基于图的hdl编译优化方法 |
-
1996
- 1996-03-12 CA CA002171570A patent/CA2171570C/en not_active Expired - Fee Related
- 1996-03-14 EP EP96104078A patent/EP0735467B1/de not_active Expired - Lifetime
- 1996-03-14 DE DE69625948T patent/DE69625948T2/de not_active Expired - Fee Related
- 1996-03-29 JP JP07560196A patent/JP3315857B2/ja not_active Expired - Fee Related
-
1997
- 1997-03-21 US US08/822,110 patent/US5812851A/en not_active Expired - Lifetime
Also Published As
Publication number | Publication date |
---|---|
JPH08286926A (ja) | 1996-11-01 |
JP3315857B2 (ja) | 2002-08-19 |
EP0735467A3 (de) | 1997-05-02 |
EP0735467B1 (de) | 2003-01-29 |
US5812851A (en) | 1998-09-22 |
CA2171570A1 (en) | 1996-09-30 |
DE69625948D1 (de) | 2003-03-06 |
EP0735467A2 (de) | 1996-10-02 |
CA2171570C (en) | 1999-09-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
DE69625948T2 (de) | Kompiler mit generischem Front-End und dynamisch ladbaren Back-Ends | |
DE69727381T2 (de) | Verfahren zum transportieren von in einer schnittstellendefinitionssprache definierten datenstrukturen zwischen heterogenen systemen | |
DE60011479T2 (de) | Xml-roboter | |
DE69031078T2 (de) | Rechnerunterstützte softwareentwicklungseinrichtung | |
DE69518446T2 (de) | Typsicheres Rahmenwerk für dynamisch erweiterbare Objekte | |
DE69525706T2 (de) | Vorrichtung und Verfahren zum Generieren des Zielsprachcodes durch Verwendung eines objektorientierten Codegenerators | |
DE69525915T2 (de) | Verfahren und Gerät zum Erzeugen von Plattform-standardisierten, maschinenunabhängigen Code, enthaltenden Objektdateien | |
DE69130587T2 (de) | System zum Integrieren von Anwenderprogrammen in eine heterogene Netzwerkumgebung | |
DE3750515T2 (de) | Verfahren zur Zugriffssteuerung einer Datenbasis. | |
DE60126016T2 (de) | Serverseitige Kontrollobjekte zur Verarbeitung von kundenseitigen Benutzerschnittstellenelementen | |
DE69327138T2 (de) | Verfahren zur Namensgebung und zur Bindung von Objekten | |
DE69637436T2 (de) | Objektorientiertes Kommunikationssystem mit Unterstützung für mehrere entfernte Maschinentypen | |
DE69924857T2 (de) | Programm-kode-umwandlung | |
DE3856079T2 (de) | Verfahren für einen Blockdiagramm-Simulator | |
DE69521507T2 (de) | System und verfahren zur auf einem modell basierender prüfung von lokalen entwurfsregeln | |
DE202020105389U1 (de) | Front-End-Framework, Speichermedium und elektronische Vorrichtung | |
DE69731614T2 (de) | Netzübergreifende einrichtung und verfahren zur herstellung einer solchen einrichtung | |
DE69502952T2 (de) | Vorrichtung zur erzeugung von instruktionen | |
DE69226233T2 (de) | Quellenkodeanalysator | |
DE69631278T2 (de) | Entwurfssystem und -verfahren zum kombinierten Entwurf von Hardware und Software | |
DE19903633A1 (de) | Implementierung von Boolescher Erfüllbarkeit mit nichtchronologischer Rückwärtsverarbeitung in rekonfigurierbarer Hardware | |
DE69909614T2 (de) | Sich selbst manipulierende bäume verwendende rechenarchitektur | |
DE102004043788A1 (de) | Programm Generator | |
DE69226404T2 (de) | Verfahren und Gerät zum Umwandlen von abstrakten Syntaxen auf hohem Niveau in eine Zwischenform | |
DE69907714T2 (de) | Komponentbasiertes quellcodegeneratorverfahren |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
8364 | No opposition during term of opposition | ||
8339 | Ceased/non-payment of the annual fee |