Was den Titel dieses Artikels betrifft, glaube ich nicht, dass die Leute, die diesen Artikel geschrieben oder gelesen haben, Idioten sind. Aber manchmal kommt man sich bei einem Thema wie ein Idiot vor, und JavaScript-Engines sind eines dieser Themen, zumindest für mich.
Manchmal fühlt sich das Schreiben von Code für eine Webanwendung wie Magie an, weil wir einfach eine Reihe von Zeichen schreiben und die Wirkung im Browser sehen. Aber wenn Sie die Technologie hinter der Magie verstehen, können Sie Ihre Programmierkenntnisse verbessern. Zumindest werden Sie sich weniger wie ein Idiot fühlen, wenn Sie versuchen zu erklären, was sich hinter den Kulissen einer JavaScript-basierten Web- oder Mobil-App abspielt.
Vor vielen Jahren, als ich Dozent war, beschwerte ich mich bei einem Professor, dass ich die besonders schwierigen Punkte der französischen Grammatik, die ich meinen Studenten beibringen konnte, noch nicht beherrschte. Ich erinnere mich, was sie damals sagte: „Manchmal kann man etwas nur lernen, indem man es lehrt.“
Versuchen Sie Ingenieuren zu erklären, wie NativeScript hinter den Kulissen über eine JavaScript-Engine funktioniert und native APIs zur Laufzeit verbindet und aufruft – bei einer so komplexen Aufgabe kann man sich leicht im Chaos verlieren. Tatsächlich sollte jeder JavaScript-Entwickler neugierig auf die Engine sein, die der Technologie zugrunde liegt, die wir täglich verwenden. Schauen wir uns nun genauer an, was JavaScript-Engines tatsächlich tun, warum verschiedene Plattformen unterschiedliche Engines verwenden, wie sie sich im Laufe der Jahre weiterentwickelt haben und warum wir uns als Entwickler darum kümmern sollten.
Zuerst einige Fachbegriffe
Eine „JavaScript-Engine“ wird oft als virtuelle Maschine bezeichnet. Eine „virtuelle Maschine“ bezieht sich auf einen softwaregesteuerten Emulator eines bestimmten Computersystems. Es gibt viele Arten virtueller Maschinen, die danach klassifiziert werden, wie genau sie eine reale physische Maschine simulieren oder ersetzen.Zum Beispiel stellt die „System Virtual Machine“ eine vollständige Emulationsplattform bereit, auf der ein Betriebssystem ausgeführt werden kann. Parallels, mit dem Mac-Benutzer vertraut sind, ist eine virtuelle Maschine, mit der Sie Windows-Systeme auf Ihrem Mac ausführen können.
Andererseits verfügt die „virtuelle Prozessmaschine“ nicht über alle Funktionen 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 unter Linux bereitstellt.
Die virtuelle JavaScript-Maschine ist eine virtuelle Prozessmaschine, die speziell für die Interpretation und Ausführung von JavaScript-Code entwickelt wurde.
Hinweis: Es ist wichtig, zwischen der Layout-Engine, die das Seitenlayout im Browser gestaltet, und der zugrunde liegenden JavaScript-Engine, die Code interpretiert und ausführt, zu unterscheiden. Eine gute Erklärung finden Sie hier.
Was genau ist eine JavaScript-Engine und was macht sie?
Die grundlegende Aufgabe einer JavaScript-Engine besteht darin, von Entwicklern geschriebenen JavaScript-Code in effizienten, optimierten Code umzuwandeln, der vom Browser interpretiert oder sogar in Anwendungen eingebettet werden kann. Tatsächlich bezeichnet sich JavaScriptCore selbst als „optimierte virtuelle Maschine“.Genauer gesagt implementiert jede JavaScript-Engine eine Version von ECMAScript, von dem JavaScript ein Fork ist. Während ECMAScript sich weiterentwickelt, verbessert sich auch die JavaScript-Engine weiter. Der Grund dafür, dass es so viele verschiedene Engines gibt, liegt darin, dass jede von ihnen für die Ausführung in einem anderen Webbrowser, Headless-Browser oder einer anderen Laufzeitumgebung wie Node.js konzipiert ist.
Sie sind vielleicht mit Webbrowsern vertraut, aber was ist ein Headless-Browser? Es handelt sich um einen Webbrowser ohne grafische Benutzeroberfläche. Sie sind nützlich, wenn Sie das Testen von Webprodukten automatisieren. Ein gutes Beispiel ist PhantomJS. Was hat Node.js also mit der JavaScript-Engine zu tun? Node.js ist ein asynchrones, ereignisgesteuertes Framework, mit dem Sie JavaScript serverseitig verwenden können. Da es sich um Tools handelt, die JavaScript unterstützen, werden sie auch von JavaScript-Engines unterstützt.
Gemäß der obigen Definition einer virtuellen Maschine ist es leicht zu verstehen, dass die JavaScript-Engine als virtuelle Prozessmaschine bezeichnet wird, da ihr einziger Zweck darin besteht, JavaScript-Code zu lesen und zu kompilieren. Das bedeutet nicht, dass es nur ein einfacher Motor ist. Beispielsweise verfügt JavaScriptCore über sechs „Bausteine“, mit denen JavaScript-Code analysiert, interpretiert, optimiert und durch Garbage Collection gesammelt werden kann.
Wie funktioniert es?
Das hängt natürlich vom Motor ab. Die beiden Haupt-Engines, die unsere Aufmerksamkeit erregt haben, sind JavaScriptCore von WebKit und die V8-Engine von Google, die beide NativeScript nutzen. Die beiden Engines verarbeiten Code auf unterschiedliche Weise.
JavaScriptCore führt eine Reihe von Schritten aus, um Skripte zu interpretieren und zu optimieren:
Es führt eine lexikalische Analyse durch, bei der der Quellcode in eine Reihe von Symbolen oder Zeichenfolgen mit klarer Bedeutung zerlegt wird.
Diese Symbole werden dann mit einem Syntaxanalysator analysiert, um einen Syntaxbaum zu erstellen.
Dann beginnen vier JIT-Prozesse (Just-In-Time) mitzuwirken, die den vom Parser generierten Bytecode analysieren und ausführen.
Was? Einfach ausgedrückt lädt die JavaScript-Engine Ihren Quellcode, zerlegt ihn in Zeichenfolgen (auch Tokenisierung genannt), wandelt diese Zeichenfolgen in Bytecodes um, die der Compiler verstehen kann, und führt diese Bytecodes dann aus.
Googles V8-Engine ist in C geschrieben und kann auch JavaScript-Quellcode kompilieren und ausführen sowie die Speicherzuweisung und Garbage Collection übernehmen. Es ist so konzipiert, dass es aus zwei Compilern besteht, die Quellcode direkt in Maschinencode kompilieren können:
Vollständige Codegenerierung: ein schneller Compiler, der nicht optimierten Code ausgibt
Kurbelwelle: Ein langsamer Compiler, der effizienten, optimierten Code ausgibt
Wenn Crankshaft feststellt, dass es sich bei dem Code, der optimiert werden muss, um nicht optimierten Code handelt, der von Full-Codegen generiert wurde, wird Full-Codegen ersetzt, ein Prozess namens „Crankshafting“.
Sobald der Maschinencode während des Kompilierungsprozesses generiert wird, stellt die Engine dem Browser alle im ECMA-Standard spezifizierten Datentypen, Operatoren, Objekte, Funktionen oder alles, was zur Laufzeit benötigt wird, zur Verfügung, wie dies bei der Fall ist NativeScript.
Welche JavaScript-Engines gibt es?
Es gibt eine schwindelerregende Vielfalt an JavaScript-Engines, die zum Interpretieren, Analysieren und Ausführen Ihres clientseitigen Codes verwendet werden können. Mit der Veröffentlichung jeder Browserversion kann die JavaScript-Engine geändert oder optimiert werden, um mit den Änderungen in der Technologie zur Ausführung von JavaScript-Code Schritt zu halten.
Bevor Sie sich von den Namen dieser Browser-Engines völlig verwirren lassen, denken Sie daran, dass viel Marketing in diese Engines und die darauf basierenden Browser fließt. In dieser sehr nützlichen Analyse der JavaScript-Kompilierung weist der Autor sarkastisch darauf hin: „Was Sie nicht wissen, ist, dass Compiler zu etwa 37 % vermarktet werden und das Rebranding eines Compilers eines der wenigen Dinge ist, die Sie tun können. Eines der wenigen Dinge.“ , smartes Marketing, daher der Name: SquirrelFish, Nitro, SFX..."
Während man den Einfluss des Marketings auf die Benennung und Umbenennung dieser Engines berücksichtigt, ist es nützlich, einige wichtige Ereignisse in der Geschichte der JavaScript-Engines zu beachten. Ich habe eine leicht verständliche Tabelle für Sie erstellt:
Browser, Headless Browser oder Runtime | JavaScript Engine |
---|---|
Mozilla | Spinnenaffe |
Chrom | V8 |
Safari | JavaScriptCore |
IE und Edge | Chakra |
PhantomJS | JavaScriptCore |
HTMLUnit | Nashorn |
TrifleJS | V8 |
Node.js | V8 |
Io.js* | V8 |
*JavaScriptCore telah ditulis semula sebagai SquirrelFish, dan versi yang dipertingkatkan ialah QuirrelFish Extreme, juga dipanggil Nitro. Walau bagaimanapun, enjin JavaScript yang menjadi asas pelaksanaan Webkit ialah JavaScriptCore (seperti Safari).
**Pembangun iOS sepatutnya tahu bahawa Safari pada peranti mudah alih menggunakan Nitro, tetapi UIWebView tidak menyertakan kompilasi JIT, jadi pengalaman akan menjadi lebih perlahan. Walau bagaimanapun, pembangun boleh menggunakan WKWebView termasuk Nitro dalam iOS8, dan pengalaman menjadi lebih pantas dengan ketara. Pembangun aplikasi mudah alih hibrid sepatutnya boleh menarik nafas lega.
*Salah satu sebab mengapa io.js akhirnya berpisah daripada Node.js adalah untuk menyokong enjin versi V8. Ini kekal sebagai cabaran, seperti yang diceritakan di sini.
Mengapa kita perlu memberi perhatian?
Matlamat proses penghuraian dan pelaksanaan kod enjin JavaScript adalah untuk menyusun kod yang paling dioptimumkan dalam masa yang paling singkat.
Paling penting, evolusi enjin ini berkait rapat dengan penerokaan berterusan kami terhadap platform web dan mudah alih yang sedang berkembang untuk menjadikannya sebagai prestasi yang mungkin. Untuk menjejaki evolusi ini, anda boleh melihat prestasi pelbagai enjin dalam graf penanda aras, seperti yang diringkaskan oleh arewefastyet.com. Sebagai contoh, adalah menarik untuk membandingkan prestasi Chrome dengan enjin V8 berbanding enjin bukan Crankshafted.
Mana-mana pembangun web harus sedar bahawa kod yang kami bekerja keras untuk menulis, menyahpepijat dan menyelenggara sudah pasti akan berfungsi secara berbeza dalam penyemak imbas yang berbeza. Mengapa sekeping kod tertentu berfungsi dengan perlahan pada satu penyemak imbas tetapi lebih pantas pada pelayar lain?
Begitu juga, pembangun mudah alih, terutamanya pembangun aplikasi mudah alih hibrid yang menggunakan paparan web untuk memaparkan kandungan halaman, atau mereka yang menggunakan persekitaran masa jalan seperti NativeScript, ingin mengetahui enjin apa yang mentafsir dan melaksanakan kod JavaScript mereka. Pembangun web mudah alih harus sedar tentang batasan dan kemungkinan penyemak imbas pada peranti yang lebih kecil. Sebagai pembangun web, mudah alih atau aplikasi yang ingin terus berkembang, memerhatikan perubahan dalam enjin JavaScript akan membuahkan hasil dengan cepat.
Ringkasan:
Jenis data asas dalam rentetan nombor boolean nol js yang tidak ditentukan
objek ialah jenis data yang kompleks dalam js Ia adalah jenis asas semua objek
js, seperti bahasa lain, mempunyai 9 pernyataan kawalan asas
Fungsi dalam js tidak perlu menentukan nilai pulangan Malah, fungsi yang tidak menyatakan nilai pulangan kembali tidak ditentukan
Parameter dalam js boleh dihantar sesuka hati Beri perhatian kepada array [] argumen
Fungsi dalam js tidak boleh dibebankan, tetapi anda boleh menirunya.