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.
[ nach oben ]



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.
[ nach oben ]



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.
[ nach oben ]


... [ Seminar Programmiersprachen und virtuelle Maschinen ] ... [ Google's V8 ] ... [ << Inhaltsverzeichnis ] ... [ Schlüssel Elemente >> ] ... [ nach oben ] ...