2017-05-05 6 views
0

Ich schaue durch die Firefox source code und versuche, die Quelle für die Hauptschleife zu ermitteln, die alle Ereignishandler in Javascript ausführt.Wo ist die Hauptereignisschleife im Firefox-Quellcode?

Ich habe über this overview der Verzeichnisstruktur geschaut, aber ich kann immer noch nicht die Ereignisschleife finden.

Welche Quellzeilen sollte ich suchen, um die Hauptereignisschleife zu finden?

Update: Ich baue und laufe Firefox auf Linux x86_64.

+0

Wenn Firefox für welche Plattform kompiliert wird? –

+0

@i_am_jorf, Auf Linux x86_64. – merlin2011

+0

JavaScript-Engines sind unglaublich komplexe Biester, besonders wenn man Dinge wie JIT-Kompilierung, Worker-Threads usw. in Betracht zieht - es gibt also keine einzige "Main Event Loop" - es ist komplizierter. – Dai

Antwort

1

Disclaimer: Ich habe zwischen 2014 und 2015 bei Microsoft an der Chakra-JavaScript-Engine gearbeitet.

Die JavaScript-Engine von Firefox heißt SpiderMonkey und kann als separates Projekt betrachtet werden - und sie kann auch von anderen Anwendungen verwendet werden (https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/How_to_embed_the_JavaScript_engine).

Moderne JavaScript-Engines sind JIT-basiert: Sie interpretieren Code nicht in einer riesigen Schleife - stattdessen kompilieren sie JavaScript-Funktionen in nativen Code - effektiv ihr eigenes Programm, und dieses dynamisch generierte Programm wird seinen eigenen Event-Flow haben es ist nicht unbedingt eine "Schleife" - und es gibt auch nicht unbedingt "ein" individuelles Programm - weil es von der JavaScript-Hosting-Umgebung abhängt: Eine Webseite kann mehrere JavaScript- "Worker" gleichzeitig ausführen (die als verschiedene Threads agieren) Dies ist jenseits des aktuellen asynchronen Modells von JavaScript. Beachten Sie auch, dass "Firefox" nur ein Wrapper um Gecko ist - und Firefox mehrere Gecko-Instanzen nebeneinander und in verschiedenen Laufzeit-Worker-Prozessen ausführt.

Das heißt, so ziemlich alle JIT-JavaScript-Engines behalten ihre Interpreter - Chakra - weil der JIT-Prozess eine Weile dauert, so dass sie zunächst Skript im interpretierten Modus für sofortige Ergebnisse ausführen - und der Interpreter Teil der Engine möglicherweise sowie eine vollständig unabhängige JavaScript-Engine-Implementierung (Ignorieren der Parser- und Standardbibliothekskomponenten).

Es ist fast 18 Monate her, seit ich das letzte Mal mit dem Chakra Quellcode (it's open-source now) gearbeitet, aber von dem, was ich mich erinnere (und ohne meine NDA Bruch) die einzige wirkliche Haupt „Schleife“ in Chakra der Interpreter Schleife war (ein riesiger switch Aussage für den aktuellen Opcode enum Wert) - die Event-Handler wurden durch asynchrone IO behandelt - so ist es eigentlich bis zum Chakra-Host, um die asynchrone IO-Funktionalität zur Verfügung zu stellen - kurz gesagt, es gibt keine "Event-Schleife". Ich wäre überrascht, wenn Firefox's SpiderMonkey oder Chrome's V8 nicht auf der gleichen Basis funktionieren würde.

+0

Ich werde die Frage später heute Abend bearbeiten, aber ich denke, was ich zu bestimmen versuche, ist der Code-Pfad, der die Handler aufruft. Wenn die js vor der Verwendung JIT ist, muss Code vorhanden sein, der den kompilierten Code aufruft. – merlin2011

+0

@ merlin2011 Das klingt nach einem XY-Problem (http://xyproblem.info/) - was ist Ihr eigentliches Ziel? Wenn Sie mehr über JavaScript-Engines erfahren möchten, gibt es bessere Möglichkeiten, als sich auf diesen einzelnen Aspekt zu konzentrieren. – Dai

+0

Hier ist mein eigentliches Ziel: https://superuser.com/questions/1205185/is-it-possible-to-disable-javascript-without-reloading-the-page-in-moder-firefo – merlin2011