Das Schreiben von Code für das Web fühlt sich manchmal ein wenig magisch an, da wir eine Zeichenfolge in eine Datei schreiben, diese Datei in einem Browser ?ffnen und zusehen, wie sie zum Leben erwacht. Aber wenn Sie die Technologie hinter der Magie verstehen, k?nnen Sie Ihr Handwerk als Programmierer besser verfeinern.
In diesem Artikel erfahren Sie, was hinter den Kulissen in einem JavaScript-basierten Web- oder Mobil-Stack vor sich geht, indem Sie die Komplexit?t der JavaScript-Engines verstehen, die Browser antreiben. Lassen Sie uns zusammenfassen, was eine JavaScript-Engine macht, warum verschiedene Plattformen unterschiedliche Engines verwenden, wie sie sich im Laufe der Jahre weiterentwickelt haben und warum es uns als Entwickler wichtig sein sollte.
Zun?chst ein wenig Terminologie
Eine ?JavaScript-Engine“ wird oft als eine Art virtuelle Maschine bezeichnet. Eine ?virtuelle Maschine“ bezieht sich auf die softwaregesteuerte Emulation eines bestimmten Computersystems. Es gibt viele Arten von virtuellen Maschinen, und sie werden danach klassifiziert, wie genau sie tats?chliche physische Maschinen emulieren oder ersetzen k?nnen.
Eine ?virtuelle Systemmaschine“ stellt beispielsweise eine vollst?ndige Emulation einer Plattform bereit, auf der ein Betriebssystem ausgeführt werden kann. Mac-Benutzer kennen m?glicherweise Parallels, eine virtuelle Systemmaschine, mit der Sie Windows auf Ihrem Mac ausführen k?nnen.
Eine ?virtuelle Prozessmaschine“ hingegen ist weniger voll funktionsf?hig und kann ein Programm oder einen Prozess ausführen. Wine ist eine virtuelle Prozessmaschine, die es Ihnen erm?glicht, Windows-Anwendungen auf einer Linux-Maschine auszuführen, aber kein vollst?ndiges Windows-Betriebssystem auf einer Linux-Box bereitstellt.
Eine JavaScript-Engine ist eine Art virtuelle Prozessmaschine, die speziell für die Interpretation und Ausführung von JavaScript-Code entwickelt wurde.
Hinweis: Es ist wichtig, zwischen den Engines, die einen Browser durch die Gestaltung von Webseiten antreiben, und der untergeordneten JavaScript-Engine, die Code interpretiert und ausführt, zu unterscheiden. Eine gute Erkl?rung zur Funktionsweise von Browsern finden Sie in diesem Artikel.
Was genau ist eine JavaScript-Engine und was macht sie?
Letztendlich besteht die grundlegende Aufgabe einer JavaScript-Engine darin, den von einem Entwickler geschriebenen JavaScript-Code in schnellen, optimierten Code umzuwandeln, der von einem Browser interpretiert oder sogar in eine Anwendung eingebettet werden kann. Tats?chlich bezeichnet sich JavaScriptCore selbst als ?optimierende virtuelle Maschine“.
Genauer gesagt implementiert jede JavaScript-Engine eine Version von ECMAScript, wovon JavaScript ein Dialekt ist. Mit der Weiterentwicklung von ECMAScript entwickeln sich auch die JavaScript-Engines weiter. Der Grund dafür, dass es so viele verschiedene Engines gibt, ist, dass jede für die Arbeit mit einem anderen Webbrowser, einem Headless-Browser oder einer Laufzeit wie Node.js konzipiert ist.
Sie sind wahrscheinlich mit Webbrowsern vertraut, aber was ist ein Headless-Browser? Es handelt sich um einen Webbrowser ohne grafische Benutzeroberfl?che. Sie sind nützlich, um automatisierte Tests für Ihre Webprodukte durchzuführen. Seit Version 59 von Chrome und Version 56 von Firefox k?nnen auf diese Weise auch normale Browser verwendet werden, insbesondere zu Testzwecken. Und wo passt Node.js da hinein? Node.js ist ein asynchrones, ereignisgesteuertes Framework, das Ihnen die serverseitige Verwendung von JavaScript erm?glicht. Da es sich um JavaScript-gesteuerte Tools handelt, werden sie von JavaScript-Engines unterstützt.
Angesichts der obigen Definition einer virtuellen Maschine ist es sinnvoll, eine JavaScript-Engine als virtuelle Prozessmaschine zu bezeichnen, da ihr einziger Zweck darin besteht, JavaScript-Code zu lesen und zu kompilieren. Das bedeutet nicht, dass es sich um einen einfachen Motor handelt. JavaScriptCore verfügt beispielsweise über sechs ?Bausteine“, die JavaScript-Code analysieren, interpretieren, optimieren und im Müll sammeln.
Wie funktioniert das?
Das h?ngt vom Motor ab. Betrachten wir zwei wichtige Engines: WebKits JavaScriptCore und Googles V8-Engine. Diese beiden Engines verarbeiten den Verarbeitungscode unterschiedlich.
JavaScriptCore führt eine Reihe von Schritten aus, um ein Skript zu interpretieren und zu optimieren:
Es führt eine lexikalische Analyse durch und zerlegt die Quelle in eine Reihe von Tokens oder Zeichenfolgen mit einer identifizierten Bedeutung.
Die Token werden dann vom Parser auf Syntax analysiert und in einen Syntaxbaum eingebaut.
Vier JIT-Prozesse (Just-in-Time) werden dann aktiviert und analysieren und führen den vom Parser erzeugten Bytecode aus.
Einfach ausgedrückt nimmt diese JavaScript-Engine Ihren Quellcode, zerlegt ihn in Strings (oder lexiert ihn), wandelt diese Strings in Bytecode um, den ein Compiler verstehen kann, und führt ihn dann aus.
Die in C geschriebene V8-Engine von Google kompiliert und führt auch JavaScript-Quellcode aus, kümmert sich um die Speicherzuweisung und sammelt Reste durch Müll. Sein Design besteht aus einer Compiler-Pipeline, die Quellcode direkt in Maschinencode kompiliert:
Ignition, der Interpreter, der Bytecode generiert
TurboFan, ein optimierender Compiler, der diesen Bytecode in Maschinencode kompiliert
SparkPlug, ein Compiler, der TurboFan erg?nzt
Wenn Sie sich für die Geschichte interessieren: Diese neue Pipeline ersetzte das ?ltere Full-Codegen- und Crankshaft-Doppel-Compiler-Design, das zuvor von V8 verwendet wurde.
Sobald Maschinencode durch den Kompilierungsprozess erzeugt wird, stellt die Engine alle im ECMA-Standard angegebenen Datentypen, Operatoren, Objekte und Funktionen dem Browser oder jeder Laufzeit zur Verfügung, die sie verwenden muss, wie z. B. Node.js. Deno oder Electron (wird von Visual Studio Code verwendet).
Ein kleiner Umweg: Laufzeiten
Wenn JavaScript-Engines leise im Hintergrund laufen, Code analysieren und ihn in lesbare Zeichenfolgen aufteilen, damit ein Compiler ihn lesen und kompilieren kann, ziehen Laufzeiten tendenziell mehr Aufmerksamkeit auf sich. Warum ist das so?
Bekannte Laufzeiten arbeiten auf JavaScript-Engines und erweitern so deren Leistung. Der bekannteste ist Node, aber Deno und Bun sind Neulinge in der Arena. Node und Deno betten V8 ein und Bun bettet JavaScriptCore ein.
Bun behauptet, schneller zu laufen als Node oder Deno, weil JavaScriptCore schneller als V8 ist und 69.845 HTTP-Anfragen pro Sekunde verarbeitet, gegenüber 16.288 für Node und 12.926 für Deno.
Das Ziel dieser Laufzeiten besteht laut Buns Dokumenten darin, ?das meiste JavaScript der Welt au?erhalb von Browsern auszuführen und so Leistungs- und Komplexit?tsverbesserungen für Ihre zukünftige Infrastruktur sowie Entwicklerproduktivit?t durch bessere, einfachere Tools zu erzielen.“ Diese Laufzeiten nutzen tats?chlich die Leistungsf?higkeit von JavaScript-Engines, um JavaScript au?erhalb von Browsern ausführen zu k?nnen.
NativeScript ist ein gutes Beispiel für eine Laufzeitumgebung, die speziell für die plattformübergreifende Entwicklung nativer mobiler Anwendungen mit JavaScript entwickelt wurde.
Diese Laufzeiten wurden auch entwickelt, um einige der inh?renten Probleme zu l?sen, die die Single-Thread-Architektur von JavaScript mit sich bringt. Node priorisiert beispielsweise die asynchrone, threadlose Ausführung von Routinen. Alle diese Laufzeiten bieten ein kuratiertes Entwicklererlebnis, einschlie?lich integrierter Unterstützung für beliebte APIs wie Fetch, Websocket und sogar JSX, das bei React-Entwicklern beliebt ist. Dies k?nnte der Grund dafür sein, dass sie dazu neigen, die Aufmerksamkeit der Entwickler auf sich zu ziehen.
Laufzeiten schlie?en insgesamt wahrgenommene Lücken in der Leistung der Standardbrowserarchitektur und der Engines, die sie antreiben. Mit der Weiterentwicklung der Motoren werden sich sicherlich auch diese Laufzeiten weiterentwickeln.
Welche JavaScript-Engines gibt es?
Es steht eine gro?e Auswahl an JavaScript-Engines zum Analysieren, Parsen und Ausführen Ihres clientseitigen Codes zur Verfügung. Mit jeder Ver?ffentlichung einer Browserversion wird die JavaScript-Engine m?glicherweise ge?ndert oder optimiert, um mit dem neuesten Stand der Technik bei der Ausführung von JavaScript-Code Schritt zu halten.
Bevor Sie sich v?llig durch die Namen dieser Engines verwirren lassen, sollten Sie bedenken, dass in diese Engines und die ihnen zugrunde liegenden Browser eine Menge Marketing-Push gesteckt wird. In dieser nützlichen Analyse der JavaScript-Kompilierung bemerkt der Autor ironisch: ?Falls Sie es nicht wussten: Compiler bestehen zu etwa 37 % aus Marketing, und Rebranding ist eines der wenigen Dinge, die Sie einem Compiler marketingtechnisch antun k?nnen.“ daher der Name Zug: SquirrelFish, Nitro, SFX..."
W?hrend wir das Auf und Ab bei der Benennung und Umbenennung dieser Engines im Hinterkopf behalten, ist es nützlich, einige der wichtigsten Ereignisse in der Geschichte der JavaScript-Engine zu beachten. Ich habe eine praktische Tabelle für Sie zusammengestellt:
Browser, Headless Browser, or Runtime | JavaScript Engine |
---|---|
Mozilla | Spidermonkey |
Chrome | V8 |
IE | Chakra |
Safari | JavaScriptCore* |
Node.js | V8 |
Deno | V8 |
Bun | JavaScriptCore |
Edge** | Blink and V8 |
*JavaScriptCore wurde in SquirrelFish umgeschrieben und in SquirrelFish Extreme, auch Nitro genannt, umbenannt. Es ist jedoch immer noch eine wahre Aussage, JavaScriptCore als die JavaScript-Engine zu bezeichnen, die WebKit-Implementierungen (wie Safari) zugrunde liegt.
**Edge verwendete ursprünglich die Chakra-Engine, von der Microsoft einige als Open Source bereitgestellt hat. Edge wurde dann als Chromium-Browser umgebaut, mit Blink- und V8-JavaScript-Engines unter der Haube.
Warum sollte es uns interessieren?
Das Ziel des Code-Parsing- und Ausführungsprozesses einer JavaScript-Engine besteht darin, in kürzester Zeit den bestm?glichen Code zu generieren.
Unterm Strich geht die Weiterentwicklung dieser Engines mit unserem Bestreben einher, die Web- und mobilen Umgebungen weiterzuentwickeln, um sie so leistungsf?hig wie m?glich zu machen. Um diese Entwicklung zu verfolgen, k?nnen Sie die Leistung verschiedener Engines in Benchmarking-Grafiken sehen, wie sie beispielsweise auf arewefastyet.com erstellt wurden.
Jeder Webentwickler muss sich der Unterschiede bewusst sein, die den Browsern innewohnen, die den Code anzeigen, an dessen Erstellung, Fehlerbehebung und Wartung wir so hart arbeiten. Warum funktionieren bestimmte Skripte in einem Browser langsam, in einem anderen jedoch schneller?
In ?hnlicher Weise m?chten mobile Entwickler, insbesondere diejenigen, die hybride mobile Apps schreiben, die eine Webansicht zur Anzeige ihrer Inhalte verwenden, wissen, welche Engines ihren JavaScript-Code interpretieren. Alle Webentwickler, denen das Benutzererlebnis am Herzen liegt, sollten die Einschr?nkungen und M?glichkeiten verstehen, die die verschiedenen Browser auf ihren kleinen Ger?ten bieten. Bleiben Sie über die ?nderungen in
auf dem Laufenden
JavaScript-Engines sind eine gute Zeit, wenn Sie sich als Web-, Mobil- oder App-Entwickler weiterentwickeln.
Dieser Artikel erschien ursprünglich im Jahr 2015 im Telerik Developer Network und wurde seitdem für 2022 und darüber hinaus überarbeitet und aktualisiert. Der Originalartikel wird auf Wikipedia im Eintrag ?JavaScript Engines“ zitiert.
?
Das obige ist der detaillierte Inhalt vonWas sind JavaScript-Engines?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Es gibt drei g?ngige M?glichkeiten, HTTP-Anforderungen in Node.js zu initiieren: Verwenden Sie integrierte Module, Axios und Knotenfetch. 1. Verwenden Sie das integrierte HTTP/HTTPS-Modul ohne Abh?ngigkeiten, das für grundlegende Szenarien geeignet ist, jedoch eine manuelle Verarbeitung von Datengen?hten und Fehlerüberwachung erfordert, z. 2.Axios ist eine auf Versprechen basierende Bibliothek von Drittanbietern. Es verfügt über eine kurze Syntax und leistungsstarke Funktionen, unterstützt Async/Auseait, automatische JSON -Konvertierung, Interceptor usw. Es wird empfohlen, asynchrone Anforderungsvorg?nge zu vereinfachen. 3.Node-Fetch bietet einen Stil ?hnlich dem Browser-Abruf, basierend auf Versprechen und einfacher Syntax

JavaScript -Datentypen sind in primitive Typen und Referenztypen unterteilt. Zu den primitiven Typen geh?ren String, Anzahl, Boolesche, Null, undefiniertes und Symbol. Die Werte sind unver?nderlich und Kopien werden bei der Zuweisung von Werten kopiert, sodass sie sich nicht gegenseitig beeinflussen. Referenztypen wie Objekte, Arrays und Funktionen speichern Speicheradressen, und Variablen, die auf dasselbe Objekt zeigen, wirkt sich gegenseitig aus. Typeof und Instanz k?nnen verwendet werden, um die Typen zu bestimmen, aber auf die historischen Probleme der TypeOfnull zu achten. Das Verst?ndnis dieser beiden Arten von Unterschieden kann dazu beitragen, einen stabileren und zuverl?ssigeren Code zu schreiben.

Welches JavaScript -Framework ist die beste Wahl? Die Antwort besteht darin, die am besten geeigneten nach Ihren Bedürfnissen zu w?hlen. 1.React ist flexibel und kostenlos und für mittlere und gro?e Projekte geeignet, für die hohe Anpassungs- und Teamarchitekturf?higkeiten erforderlich sind. 2. Angular bietet vollst?ndige L?sungen, die für Anwendungen auf Unternehmensebene und langfristige Wartung geeignet sind. 3.. Vue ist einfach zu bedienen, geeignet für kleine und mittlere Projekte oder schnelle Entwicklung. Unabh?ngig davon, ob es einen technologischen Stack, die Teamgr??e, der Projektlebenszyklus gibt und ob SSR erforderlich ist, sind auch wichtige Faktoren für die Auswahl eines Rahmens. Kurz gesagt, es gibt keinen absolut besten Rahmen, die beste Wahl ist die, die Ihren Bedürfnissen entspricht.

Hallo, JavaScript -Entwickler! Willkommen in den JavaScript -Nachrichten dieser Woche! Diese Woche konzentrieren wir uns auf: Oracas Markenstreit mit Deno, neue JavaScript -Zeitobjekte werden von Browsern, Google Chrome -Updates und einigen leistungsstarken Entwickler -Tools unterstützt. Fangen wir an! Der Markenstreit von Oracle mit dem Versuch von Deno Oracle, ein "JavaScript" -Marke zu registrieren, hat Kontroversen verursacht. Ryan Dahl, der Sch?pfer von Node.js und Deno, hat eine Petition zur Absage der Marke eingereicht, und er glaubt, dass JavaScript ein offener Standard ist und nicht von Oracle verwendet werden sollte

Cacheapi ist ein Tool, das der Browser zur Cache -Netzwerkanfragen bereitstellt, das h?ufig in Verbindung mit dem Servicearbeiter verwendet wird, um die Leistung der Website und die Offline -Erfahrung zu verbessern. 1. Es erm?glicht Entwicklern, Ressourcen wie Skripte, Stilbl?tter, Bilder usw. Zu speichern; 2. Es kann die Cache -Antworten entsprechend den Anfragen übereinstimmen. 3. Es unterstützt das L?schen bestimmter Caches oder das L?schen des gesamten Cache. 4.. Es kann Cache -Priorit?ts- oder Netzwerkpriorit?tsstrategien durch Servicearbeiter implementieren, die sich auf Fetch -Ereignisse anh?ren. 5. Es wird h?ufig für die Offline -Unterstützung verwendet, die wiederholte Zugriffsgeschwindigkeit, die Vorspannungs -Schlüsselressourcen und den Inhalt des Hintergrundaktualisierungss beschleunigen. 6. Wenn Sie es verwenden, müssen Sie auf die Cache -Versionskontrolle, Speicherbeschr?nkungen und den Unterschied zum HTTP -Caching -Mechanismus achten.

Versprechen ist der Kernmechanismus für den Umgang mit asynchronen Operationen in JavaScript. Das Verst?ndnis von Kettenanrufen, Fehlerbehebung und Kombination ist der Schlüssel zum Beherrschen ihrer Anwendungen. 1. Der Kettenaufruf gibt ein neues Versprechen durch .then () zurück, um asynchrone Prozessverkampferung zu realisieren. Jeder. Dann () erh?lt das vorherige Ergebnis und kann einen Wert oder ein Versprechen zurückgeben; 2. Die Fehlerbehandlung sollte .Catch () verwenden, um Ausnahmen zu fangen, um stille Ausf?lle zu vermeiden, und den Standardwert im Fang zurückgeben, um den Prozess fortzusetzen. 3. Combinatoren wie Promise.All () (erfolgreich erfolgreich erfolgreich nach allen Erfolg), Versprechen.Race () (Die erste Fertigstellung wird zurückgegeben) und Versprechen.Allsettled () (Warten auf alle Fertigstellungen)

JavaScript-Array-integrierte Methoden wie .Map (), .filter () und .Reduce () k?nnen die Datenverarbeitung vereinfachen. 1) .Map () wird verwendet, um Elemente eins in eins um Neuarrays zu konvertieren; 2) .Filter () wird verwendet, um Elemente durch Bedingung zu filtern; 3) .Reduce () wird verwendet, um Daten als einzelner Wert zu aggregieren; Missbrauch sollte bei der Verwendung vermieden werden, was zu Nebenwirkungen oder Leistungsproblemen führt.

Die Ereignisschleife von JavaScript verwaltet asynchrone Vorg?nge, indem sie Call -Stapel, Webapis und Task -Warteschlangen koordinieren. 1. Der Anrufstack führt synchronen Code aus, und wenn er auf asynchrone Aufgaben begegnet, wird er zur Verarbeitung an Webapi übergeben. 2. Nachdem das Webapi die Aufgabe im Hintergrund abgeschlossen hat, wird der Rückruf in die entsprechende Warteschlange (Makroaufgabe oder Micro -Aufgabe) eingebaut. 3. Die Ereignisschleife prüft, ob der Anrufstapel leer ist. Wenn es leer ist, wird der Rückruf aus der Warteschlange herausgenommen und zur Ausführung in den Anrufstapel geschoben. V. 5. Das Verst?ndnis der Ereignisschleife hilft zu vermeiden, den Haupt -Thread zu blockieren und die Codeausführungsreihenfolge zu optimieren.
