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.
Wenn Firefox für welche Plattform kompiliert wird? –
@i_am_jorf, Auf Linux x86_64. – merlin2011
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