Einführung
... [ Seminar Programmiersprachen und virtuelle Maschinen ] ... [ Google's V8 ] ...
[ << Inhaltsverzeichnis ] ... [ Schlüssel Elemente >> ] ...
Übersicht: Einführung
JavaScript
JavaScript ist eine prototypische, klassen- und typlose Sprache, die in C++ ähnlicher Syntax daherkommt. Vererbung erfolgt über Prototypen, d.h. über ein Attribut kann man
angeben, von welchem Objekt man Attribute und Methoden erbt. Allerdings wird dieser Prototyp nur in Betracht gezogen, wenn das eigene Objekt das gesuchte Attribut bzw. die gesuchte
Methode nicht selbst besitzt. Wird auch im Prototyp das gesuchte Element nicht gefunden, wird die Prototypen-Kette traversiert, bis das gesuchte Element gefunden oder die Kette zu Ende ist.
Außerdem ist JavaScript sehr dynamisch, da Attribute und Eigenschaften zur Laufzeit hinzugefügt und wieder entfernt werden können. Auch der Prototyp lässt sich zur Laufzeit
ändern.
Beispiel:
1 var parent = { a : 1 };
2
3 function child() {
4 this.a = 3;
5 }
6 child.prototype = parent;
7
8 var ownObject = new child();
9 alert( ownObject.a ); // zeigt den Wert 3 an
10 delete ownObject.a; // löscht den Wert a von ownObject
11 alert( ownObject.a ); // zeigt den Wert 1 vom Prototypen parent an
12
13 ownObject.hasOwnProperty( 'a' ); // false
In Zeile 6 wird der Prototyp von der child
-Funktion auf das parent
-Objekt gesetzt. Dadurch bekommen alle Objekte, die mit der child
-Funktion
erzeugt werden, als Prototypen das parent
-Objekt.
In Zeile 10 wird nun das eigene Attribut von ownObject
gelöscht. Dadurch verändert sich die Ausgabe von 3 auf 1, da der Wert jetzt aus dem Prototyp kommt.
Motivation für Google
Im Jahr 2006 waren Webbrowser bei der Ausfühung von JavaScript sehr langsam, da die JavaScript Engines der Browser den Code nur interpretierten. Außerdem skalierten diese den Speicherbedarf
nicht im Kontext zur Codelänge und Objektallokation. Dieses Problem wurde dann häfig umgangen, indem vermieden wurde, Objekte zu alloziieren.
Es gab zudem lange Unterbrechungen, aufgrund von schlechtem Speichermanagement. Jedes Mal wenn neuer Speicher benötigt wurde, wurden alle Objekte betrachtet. Auch Speicherlecks waren
keine Seltenheit.
Lösung von Google
Eine komplett neue Engine, die JavaScript wie eine statisch getypte, objekt-orientierte Sprache behandelt. Die außerdem die sehr dynamischen Objekte in Klassen kategoriziert, damit bekannte
Techniken aus statischen, klassenbasierten Klassen genutzt werden können.
Herausforderungen und Ziele
JavaScript ist sehr dynamisch, da Attribute und Methoden zur Laufzeit hinzugefügt und entfernt werden können, und die Prototypen Reihenfolge jederzeit geändert werden kann.
Auch sind Attribute und Methoden von Objekten in Hashmaps abgelegt, was den Zugriff verlangsamt.
Die Sprachfeatures eval
und with
erschweren zusätzlich den Zugriff auf Attribute und Methoden. eval
wertet Strings als JavaScript aus, wodurch
man zunächst keine Ahnung hat, wo Attribute und Eigenschaften der Objekte liegen. Mit with
kann man dynamisch den Geltungsbereich von Funktionen auf ein Objekt ändern,
wodurch auch hier zunächst keine Angaben über Ort von Attributen und Eigenschaften gemacht werden können.
Ziele für die V8
Selbst große Programme müssen schnell laufen. Der Zugriff auf Eigenschaften und Funktionsaufrufe soll optimiert werden und die Speicherverwaltung schnell und skalierbar sein. Dies
wurde mit Hilfe von Hidden Classes und Hidden Class Transitions, Generierung von nativem Maschinencode mit Inline Caching, sowie einem effizienten Speichermanagement erzielt.
... [ Seminar Programmiersprachen und virtuelle Maschinen ] ... [ Google's V8 ] ...
[ << Inhaltsverzeichnis ] ... [ Schlüssel Elemente >> ] ... [ nach oben ] ...