-
Hintergrund
der Erfindung
-
Gebiet der Erfindung
-
Diese
Erfindung betrifft das Gebiet von Datenstruktur-Initialisierungsverfahren. Insbesondere stellt
diese Erfindung ein Verfahren, ein System und ein Computerprogrammprodukt
zum effizienten Aufrufen einer programmierten Operation bei der
ersten aktiven Verwendung einer Datenstruktur oder eines Klassenobjekts
dar. Die programmierte Operation kann ohne Begrenzung verwendet
werden, um die Datenstruktur oder statische Variablen in dem Klassenobjekt
zu initialisieren.
-
Hintergrund
-
Eine
Zentraleinheit (CPU) eines Computers ist dazu ausgelegt, Computerbefehle
auszuführen, die
Operationen an Datenwerten durchführen. Diese Datenwerte werden
im Allgemeinen in Variablen im Speicher und in den Registern der
CPU gespeichert. Die meisten Universalcomputer weisen spezialisierte Befehle
zum Zugreifen auf Variablen mit unterschiedlichen Längen auf.
Eine byteorientierte Speicherzugriffsbetriebsart greift beispielsweise
auf ein einzelnes Byte des Speichers an irgendeiner adressierbaren
Byteadresse im Speicher zu. Andere Nicht-Byte-Zugriffsbetriebsarten werden verwendet, um
auf zwei, vier, acht, sechzehn Bytes oder Variablen mit anderer
Größe zuzugreifen.
Jede der Nicht-Byte-Zugriffsbetriebsarten erfordert, dass die Variable
auf eine gerade Speicheradresse ausgerichtet wird. Der Computer
ruft einen Fehlerzustand (einen Fehler durch fehlausgerichteten
Speicherzugriff) hervor, wenn eine Nicht-Byte-Zugriffsbetriebsart auf eine ungerade
Byteadresse versucht wird. Dieser Fehlerzustand verursacht eine
Ausnahme im Computersystem und ruft eine Abfangroutine hervor.
-
Datenstrukturen
werden verwendet, um in einem Computersystem gespeicherte Informationen
zu organisieren. Programmierte Routinen in einem Prozedur-Programmierparadigma
greifen auf die Datenstrukturen zu, um Operationen in Abhängigkeit
von den Datenstrukturen durchzuführen
und/oder deren Inhalt zu modifizieren. Diese Datenstrukturen werden initialisiert,
nachdem sie zugeordnet wurden. Die Reihenfolge, in der diese Datenstrukturen
initialisiert werden, ist insbesondere dann wichtig, wenn der Anfangszustand
einer Datenstruktur vom Zustand einer anderen Datenstruktur abhängt. Ein
Fachmann wird verstehen, dass die Datenstruktur durch den Zuordnungsprozess
vorinitialisiert werden kann, um Datenfelder innerhalb der Datenstruktur
auf einen gewissen Vorgabewert (gewöhnlich Null) zu setzen. Diese Vorinitialisierung
ist von der Initialisierung, die erforderlich ist, um spezielle
Datenstrukturelemente auf anfängliche
Nicht-Vorgabewerte zu setzen, verschieden.
-
Objektorientierte
Programmier-(OOP) Sprachen kapseln die Daten eines Objekts (im Allgemeinen
im Objekt als Datenstruktur enthalten) mit zugehörigen OOP-Verfahren zum Verarbeiten
der Daten dieses Objekts ein. Gewöhnlich werden OOP-Objekte in
einem Freispeicherbereich instantiiert und basieren auf Klassen,
die auf die programmierten Verfahren für jedes OOP-Objekt Bezug nehmen.
Auf instantiierte OOP-Objekte
wird durch Zeiger zugegriffen und sie enthalten Daten (in Instanzvariablen),
die für
dieses spezielle instantiierte OOP-Objekt spezifisch sind. Konzeptionell
enthält
ein OOP-Objekt mit dem Objekt in Beziehung stehende Informationen (wie
z.B. die Anzahl von Instanzvariablen in dem Objekt), die Instanzvariablen
und Adressen von programmierten Routinen (OOP-Verfahren), die auf
den Inhalt der Instanzvariablen im Objekt zugreifen und/oder diesen
bearbeiten. Da jedoch Objekte häufig
programmierte Routinen und mit dem Objekt in Beziehung stehende
Informationen gemeinsam nutzen, werden diese gemeinsam genutzten
Informationen gewöhnlich
in eine Klasse extrahiert. Folglich enthält das instantiierte Objekt
einfach seine eigenen Instanzvariablen und einen Zeiger auf seine
Klasse.
-
Die
Erfindung gilt sowohl für
Datenstrukturen als auch OOP-Objekte
(wie z.B. Klassenobjekte).
-
Smalltalk,
Java und C++ sind Beispiele von OOP-Sprachen. Smalltalk wurde in
der Learning Research Group im Palo Alto Research Center (PARC) von
Xerox in den frühen
70-er Jahren entwickelt. C++ wurde von Bjarne Stroustrup in den
AT&T Bell Laboratories
1983 als Erweiterung von C entwickelt. Java ist eine OOP-Sprache
mit Elementen von C und C++ und umfasst stark abgestimmte Bibliotheken
für die Internetumgebung.
Es wurde bei SUN Microsystems entwickelt und 1995 ausgegeben.
-
Weitere
Informationen über
OOP-Konzepte sind in Not Just Java von Peter van der Linden, © Sun Microsystems
Press/Prentice Hall PTR Corp. Upper Saddle River, NJ, (1997), ISBN 0-13-864638-4,
Seiten 136–149,
zu finden.
-
Einige
OOP-Sprachen (wie z.B. die JAVA-Programmiersprache) ermöglichen
Klassenvariablen. Diese Klassenvariablen ermöglichen, dass jedes instantiierte
Objekt auf eine gemeinsame Instanzvariable zugreift, die von jedem
instantiierten Objekt, das von der Klasse abhängt, gemeinsam genutzt wird.
Die statischen Klassenvariablen müssen vor ihrer Verwendung durch
irgendwelche der instantiierten Objekte initialisiert werden. Die
Java-Programmiersprachenspezifikation
erfordert, dass statische Klassenvariablen bei der ersten aktiven
Verwendung der Klasse initialisiert werden. Weitere Informationen über die
Initialisierung von Java-Klassen sind in The Java" Language Specification
von Gosling, Joy und Steele, © Sun
Microsystems, Inc., Addison-Wesley, ISBN 0-201-63451-1, Seiten 223–227, zu
finden.
-
1A stellt
eine Klassenobjekt-Datenstruktur dar, auf die durch das allgemeine
Bezugszeichen 100 hingewiesen wird und die eine Datenstruktur
darstellt, die als OOP-Klassenobjekt
verwendet wird. Die Klassenobjekt-Datenstruktur 100 umfasst ein "Status"-Feld 101,
das unter anderen Informationen den Initialisierungsstatus des Klassenobjekts
enthält.
Die Klassenobjekt-Datenstruktur 100 umfasst auch ein Feld 103 "statische Klassenvariable", das verwendet wird,
um den Inhalt der statischen Klasseninstanzvariable zu speichern.
Die Klassenobjekt-Datenstruktur 100 umfasst
auch ein "Klassenverfahrenszeiger"-Feld 105,
das einen Zugriffsmechanismus auf die Verfahren der Klasse, wie
z.B. eine Matrix von Zeigern auf diese Verfahren, enthält.
-
1B stellt
einen "Datenstrukturzugriffs"-Prozess des Standes
der Technik dar, auf den durch das allgemeine Bezugszeichen 120 hingewiesen
wird und der verwendet wird, um eine Datenstruktur bei ihrer ersten
aktiven Verwendung zu initialisieren. Der Prozess 120 des
Standes der Technik beginnt an einer "Start"-Grenzstelle 121 und geht zu einer Entscheidungsprozedur 123 "Datenstruktur initialisiert" weiter, die das "Status"-Feld 101 der
Datenstruktur prüft,
um festzustellen, ob die Datenstruktur initialisiert wurde. Wenn
die Datenstruktur nicht initialisiert wurde, geht der Prozess 120 des
Standes der Technik zu einer Prozedur 125 "Datenstruktur initialisieren" weiter, die die
Initialisierung durchführt
und den Inhalt des "Status"-Feldes 101 modifiziert, um anzugeben,
dass die Datenstruktur initialisiert wurde. Sobald die Prozedur 125 "Datenstruktur initialisieren" endet oder wenn
die Entscheidungsprozedur 123 "Datenstruktur initialisiert" festgestellt hat,
dass die Datenstruktur bereits initialisiert wurde, geht der Prozess 120 des
Standes der Technik zu einer Prozedur 127 "auf Datenstruktur
zugreifen" weiter,
die eine aktive Verwendung der Datenstruktur durchführt. Der Prozess 120 des
Standes der Technik endet durch eine "Ende"-Grenzstelle 129.
-
Der
Hauptnachteil dieser Methode des Standes der Technik besteht darin,
dass jeder Zugriff auf ein Datenstrukturelement in der Datenstruktur
erfordert, dass der Computer prüft,
ob die Datenstruktur initialisiert wurde. Eine Kompilierer-Optimierungstechnologie
existiert, um redundante Prüfungen
zu optimieren, indem die Tatsache ausgenutzt wird, dass nur erfolgreiche
Prüfungen
andere Prüfungen innerhalb
einer Routine erreichen. Außerdem
kann eine rechenaufwändigere
Analyse zwischen Routinen verwendet werden, um redundante Prüfungen über Routinengrenzen
unter der Annahme, dass die Ausführungssequenz
bestimmt werden kann, zu optimieren. Diese Kompilierer-Optimierungsverfahren sind
jedoch sehr rechenaufwändig
und werden folglich häufig
nicht verwendet.
-
1C stellt
einen Prozess einer "adaptiven Optimierung" des Standes der
Technik dar, auf den mit dem allgemeinen Bezugszeichen 150 hingewiesen
wird, um den Ausführungsprogrammcode
selbst zu modifizieren, um den Zugriff auf die Datenstrukturelemente
zu optimieren. Unter Verwendung dieses Verfahrens erzeugt der Kompilierer
einen Code, um eine Zugriffsprüfroutine
anstelle von Computeroperationen aufzurufen, um direkt auf das Datenstrukturelement
zuzugreifen. Wenn jede Zugriffsprüfung angetroffen wird, wird
die zum Aufrufen der Zugriffsprüfroutine
verwendete Aufrufstelle modifiziert, um den Aufruf der Zugriffsprüfroutine
mit Befehlen zum direkten Zugreifen auf das Datenstrukturelement
zu überschreiben.
Außerdem
initialisiert die Zugriffsprüfroutine
die Datenstruktur beim ersten Mal, wenn die Zugriffsprüfroutine
an der Datenstruktur aufgerufen wird.
-
Der
Optimierungsprozess 150 beginnt an einer "Start"-Grenzstelle 151 und geht zu
einer Prozedur 153 "Zugriffsprüfroutine
aufrufen" weiter.
Die Prozedur 153 "Zugriffsprüfroutine
aufrufen" geschieht von
der Aufrufstelle an dem Punkt, an dem das Programm normalerweise
auf das Datenstrukturelement zugreifen würde. Die Zugriffsprüfroutine
wertet dann in einer Entscheidungsprozedur 155 "erster Datenstrukturzugriff" das "Status"-Feld 101 aus,
um festzustellen, ob die Klassenobjekt-Datenstruktur 100 initialisiert
wurde. Wenn die Datenstruktur nicht initialisiert wurde, führt die
Zugriffsprüfroutine
die erforderliche Initialisierung in einer Prozedur 157 "Datenstruktur initialisieren" durch. Als nächstes geht
der Optimierungsprozess 150 zu einer Prozedur 159 "Laufzeitaufrufstelle
korrigieren" weiter.
Die Prozedur 159 "Laufzeitaufrufstelle
korrigieren" modifiziert
die Computerbefehle an der Aufrufstelle, um die Aufrufbefehle für die Zugriffsprüfroutine
gegen Befehle auszutauschen, die tatsächlich auf die Datenstrukturelemente
in der Klassenobjekt-Datenstruktur 100 zugreifen, und folglich
die anschließende
Verarbeitung zu optimieren. Im Allgemeinen korrigiert die Prozedur 159 "Laufzeitaufrufstelle
korrigieren" auch
andere Aufrufstellen, die auf die Datenstruktur zugreifen, so dass
nur ein Aufruf der Prozedur 153 "Zugriffsprüfroutine aufrufen" für jede Datenstruktur
erforderlich ist.
-
Wenn
jedoch die Klassenobjekt-Datenstruktur 100 bereits initialisiert
wurde (oder wenn die Prozedur 159 "Laufzeitaufrufstelle korrigieren" endet), geht der
Optimierungsprozess 150 zu einer Prozedur 161 "auf Datenstruktur
zugreifen" (durch
die eingefügten
Befehle definiert) weiter, die auf das gewünschte Datenstrukturelement
zugreift. Dann endet der Optimierungsprozess 150 durch
eine "Ende"-Grenzstelle 163.
-
Der
Hauptnachteil bei diesem Verfahren des Standes der Technik besteht
darin, dass der ausführbare
Programmcode selbstmodifizierend ist. Diese Lösung ist in vielen Umgebungen
nicht annehmbar. Der selbstmodifizierende Code ist auch sehr schwer von
Fehlern zu bereinigen und zu warten.
-
Das
Dokument "Pointer
Swizzling at Page Fault Time: Efficiently Supporting Huge Address Spaces
on Standard Hardware",
Computer Architecture News, 19 (1991), Juni, Nr. 4, von P.R. Wilson,
offenbart die Verwendung einer Programmprozedur, die normalerweise
auf eine Datenstruktur zugreift, die einen überdimensionierten Speicherplatz
auf einem Hardwaresystem mit einer adressierbaren Speicherdimension,
die kürzer
ist als der überdimensionierte
Speicherplatz, erfordert. Ein erster Zeiger, der von der Programmprozedur
verwendet wird, wird von einer Abfangprozedur erfasst, die den ersten
Zeiger in einen ersten vorübergehenden
Zeiger umsetzt, der einem ersten Speicherplatz der tatsächlichen
Hardware entspricht. Der erste Hardware-Speicherplatz umfasst einen
zweiten Zeiger, der auf einen zweiten Speicherplatz zeigt, auf den
als nächstes
zugegriffen werden soll. Dieser zweite Zeiger wird durch die Abfangroutine
auch in einen zweiten vorübergehenden Zeiger
umgesetzt, der auf einen zweiten Hardware-Speicherplatz zeigt, der
auch einen dritten Zeiger auf einen dritten Speicherplatz enthalten
kann – und
so weiter. Um Zeigerfehlabgleiche zu vermeiden, können die
Zeiger, auf die Bezug genommen wird, in den Hardware-Speicherplätzen eine
doppelte oder mehrfache Größe der Zeiger
aufweisen, die für
die Adressendimension des normalen vorübergehenden Speichers erforderlich
sind.
-
Es
wäre vorteilhaft,
ein Verfahren für
eine Initialisierung der ersten aktiven Verwendung von Datenstrukturen
bereitzustellen, das nicht einen Ausführungscode selbstmodifiziert
und auch nicht Spezialfall-Kompilierer-Optimierungen erfordert und effizienter
ist als die Verfahren des Standes der Technik. Ein solches erfindungsgemäßes Verfahren
würde die Leistung
von Computern, die das Verfahren verwenden, verbessern.
-
Zusammenfassung
der Erfindung
-
Die
Erfindung ist in den Ansprüchen
1, 10 bzw. 19 definiert. Spezielle Ausführungsbeispiele der Erfindung
sind in den abhängigen
Ansprüchen
dargelegt.
-
Die
vorliegende Erfindung stellt ein Verfahren zum Aufrufen einer programmierten
Operation in Reaktion auf eine erste aktive Verwendung eines Speicherbereichs
dar.
-
Ein
Aspekt der Erfindung ist ein Verfahren zum Aufrufen einer programmierten
Operation an einer Datenstruktur in Reaktion auf eine erste aktive Verwendung
der Datenstruktur. Das Verfahren umfasst den Schritt des Zuordnens
eines Datenstruktur-Zugriffskennzeichenspeichers zur Datenstruktur. Der
Datenstruktur-Zugriffskennzeichenspeicher
enthält
anfänglich
eine fehlausgerichtete Speicheradresse, die mit der Datenstruktur
in Beziehung steht. Ein weiterer Stritt ist jener des Auslösens einer
Abfangroutine bei der ersten aktiven Verwendung der Datenstruktur
durch Versuchen, auf die Datenstruktur unter Verwendung der fehlausgerichteten
Speicheradresse mit einer ausgerichteten Speicherzugriffsbetriebsart
zuzugreifen. Die Erfindung umfasst auch den Schritt des Umwandelns
der fehlausgerichteten Speicheradresse innerhalb des Datenstruktur-Zugriffskennzeichenspeichers
in eine ausgerichtete Speicheradresse. Folglich haben anschließende Versuche,
auf die Datenstruktur unter Verwendung der ausgerichteten Speicherzugriffsbetriebsart
und des Inhalts des Datenstruktur-Zugriffskennzeichenspeichers zuzugreifen,
Erfolg, ohne die Abfangroutine auszulösen.
-
Ein
weiterer Aspekt der Erfindung offenbart ein System zum Aufrufen
einer programmierten Operation an einer Datenstruktur in Reaktion
auf eine erste aktive Verwendung der Datenstruktur. Die Erfindung
umfasst einen Zuordnungsmechanismus, der dazu ausgelegt ist, einen
Datenstruktur-Zugriffskennzeichenspeicher der Datenstruktur zuzuordnen.
Der Datenstruktur-Zugriffskennzeichenspeicher enthält anfänglich eine
fehlausgerichtete Speicheradresse, die mit der Datenstruktur in
Beziehung steht. Die Erfindung umfasst auch einen Fehlermechanismus
für den
fehlausgerichteten Speicherzugriff, der dazu ausgelegt ist, eine
Abfangroutine bei der ersten aktiven Verwendung der Datenstruktur
auszulösen.
Die erste aktive Verwendung der Datenstruktur geschieht durch einen
Versuch, auf die Datenstruktur unter Verwendung einer ausgerichteten
Speicherzugriffsbetriebsart mit der fehlausgerichteten Speicheradresse, die
der Datenstruktur durch den Zuordnungsmechanismus zugeordnet wird,
zuzugreifen. Ein weiteres Element der Erfindung ist ein Adressenumwandlungsmechanismus,
der dazu ausgelegt ist, die fehlausgerichtete Speicheradresse innerhalb
des Datenstruktur-Zugriffskennzeichenspeichers in eine ausgerichtete
Speicheradresse umzuwandeln. Dieser Mechanismus reagiert auf den
Fehlermechanismus für den
fehlausgerichteten Speicherzugriff. Folglich haben anschließende Versuche,
auf die Datenstruktur unter Verwendung der ausgerichteten Speicherzugriffsbetriebsart
und des Inhalts des Datenstruktur-Zugriffskennzeichenspeichers zuzugreifen,
Erfolg, ohne die Abfangroutine auszulösen.
-
Noch
ein weiterer Aspekt der Erfindung ist ein Computerprogrammprodukt,
das in einem für
den Computer verwendbaren Speichermedium enthalten ist, um eine
programmierte Operation an einer Datenstruktur in Reaktion auf eine
erste aktive Verwendung der Datenstruktur aufzurufen. Wenn er auf
einem Computer ausgeführt
wird, veranlasst der maschinenlesbare Code, dass ein Computer einen
Zuordnungsmechanismus, einen Fehlermechanismus für den fehlausgerichteten Speicherzugriff
und einen Adressenumwandlungsmechanismus ausführt. Jeder dieser Mechanismen
besitzt dieselben Funktionen wie die entsprechenden Mechanismen
für die vorher
beschriebene Vorrichtung.
-
Bei
einem Ausführungsbeispiel
umfasst das Verfahren den Schritt des Ausrichtens des Datenstrukturelements
auf eine gerade Speicheradresse. Das Datenstrukturelement befindet
sich in einem geraden Versatz innerhalb der Datenstruktur, so dass auf
das Datenstrukturelement unter Verwendung einer Nicht-Byte-Zugriffsbetriebsart
zugegriffen werden kann. Das Verfahren ordnet auch einen Datenstruktur-Zugriffskennzeichenspeicher
der Datenstruktur zu. Der Datenstruktur-Zugriffskennzeichenspeicher
enthält
anfänglich
eine ungerade Datenstruktur-Speicheradresse, die mit der Datenstruktur in
Beziehung steht. Ein weiterer Schritt in dem Verfahren ist jener
des Auslösens
einer Abfangroutine beim anfänglichen
Zugriff auf das Datenstrukturelement. Die Abfangroutine wird durch
Versuchen eines Zugriffs auf das Datenstrukturelement unter Verwendung
der Nicht-Byte-Zugriffsbetriebsart mit der ungeraden Datenstruktur-Speicheradresse
und dem geraden Versatz ausgelöst.
Das Verfahren wandelt auch die ungerade Datenstruktur-Speicheradresse
innerhalb des Datenstruktur-Zugriffskennzeichenspeichers
in eine gerade Datenstrukturadresse um. Folglich haben anschließende Versuche,
auf das Datenstrukturelement unter Verwendung der Nicht-Byte-Zugriffsbetriebsart
mit der geraden Datenstrukturadresse und dem geraden Versatz zuzugreifen,
Erfolg, ohne die Abfangroutine auszulösen. Außerdem umfasst das Verfahren
die Schritte des Aufrufens der programmierten Operation und des
Zugreifens auf das Datenstrukturelement unter Verwendung der geraden
Datenstrukturadresse.
-
Bei
einem Ausführungsbeispiel
umfasst das System einen Ausrichtungsmechanismus, der dazu ausgelegt
ist, das Datenstrukturelement auf eine gerade Speicheradresse des
Speichers auszurichten. Das Datenstrukturelement befindet sich in
einem geraden Versatz innerhalb der Datenstruktur, so dass auf das
Datenstrukturelement vom Speicher unter Verwendung einer Nicht-Byte-Zugriffsbetriebsart
der CPU zugegriffen werden kann. Das System umfasst auch einen Zugriffskennzeichenmechanismus,
der dazu ausgelegt ist, einen Datenstruktur-Zugriffskennzeichenspeicher
der Datenstruktur zuzuordnen. Der Datenstruktur-Zugriffskennzeichenspeicher enthält anfänglich eine
ungerade Datenstruktur-Speicheradresse, die mit der Datenstruktur
in Beziehung steht. Das System umfasst außerdem einen Auslösemechanismus,
der dazu ausgelegt ist, eine Abfangroutine beim anfänglichen
Zugriff auf das Datenstrukturelement auszulösen, indem versucht wird, auf
das Datenstrukturelement im Speicher unter Verwendung der Nicht-Byte-Zugriffsbetriebsart
mit der ungeraden Datenstruktur-Speicheradresse und dem geraden Versatz
zuzugreifen. Ein Adressenumwandlungsmechanismus ist auch innerhalb
des Systems enthalten. Der Adressenumwandlungsmechanismus reagiert auf
den Auslösemechanismus
und ist dazu ausgelegt, die ungerade Datenstruktur-Speicheradresse
innerhalb des Datenstruktur-Zugriffskennzeichenspeichers
in eine gerade Datenstrukturadresse umzuwandeln. Folglich haben
anschließende
Versuche, auf das Datenstrukturelement unter Verwendung der Nicht-Byte-Zugriffsbetriebsart
mit der geraden Datenstrukturadresse und dem geraden Versatz zuzugreifen,
Erfolg, ohne die Abfangroutine auszulösen. Das System umfasst auch
einen Aufrufmechanismus, der dazu ausgelegt ist, die programmierte
Operation aufzurufen; und einen Datenzugriffsmechanismus, der dazu
ausgelegt ist, auf das Datenstrukturelement innerhalb des Speichers
unter Verwendung der geraden Datenstrukturadresse zuzugreifen.
-
Auslösen der
Abfangroutine. Das System umfasst auch einen Aufrufmechanismus,
der dazu ausgelegt ist, die programmierte Operation aufzurufen;
und einen Datenzugriffsmechanismus, der dazu ausgelegt ist, auf
das Datenstrukturelement innerhalb des Speichers unter Verwendung
der geraden Datenstrukturadresse zuzugreifen.
-
Wenn
er auf einem Computer ausgeführt wird,
bewirkt der maschinenlesbare Code bei einem Ausführungsbeispiel, dass ein Computer
einen Ausrichtungsmechanismus, einen Zugriffskennzeichenmechanismus,
einen Auslösemechanismus,
einen Adressenumwandlungsmechanismus, einen Aufrufmechanismus und
einen Datenzugriffsmechanismus ausführt. Jeder dieser Mechanismen
besitzt dieselben Funktionen wie die entsprechenden Mechanismen
für die
vorher beschriebene Vorrichtung.
-
Die
vorangehenden und viele weitere Aspekte der vorliegenden Erfindung
werden für übliche Fachleute
zweifellos offensichtlich, nachdem sie die folgende ausführliche
Beschreibung von bevorzugten Ausführungsformen gelesen haben,
die in den verschiedenen Zeichnungsfiguren dargestellt sind.
-
Beschreibung
der Zeichnungen
-
1A stellt
ein Klassenobjekt des Standes der Technik dar;
-
1B stellt
einen ersten Prozess des Standes der Technik dar, der verwendet
wird, um eine erste aktive Verwendung einer Datenstruktur oder eines OOP-Objekts
zu erfassen;
-
1C stellt
einen zweiten Prozess des Standes der Technik dar, der verwendet
wird, um eine erste aktive Verwendung einer Datenstruktur oder eines
OOP-Objekts zu erfassen und die anschließenden Verwendungen zu optimieren;
-
2 stellt
ein Computersystem dar, das in der Lage ist, die Erfindung gemäß einem
bevorzugten Ausführungsbeispiel
anzuwenden;
-
3 stellt
den Betriebsüberblick über die Erfindung
gemäß einem
bevorzugten Ausführungsbeispiel
dar;
-
4 stellt
eine Nachschlagetabelle, die verwendet wird, um eine fehlausgerichtete
Speicheradresse einer speziellen Klasse oder Datenstruktur zuzuordnen,
gemäß einem
bevorzugten Ausführungsbeispiel
dar;
-
5 stellt
einen detaillierten Klassenobjekt-Verwendungsprozess gemäß einem
bevorzugten Ausführungsbeispiel
dar;
-
6A stellt
einen Prozess "Zugriffskennzeichen
auffinden" gemäß einem
bevorzugten Ausführungsbeispiel
dar; und
-
6B stellt
einen Prozess "Zugriffskennzeichen
umwandeln" gemäß einem
bevorzugten Ausführungsbeispiel
dar.
-
Beschreibung
von bevorzugten Ausführungsbeispielen
-
Bezeichnungen und Nomenklatur
-
Die
folgende "Bezeichnungen
und Nomenklatur" wird
bereitgestellt, um das Verständnis
der vorliegenden Erfindung und von deren bevorzugten Ausführungsbeispielen
zu unterstützen.
-
Aufrufstelle – Eine Aufrufstelle
ist die Prozedur, die verwendet wird, um eine programmierte Routine
aufzurufen.
-
Klasse – Die Klasse
ist eine Implementierung der OOP-Sprache,
die Informationen aufzeichnet, die für einen Satz von Objekten gemeinsam
sind, die von derselben Klasse instantiiert oder von anderen Objekten
kopiert werden. Ein Fachmann wird verstehen, dass diese Datenstruktur
dieselbe Datenstruktur, die zum Darstellen von Klassen verwendet
wird, die von der Implementierung der Programmiersprache verwendet
werden, sein kann oder nicht. Außerdem kann die Klasse selbst
ein OOP-Objekt sein.
-
Datenstruktur – Eine Datenstruktur
ist eine geordnete Speicheranordnung im Speicher für Variablen.
Ein OOP-Objekt ist eine spezialisierte Datenstruktur.
-
Objekt – Ein Objekt
im objektorientierten Programmierparadigma ist eine Zuordnung zwischen programmierten
Verfahren und den durch eine Klasse definierten Datenstrukturen
und dem instantiierten Speicher, der ein OOP-Objekt der Klasse darstellt.
-
Zeiger – Ein Zeiger
ist ein Datenwert, der verwendet wird, um auf eine Datenstruktur
oder ein Objekt zu verweisen. Ein Fachmann wird verstehen, dass "Zeiger" ohne Begrenzung
eine Speicheradresse für
die interessierenden Informationen oder einen zum Berechnen von
deren Adresse verwendeter Wert und irgendwelche funktionalen Äquivalente,
einschließlich
Zugriffsnummern und ähnlicher
Gebilde, umfasst.
-
Programmiertes
Verfahren – Ein
programmiertes Verfahren ist eine programmierte Routine, die einem
OOP-Objekt zugeordnet ist. Das programmierte Verfahren wird aufgerufen,
um zu bewirken, dass das OOP-Objekt eine Operation durchführt.
-
Programmierte
Routine – Eine
Prozedur, die von einer Aufrufstelle aufgerufen wird, so dass, wenn die
Prozedur endet, sie zum nächsten
Befehl nach der Aufrufstelle zurückkehrt.
Eine programmierte Routine entspricht einer "Prozedur", "Funktion" oder "Routine", wie diese Begriffe
auf dem Fachgebiet verwendet werden.
-
Prozedur – Eine Prozedur
ist eine eigenständige
Sequenz von Schritten, die zu einem gewünschten Ergebnis führen. Diese
Schritte sind diejenigen, die eine physikalische Bearbeitung von
physikalischen Größen erfordern.
Gewöhnlich
nehmen diese Größen die
Form von elektrischen oder magnetischen Signalen an, die gespeichert, übertragen, kombiniert,
verglichen oder anderweitig bearbeitet werden können. Diese Signale werden
als Bits, Werte, Elemente, Symbole, Zeichen, Terme, Zahlen oder dergleichen
bezeichnet. Es ist für
Fachleute verständlich,
dass alle diese und ähnliche
Begriffe den entsprechenden physikalischen Größen zugeordnet sind und lediglich
zweckmäßige Bezeichnungen sind,
die auf diese Größen angewendet
werden.
-
Betriebsumgebung
-
Obwohl
die nachfolgende Beschreibung der Erfindung innerhalb des objektorientierten
Paradigma liegt und auf Java-Klassenobjekte gerichtet ist, sind
die offenbarten Verfahren auf andere Programmierparadigmen anwendbar
und die Beschreibung gilt auch für
Datenstrukturen.
-
Die
Erfindung verwendet einen Computer. Einige der Elemente eines Computers,
wie durch das allgemeine Bezugszeichen 200 angegeben, die
dazu ausgelegt sind, die Erfindung zu unterstützen, sind in 2 gezeigt,
wobei ein Prozessor 201 gezeigt ist, der eine Zentraleinheit
(CPU) 203, einen Speicherabschnitt 205 und einen
Eingabe/Ausgabe-(E/A) Abschnitt 207 aufweist. Der E/A-Abschnitt 207 ist
mit einer Tastatur 209, einer Anzeigeeinheit 211,
einer Plattenspeichereinheit 213 und einer CD-ROM-Laufwerkseinheit 215 verbunden.
Die CD-ROM-Laufwerkseinheit 215 kann ein CD-ROM-Medium 217 lesen,
das typischerweise ein Programm und Daten 219 enthält. Die
CD-ROM-Laufwerkseinheit 215 zusammen
mit dem CD-ROM-Medium 217 und der Plattenspeichereinheit 213 bildet
einen Dateispeichermechanismus. Ein solches Computersystem ist in
der Lage, Anwendungen auszuführen,
die die Erfindung verkörpern.
Ein Fachmann wird verstehen, dass die CD-ROM-Laufwerkseinheit 215 gegen
irgendeine andere Vorrichtung ausgetauscht werden kann, die ermöglicht,
dass ein maschinenlesbarer Code von irgendwelchen Medien oder über das
Netzwerk in den Computer gelesen wird. Eine solche Person wird auch
verstehen, dass die Erfindung auf einem Computer ausgeführt werden
kann, der keine Tastatur oder Anzeige umfasst.
-
Die
Erfindung stellt einen effizienten Mechanismus bereit, um eine erste
aktive Verwendung einer Datenstruktur (einschließlich eines OOP-Objekts) zu
erfassen und die Datenstruktur direkt vor der ersten aktiven Verwendung
zu initialisieren. Die Erfindung arbeitet durch Bewirken, dass die
erste aktive Verwendung einer Datenstruktur einen Fehler eines fehlausgerichteten
Speicherzugriffs verursacht, der zu einer Abfangroutine führt. Dies
wird bewerkstelligt, indem angefordert wird, dass die Speicherzugriffsoperation
unter Verwendung einer Speicherzugriffsbetriebsart durchgeführt wird,
die eine gerade Speicheradresse erfordert, und der Speicherzugriff
bei einer ungeraden Speicheradresse versucht wird. Die Abfang-Bearbeitungsroutine
wandelt die Speicheradresse in eine gerade Speicheradresse um, führt die Datenstruktur-Initialisierung durch
und bewirkt, dass der Computer den Befehl, der die Abfangroutine
verursacht hat, erneut ausführt.
Dieser Versuch, auf die nun initialisierte Datenstruktur zuzugreifen,
hat Erfolg, da die Speicheradresse umgewandelt wurde.
-
3 stellt
einen "Klassenobjekt-Initialisierungs"-Prozess dar, der mit dem allgemeinen
Bezugszeichen 300 angegeben ist und der verwendet wird,
um ein Klassenobjekt in Reaktion auf die erste aktive Verwendung
des Klassenobjekts (der anfängliche
Zugriff) zu initialisieren. Ein Fachmann wird verstehen, dass das
Klassenobjekt eine Datenstruktur ist. Der "Klassenobjekt-Initialisierungs"-Prozess 300 beginnt an einer "Start"-Grenzstelle 301 und
geht zu einer Prozedur 303 "Klassenobjekt laden" weiter. Die Prozedur 303 "Klassenobjekt laden" ordnet Speicher für das Klassenobjekt
zu und kann das Klassenobjekt vorinitialisieren. Die Vorinitialisierung
ermöglicht, dass
das Klassenobjekt von dem das Objekt enthaltenden Programm verwendet
wird. Die Vorinitialisierung richtet sich auf Elemente wie z.B.
die Größe des Klassenobjekts,
Verfahrenszeiger und ein anfängliche
Zugriffskennzeichen. Es findet jedoch während der Vorinitialisierung
keine vom Benutzer festgelegte Initialisierung statt.
-
Das
Zugriffskennzeichen wird vorinitialisiert, so dass es eine fehlausgerichtete
Speicheradresse enthält,
so dass ein Speicherzugriff unter Verwendung einer ausgerichteten
Speicherzugriffsbetriebsart misslingt, wenn ein gerader Versatz
mit dem Zugriffskennzeichen verwendet wird. Im Allgemeinen ist die
fehlausgerichtete Speicheradresse eine ungerade Datenstruktur-Speicheradresse,
die dem Klassenobjekt zugeordnet ist, und die ausgerichtete Speicherzugriffsbetriebsart
ist eine Nicht-Byte-Zugriffsbetriebsart.
Ein Fachmann wird verstehen, dass die ungerade Datenstruktur-Speicheradresse
häufig
auf eine ungerade Bytestelle innerhalb des Klassenobjekts zeigt.
Obwohl das Klassenobjekt vorinitialisiert werden kann, werden die
als Variablen verwendeten Datenstrukturelemente innerhalb des Klassenobjekts nicht
initialisiert, bis das Programm eine erste aktive Verwendung von
irgendeinem der Datenstrukturelemente innerhalb des Klassenobjekts
versucht. Ein Fachmann wird verstehen, dass jeder Zugriff auf das Klassenobjekt
das Zugriffskennzeichen verwendet, so dass irgendein Zugriff auf
das Klassenobjekt die erste aktive Verwendung des Klassenobjekts
sein kann.
-
Schließlich versucht
ein Ausführungsprogramm
die erste aktive Verwendung der Klasse in einer Prozedur 305 "erste aktive Verwendung
der Klasse versuchen",
indem es versucht, auf eine statische Klassenvariable zuzugreifen.
Diese Prozedur verwendet das Zugriffskennzeichen der Klasse, um
einen indirekt indizierten Speicherzugriff unter Verwendung einer
Nicht-Byte-Zugriffsbetriebsart zu versuchen, um auf die statische
Klassenvariable zuzugreifen (alle aktiven Verwendungen der Klasse
verwenden dieses Verfahren, um die Klasse aktiv zu verwenden, so
dass irgendeine aktive Verwendung die erste versuchte aktive Verwendung
sein kann). Da das Zugriffskennzeichen auf eine ungerade Datenstruktur-Speicheradresse
vorinitialisiert wird, misslingt der Speicherzugriffsversuch (da
nur ein Byte-Zugriffsbetriebsart-Befehl
auf den Speicher beginnend an einer ungeraden Bytegrenze zugreifen
kann). Der Computer erfasst den illegalen Speicherzugriffsversuch
und löst
eine Abfangroutine aus. Die Abfangroutine verursacht, dass der Computer
eine Prozedur 307 "Fehlausrichtung
abfangen durch Abfangroutine" ausführt, die
feststellt, dass der Speicherzugriff innerhalb eines Klassenobjekts
stattfand, das nicht initialisiert war. Die nachfolgende Beschreibung
beschreibt die Erfindung in Bezug auf moderne Computersysteme, die
einen fehlausgerichteten Speicherzugriffsversuch ermitteln, wenn
die Speicherzugriffsbetriebsart nicht byteorientiert ist und auf
eine ungerade Speicheradresse adressiert ist.
-
Der "Klassenobjekt-Initialisierungs"-Prozess 300 modifiziert
dann das Zugriffskennzeichen in einer Prozedur 309 "Zugriffskennzeichen
umwandeln", so dass
ein anschließender
Nicht-Byte-Zugriffsbetriebsart-Speicherzugriff
unter Verwendung des Zugriffskennzeichens Erfolg hat, ohne den Fehler
des fehlausgerichteten Speicherzugriffs zu verursachen. Im Allgemeinen
besteht diese Modifikation aus dem Umwandeln des Zugriffskennzeichens
in eine gerade Adresse innerhalb des Klassenobjekts. Folglich haben
anschließende
Nicht-Byte-Zugriffsbetriebsart-Zugriffe
Erfolg, wenn das Zugriffskennzeichen mit einem geraden Versatz verwendet
wird. Nachdem der "Klassenobjekt-Initialisierungs"-Prozess 300 das Zugriffskennzeichen
umgewandelt hat, geht er zu einer Prozedur 311 "Einleitungsroutinenverfahren
aufrufen" weiter,
die eine programmierte Operation aufruft, die eine Initialisierung
für statische
Klassenvariablen und vom Benutzer festgelegte Initialisierungsoperationen
durchführt.
Diese Initialisierungsprozesse greifen auf die Datenstruktur unter
Verwendung des modifizierten Zugriffskennzeichens zu. Sobald die Datenstruktur
vollständig
initialisiert ist, bewirkt eine Prozedur 313 "erste aktive Verwendung
der Klasse vollenden",
dass die Abfang-Bearbeitungsroutine den Rückkehrprogrammzähler (falls
erforderlich) einstellt und eine Abfangroutinerückkehr ausführt, um die Prozedur 305 "erste aktive Verwendung
der Klasse versuchen" erneut
auszuführen.
Da das Zugriffskennzeichen nun gerade ist, endet die Prozedur 305 "erste aktive Verwendung
der Klasse versuchen" erfolgreich.
Der "Klassenobjekt-Initialisierungs"-Prozess 300 endet
dann durch eine "Ende"-Grenzstelle 315.
-
4 stellt
eine "Nachschlage"-Tabelle dar, die
mit dem allgemeinen Bezugszeichen 400 versehen ist und
von einem bevorzugten Ausführungsbeispiel
verwendet wird, um das Zugriffskennzeichen einem Klassenobjekt zuzuordnen.
Die "Nachschlage"-Tabelle 400 enthält eine
Matrix 401 "Klassenzeiger
und Ausdehnung",
die eine Matrix von Strukturen, eine zweidimensionale Matrix oder
eine andere auf dem Fachgebiet bekannte Speicheranordnung sein kann.
Die Matrix 401 "Klassenzeiger
und Ausdehnung" umfasst
ein Feld 403 "Zeiger
auf Klasse A", das
einen Zeiger auf das erste Byte der "A"-Klasse (nicht
dargestellt) enthält.
Die Matrix 401 "Klassenzeiger
und Ausdehnung" umfasst
auch ein Feld 405 "Größe von Klasse
A", das die Größe der "A"-Klasse enthält. Ebenso enthält ein Feld 407 "Zeiger auf Klasse
B" die Adresse einer
Instanz 409 der "Klasse
B", die (wie alle
Klassen) auf eine gerade Speicheradresse ausgerichtet ist. Das Feld 411 "Größe von Klasse B" enthält die Größe der Instanz 409 der "Klasse B". Ein Feld 413 "Zeiger auf Klasse
C" enthält einen
Zeiger auf eine Instanz 415 der "Klasse C" und ein Feld 417 "Größe von Klasse
C" enthält die Größe der Instanz 415 der "Klasse C". Ein Feld 419 "Zeiger auf Klasse
D" enthält einen
Zeiger auf das erste Byte der "D"-Klasse (nicht dargestellt).
Ein Feld 421 "Größe von Klasse
D" enthält die Größe der "D"-Datenstruktur.
-
Ein
Fachmann wird verstehen, dass in einer Nicht-OOP-Umgebung die Matrix 401 "Klassenzeiger und
Ausdehnung" Zeiger
auf Datenstrukturen und die Größe der Datenstrukturen
umfasst. Ein Fachmann wird auch verstehen, dass viele Mechanismen
zum Erzeugen der Matrix 401 "Klassenzeiger und Ausdehnung" existieren. Diese
Mechanismen umfassen (ohne Begrenzung) das Erzeugen der Matrix 401 "Klassenzeiger und
Ausdehnung" unter
Verwendung eines Kompilierers (oder Assemblierers) zusammen mit
einem Binderprogramm, das dynamische Konstruieren der Matrix 401 "Klassenzeiger und
Ausdehnung", wenn
Datenstrukturen oder Klassen vom Speicher zugeordnet werden, und
viele weitere ähnliche
Verfahren.
-
Die
Instanz 409 der "Klasse
B" umfasst ein Feld 423 "Zugriffskennzeichen
der Klasse B", das verwendet
wird, um das Zugriffskennzeichen zu speichern. Bei diesem Ausführungsbeispiel
wird der anfängliche
Inhalt des Zugriffskennzeichenfeldes während der Vorinitialisierung
auf eine ungerade Datenstruktur-Speicheradresse wie z.B. die Adresse
der Instanz 409 der "Klasse
B" plus Eins, gesetzt.
Während
des Initialisierungsprozesses wird das Zugriffskennzeichen so modifiziert,
dass es auf eine gerade Datenstrukturadresse zeigt. Folglich zeigt
das modifizierte Zugriffskennzeichen auf eine gerade Speicheradresse
innerhalb der Klasse. Ein bevorzugtes Ausführungsbeispiel lässt das
modifizierte Zugriffskennzeichen auf die erste Instanzvariable in
der Klasse zeigen. Ein weiteres bevorzugtes Ausführungsbeispiel lässt das
modifizierte Zugriffskennzeichen auf den Start der Klasse zeigen.
Die Instanz 409 der "Klasse
B" umfasst auch
ein Feld 425 "statische
Klassenvariable",
das als Speicher für
eine Klasseninstanzvariable dient, die von allen Objekten der Klasse
gemeinsam genutzt wird. In der Java-Umgebung muss das Feld 425 "statische Klassenvariable" bei der ersten aktiven
Verwendung der Klasse initialisiert werden.
-
Die
Instanz 409 der "Klasse
B" umfasst auch einen "Klassenverfahrenszugriff"-Speicher 427.
Ein Fachmann wird verstehen, dass der "Klassenverfahrenszugriff"-Speicher 427 ein
Mittel für
instantiierte Objekte der Klasse zum Aufrufen der Verfahren des Objekts
bereitstellt. Die Instanz 415 der "Klasse C" umfasst auch ein Feld 429 "Zugriffskennzeichen
der Klasse C" mit
denselben Eigenschaften wie jene des Feldes 423 "Zugriffskennzeichen
der Klasse B", das jedoch
anfänglich
einen Wert enthält, der
die Adresse der Instanz 415 der "Klasse C" plus Eins ist. Die Instanz 415 der "Klasse C" enthält auch
ein Feld 431 "statische
Klassenvariable" und
einen "Klassenverfahrenszugriff"-Speicher 433 mit ähnlichen
Eigenschaften wie die entsprechenden Felder in der Instanz 409 der "Klasse B".
-
Das
Feld 423 "Zugriffskennzeichen
der Klasse B", das
Feld 425 "statische
Klassenvariable",
der Klassenverfahrenszugriff"-Speicher 427,
das Feld 429 "Zugriffskennzeichen
der Klasse C", das
Feld 431 "statische
Klassenvariable" und
der "Klassenverfahrenszugriff"-Speicher 433 werden alle auf
gerade Speicheradressen unter Verwendung von einem oder mehreren
Ausrichtungsmechanismen, die auf dem Fachgebiet gut verstanden sind,
ausgerichtet. Diese Ausrichtung kann bewerkstelligt werden, indem
angefordert wird, dass jede statische Klassenvariable an einem geraden
Versatz vom Start der Klasseninstanz startet und dass die Klasseninstanz auch
an einer geraden Speicheradresse startet. Eine weitere Anforderung
besteht darin, dass auf jede statische Klassenvariable unter Verwendung
einer Nicht-Byte-Zugriffsbetriebsart zugegriffen wird. Folglich
wird eine statische Ein-Byte-Klassenvariable durch den Kompilierer
so erweitert, dass sie eine Länge
von mindestens zwei Bytes aufweist und auf ein geradzahliges Byte
ausgerichtet ist. Die "Nachschlage"-Tabelle 400 stellt
einen Zugriffskennzeichenmechanismus bereit, der das Zugriffskennzeichen
der Klasse zuordnet.
-
5 stellt
einen "Klassenobjektverwendungs"-Prozess dar, der
mit dem allgemeinen Bezugszeichen 500 angegeben ist und
der eine erste aktive Verwendung des Klassenobjekts, gefolgt von einer
nachfolgenden aktiven Verwendung, zeigt. Der "Klassenobjektverwendungs"-Prozess 500 beginnt an
einer "Start"-Grenzstelle 501 und
geht zu einer Prozedur 503 "Zugriffskennzeichen laden" weiter. Die Prozedur 503 "Zugriffskennzeichen
laden" ruft das Zugriffskennzeichen aus
dem Zugriffsfeld in der Klasse (beispielsweise dem Feld 423 "Zugriffskennzeichen
der Klasse B") ab
und bringt den Zugriffskennzeichenwert in eine Form, die in einer
indirekt indizierten Operation verwendet werden kann. Dies umfasst
im Allgemeinen das Laden des Inhalts des Zugriffskennzeichens der
Klasse in ein Register, so dass ein Speicherzugriff an einer Speicherstelle durchgeführt werden
kann, die vom Zeiger im Register versetzt ist. Als nächstes versucht
eine Prozedur 505 "anfänglicher
Zugriff", auf das
Datenstrukturelement (wie z.B. das Feld 425 "statische Klassenvariable") als Versatz von
der Adresse, auf die durch den Zeiger im Register gezeigt wird,
zuzugreifen. Dieser Zugriff wird unter Verwendung einer Nicht-Byte-Zugriffsbetriebsart
versucht. Dieser Zugriffsversuch aktiviert den Computer, um einen
Fehler eines fehlausgerichteten Speicherzugriffs bei diesem anfänglichen Zugriff
zu erzeugen, da das Zugriffskennzeichen eine ungerade Adresse mit
einem geraden Versatz ist und einen Nicht-Byte-Zugriffsbetriebsart-Speicherzugriff verwendet.
Folglich ist dieser versuchte Zugriff ein Auslösemechanismus, der eine Abfangroutine
bei der ersten aktiven Verwendung des Klassenobjekts aufruft.
-
Ein
Fachmann wird verstehen, dass die Adresse des Datenstrukturelements
im Klassenobjekt erzeugt werden kann, indem der gerade Versatz des
Datenstrukturelements zum Zugriffskennzeichenwert im Register addiert
wird; dass der gerade Versatz als Versatz vom im Register enthaltenen
Zugriffskennzeichenwert verwendet werden kann, oder ein anderer
geeigneter Mechanismus, der unter Verwendung der Adressierungsbetriebsarten
des Computers zur Verfügung
steht.
-
Der
resultierende Abfangprozess speichert den Zustand des Computers
(einschließlich
des das Zugriffskennzeichen enthaltenden Registers) und ruft eine
Prozedur 507 "Abfangroutine
empfangen" innerhalb
eines Abfang- Bearbeitungsprogramms
auf. Eine Prozedur 509 "Adresse
gewinnen" innerhalb
des Ermittlungs-Bearbeitungsprogramms untersucht den gespeicherten
Computerzustand und den Befehl, der den Fehler des fehlausgerichteten
Speicherzugriffs verursacht hat, und gewinnt die ungerade Speicheradresse,
die den Fehler verursacht hat, und stellt fest, welches Register
zum Zeitpunkt der Abfangroutine das Zugriffskennzeichen enthielt.
Sobald diese Adresse gewonnen ist, stellt eine Entscheidungsprozedur 511 "Adresse in Klassenobjekt" unter Verwendung
der "Nachschlage"-Tabelle 400 fest,
ob die gewonnene Adresse eine Adresse innerhalb irgendeines relevanten
OOP-Klassenobjekts (Datenstruktur) ist. Ein Fachmann wird verstehen,
wie die gewonnene Adresse mit den Informationen innerhalb der Matrix 401 "Klassenzeiger und
Ausdehnung" zu vergleichen
ist, um diese Feststellung durchzuführen. Wenn die gewonnene Adresse
keine Adresse innerhalb irgendeiner relevanten OOP-Klasse ist, geht
der "Klassenobjektverwendungs"-Prozess 500 zu
einer Prozedur 513 "normale
Abfangverarbeitung" weiter,
um die Abfangroutine unter Verwendung von Verfahren des Standes
der Technik zu verarbeiten, da die Abfangroutine nicht mit der ersten
aktiven Verwendung der Klasse in Beziehung stand.
-
Wenn
jedoch die Adresse eine Adresse innerhalb eines der Speicherbereiche
(OOP-Klassen), die durch die Matrix 401 "Klassenzeiger und
Ausdehnung" definiert
sind, war, erzeugt die Entscheidungsprozedur 511 "Adresse in Klassenobjekt" einen Zeiger auf
das Klassenobjekt, das die Adresse enthält. Dann geht der "Klassenobjektverwendungs"-Prozess 500 zu
einer Prozedur 515 "Zugriffskennzeichen
auffinden" weiter,
die den entsprechenden Zeiger in der Matrix 401 "Klassenzeiger und
Ausdehnung" verwendet,
um das Zugriffskennzeichenfeld aufzufinden, das dem Klassenobjekt
zugeordnet ist, wie anschließend
mit Bezug auf 6A beschrieben wird.
-
Als
nächstes
geht der "Klassenobjektverwendungs"-Prozess 500 zu
einer Prozedur 517 "Zugriffskennzeichen
umwandeln" weiter,
die das in einem Zugriffskennzeichenfeld (wie z.B. dem Feld 423 "Zugriffskennzeichen
der Klasse B") gespeicherte Zugriffskennzeichen
umwandelt, so dass es auf eine gerade Speicheradresse zeigt, so
dass ein Nicht-Byte-Zugriffsbetriebsart-Speicherzugriff,
der auf einen geraden Versatz vom Zugriffskennzeichen durchgeführt wird,
auf das beabsichtigte Datenstrukturelement zugreift. Die Prozedur 517 "Zugriffskennzeichen
umwandeln" wird
anschließend
mit Bezug auf 6B beschrieben.
-
Nachdem
das Zugriffskennzeichen umgewandelt ist, geht der "Klassenobjektverwendungs"-Prozess 500 zu
einer Prozedur 519 "Rückkehrprogrammzähler einstellen" weiter. Die Prozedur 519 "Rückkehrprogrammzähler einstellen" modifiziert den
von der Prozedur 507 "Abfangroutine
empfangen" gespeicherten
Zustand, um den Inhalt des das Zugriffskennzeichen enthaltenden
Registers so umzuwandeln, dass es das umgewandelte Zugriffskennzeichen
enthält.
Die Prozedur 519 "Rückkehrprogrammzähler einstellen" stellt auch den
Programmzähler
ein, um die versuchte Speicheroperation (die die Abfangroutine aufgerufen
hat) mit dem umgewandelten Zugriffskennzeichen erneut auszuführen. Als
nächstes
initialisiert eine "Klasseninitialisierungs"-Prozedur 520 die
Klasse. Ein Fachmann wird verstehen, dass die "Klasseninitialisierungs"-Prozedur 520 ein
Beispiel für
einen Aufrufmechanismus ist, der verwendet wird, um eine programmierte
Operation aufzurufen. Ein Fachmann wird auch verstehen, dass die
Initialisierung Erfolg hat, da das Zugriffskennzeichen vor der Ausführung der "Klasseninitialisierungs"-Prozedur 520 umgewandelt wurde.
Schließlich
stellt eine "Abfangsroutinenrückkehr"-Prozedur 521 den
Computerzustand (wie durch die Prozedur 519 "Rückkehrprogrammzähler einstellen" modifiziert) wieder
her und kehrt zur erneuten Ausführung
des Befehls zurück,
der die Abfangroutine bei der Prozedur 505 "anfänglicher.
Zugriff" verursacht
hat. Da das Zugriffskennzeichen nicht mehr ungerade ist, greift
der vorher versuchte Speicherzugriff erfolgreich auf die initialisierte
Datenstruktur zu. Als nächstes
geht der "Klassenobjektverwendungs"-Prozess 500 zu
einer Prozedur 523 "weitere
Verarbeitung" weiter,
die weitere Prozeduren durchführt.
Schließlich
versucht eine Prozedur 525 "anschließender Zugriff" einen weiteren Zugriff
auf eines der Datenstrukturelemente in der Datenstruktur unter Verwendung
des umgewandelten Zugriffskennzeichens und des geraden Versatzes
auf das Datenstrukturelement im Klassenobjekt. Da das umgewandelte
Zugriffskennzeichen gerade ist, endet diese Operation (der Datenzugriffsmechanismus),
ohne eine Abfangroutine zu verursachen. Der "Klassenobjektverwendungs"-Prozess 500 endet
durch eine "Ende"-Grenzstelle 527.
Ein Fachmann wird verstehen, dass die tatsächliche Sequenz des vorher
beschriebenen Schritts modifiziert werden kann, um ähnliche
Ergebnisse zu erzielen.
-
Ein
bevorzugtes Ausführungsbeispiel
der Erfindung wird verwendet, um statische Klassenvariablen innerhalb
eines Java-Klassenobjekts zu initialisieren. Dieses Ausführungsbeispiel
verwendet die aufgerufene programmierte Operation als Initialisierungsprozedur,
die die Java-Klassen-Einleitungsroutinen
aufruft.
-
6A stellt
einen Prozess "Zugriffskennzeichen
auffinden" dar,
der mit dem allgemeinen Bezugszeichen 600 angegeben ist
und von der Prozedur 515 "Zugriffskennzeichen auffinden" von 5 aufgerufen
wird. Der Prozess 600 "Zugriffskennzeichen
auffinden" beginnt
an einer "Start"-Grenzstelle 601 und geht zu
einer Prozedur 603 "Klasse
auffinden" weiter,
die die Adresse der Datenstruktur, die von der Entscheidungsprozedur 511 "Adresse in Klassenobjekt" zurückgegeben
wird, als Zeiger auf die relevante Datenstruktur verwendet. Dann
findet eine Prozedur 605 "Zugriffskennzeichen auffinden" das Datenstrukturelement,
das das Zugriffskennzeichen enthält
(beispielsweise das Feld 423 "Zugriffskennzeichen der Klasse B"), und führt einen
Zeiger auf den Zugriffskennzeichenspeicher zurück, so dass das Zugriffskennzeichen
durch die Prozedur 517 "Zugriffskennzeichen
umwandeln" von 5 umgewandelt
werden kann. Obwohl ein bevorzugtes Ausführungsbeispiel das Zugriffskennzeichen
als erstes Datenstrukturelement in einem OOP-Objekt oder einer Datenstruktur
anordnet, wird ein Fachmann verstehen, dass viele Verfahren existieren,
um das Zugriffskennzeichen seinem OOP-Objekt oder seiner Datenstruktur
zuzuordnen.
-
6B stellt
einen Prozess "Zugriffskennzeichen
umwandeln" dar,
der mit dem allgemeinen Bezugszeichen 650 angegeben ist
und der durch die Prozedur 517 "Zugriffskennzeichen umwandeln" von 5 aufgerufen
wird. Der Prozess 650 "Zugriffskennzeichen
umwandeln" bewirkt
einen Adressenumwandlungsmechanismus. Der Prozess 650 "Zugriffskennzeichen
umwandeln" beginnt
an einer "Start"-Grenzstelle 651 und geht zu
einer Entscheidungsprozedur 653 "ungerades Klassenzugriffskennzeichen" weiter, die feststellt,
ob das der Klasse zugeordnete Zugriffskennzeichen nicht geändert wurde.
Wenn das Zugriffskennzeichen der Klasse ungerade ist, geht der Prozess 650 "Zugriffskennzeichen
umwandeln" zu einer
Prozedur 655 "Klassenzugriffskennzeichen
umwandeln" weiter,
die das Zugriffskennzeichen, das in einem Zugriffskennzeichenfeld
(wie z.B. dem Feld 423 "Zugriffskennzeichen
der Klasse B") gespeichert
ist, umwandelt, so dass es auf eine gerade Speicheradresse zeigt.
Folglich greift ein Nicht-Byte-Zugriffsbetriebsart-Speicherzugriff,
der auf einen geraden Versatz vom Zugriffskennzeichen durchgeführt wird,
auf das beabsichtigte Datenstrukturelement zu. Der Prozess 650 "Zugriffskennzeichen
umwandeln" geht
dann zu einer Prozedur 657 "Zugriffskennzeichen im Register umwandeln" nach der Prozedur 655 "Klassenzugriffskennzeichen
umwandeln" weiter.
Die Prozedur 657 "Zugriffskennzeichen
im Register umwandeln" wird
auch erreicht, wenn die Entscheidungsprozedur 653 "ungerades Klassenzugriffskennzeichen" festgestellt hat,
dass das Zugriffskennzeichen der Klasse gerade war. Die Prozedur 657 "Zugriffskennzeichen
im Register umwandeln" wandelt
auch das Zugriffskennzeichen um, das sich im Register befindet,
das von der Prozedur 507 "Abfangroutine empfangen" gespeichert wird. Wenn
die Abfangroutine zurückkehrt,
haben somit anschließende
Zugriffe auf die Klasse unter Verwendung dieses Registers Erfolg.
Ein Fachmann wird verstehen, dass das Register, das das ungerade
Zugriffskennzeichen enthält,
durch Untersuchen des Befehls, der die Abfangroutine während der
Prozedur 509 "Adresse
gewinnen" verursacht
hat, ermittelt wird. Schließlich
endet der Prozess 600 "Zugriffskennzeichen
auffinden" durch
eine "Ende"-Grenzstelle 659.
-
Ein
bevorzugtes Ausführungsbeispiel
wird innerhalb des Prozedurprogrammparadigmas ausgeführt. Ein
weiteres bevorzugtes Ausführungsbeispiel wird
unter Verwendung von Klassen im objektorientierten Programmier-(OOP)
Paradigma ausgeführt. Im
OOP-Paradigma ist die Datenstruktur in einer Klasse enthalten und
das Datenstrukturelement ist eine statische Klassenvariable. Ein
Fachmann wird verstehen, dass die Erfindung verwendet werden kann,
um eine programmierte Operation in Reaktion auf den ersten Speicherzugriff
auf einen Speicherbereich aufzurufen. Ein bevorzugtes Ausführungsbeispiel
wird in Java-Umgebungen verwendet, um statische Klassenvariablen
bei der ersten aktiven Verwendung der Klasse zu initialisieren,
wie für
die Java-Programmiersprachenspezifikation erforderlich.
-
Die
Erfindung ruft effizient eine programmierte Operation auf, wenn
auf eine Datenstruktur oder ein OOP-Objekt zum ersten Mal zugegriffen
wird. Insbesondere stellt die Erfindung einen effizienten Mechanismus
zum Initialisieren von Java-Klassen bei ihrer ersten aktiven Verwendung
bereit.
-
Aus
dem Vorangehenden ist zu erkennen, dass die Erfindung (ohne Begrenzung)
die folgenden Vorteile aufweist:
- 1) Die Laufzeitprüfung für die erste
aktive Verwendung einer Datenstruktur ist für einen Kompiliereroptimierer
transparent.
- 2) Kompiliereroptimierungen von Computerbefehlen, die verwendet
werden, um auf die Datenstruktur zuzugreifen, können sicher solche Computerbefehle
optimieren, ohne spezielle Optimierungsfälle zu erfordern.
- 3) Nur die erste aktive Verwendung der Datenstruktur schafft
irgendeinen Mehraufwand. Anschließende aktive Verwendungen tun
dies nicht.
-
Obwohl
die vorliegende Erfindung hinsichtlich derzeit bevorzugter Ausführungsbeispiele
beschrieben wurde, wird ein Fachmann verstehen, dass verschiedene
Modifikationen und Änderungen vorgenommen
werden können,
ohne vom Schutzbereich der Erfindung abzuweichen. Folglich ist der Schutzbereich
der Erfindung nicht auf die hierin erörterten speziellen Ausführungsbeispiele
der Erfindung begrenzt, sondern sollte nur durch die beigefügten Ansprüche und
deren Äquivalente
festgelegt werden.