Paar weken geleden zijn we gestart met een serie gericht op het dieper graven in JavaScript en hoe het eigenlijk werkt: we dachten dat door het kennen van de bouwstenen van JavaScript en hoe komen ze om samen te spelen kun je beter schrijven code en apps.,
de eerste post van de serie was gericht op het geven van een overzicht van de motor, de runtime en de call stack. Deze tweede post zal duiken in de interne delen van Google ‘ s V8 JavaScript engine. We geven ook een paar snelle tips over het schrijven van betere JavaScript —code-best practices ons ontwikkelingsteam bij SessionStack volgt bij het bouwen van het product.
overzicht
een JavaScript-engine is een programma of een interpreter die JavaScript-code uitvoert., Een JavaScript engine kan worden geà mplementeerd als een standaard interpreter, of just-in-time compiler die JavaScript compileert om bytecode in een of andere vorm.,/li>
SpiderMonkey — de eerste JavaScript-engine, die in de dagen aangedreven Netscape Navigator, en vandaag bevoegdheden Firefox
Planningsprogramma — open source, op de markt gebracht als Nitro en is ontwikkeld door Apple voor Safari
KJS — KDE ‘ s motor is oorspronkelijk ontwikkeld door Harri Porten voor het KDE-project de Konqueror browser
Chakra (JScript9) — Internet Explorer
Chakra (JavaScript) — Microsoft Rand
Nashorn, open source als onderdeel van OpenJDK, geschreven door Oracle Java Talen en Gereedschap Groep
JerryScript — is een lichtgewicht motor voor het Internet van de Dingen.,
Waarom is de V8-Engine gemaakt?
De V8 Engine die is gebouwd door Google is open source en geschreven in C++. Deze motor wordt gebruikt in Google Chrome. In tegenstelling tot de rest van de motoren, echter, V8 wordt ook gebruikt voor de populaire Node.js runtime.
V8 werd voor het eerst ontworpen om de prestaties van JavaScript-uitvoering binnen webbrowsers te verhogen., Om snelheid te verkrijgen, vertaalt V8 JavaScript-code in efficiëntere machine code in plaats van het gebruik van een interpreter. Het compileert JavaScript-code in machine code bij uitvoering door het implementeren van een JIT (Just-In-Time) compiler zoals veel moderne JavaScript-engines doen zoals SpiderMonkey of Rhino (Mozilla). Het belangrijkste verschil hier is dat V8 geen bytecode of een tussenliggende code produceert.
V8 had voor versie 5 twee compilers
.,9 van V8 kwam uit (eerder dit jaar uitgebracht), de motor gebruikt twee compilers:
full-codegen — een eenvoudige en zeer snelle compiler die eenvoudige en relatief langzame machine code geproduceerd.
krukas-een complexere (Just-In-Time) optimalisatie compiler die zeer geoptimaliseerde code produceerde.,l>
De belangrijkste draad doet wat je zou verwachten: haal uw code compileren en uitvoeren
Er is ook een aparte thread voor het samenstellen, zodat de main thread kan blijven uitvoeren terwijl de eerste het optimaliseren van de code
Een Profiler draad dat vertelt de runtime op die methoden die we besteden veel tijd, zodat Krukas kan optimaliseren
Een paar draden te hanteren Garbage Collector veegt
Bij de eerste uitvoering van de JavaScript-code, V8 maakt gebruik van full-codegen, die zich direct vertaalt de geparseerd JavaScript in machine code zonder enige verandering., Dit maakt het mogelijk om te beginnen met het uitvoeren van machine code zeer snel. Merk op dat V8 geen tussenliggende bytecode representatie gebruikt op deze manier waardoor de noodzaak voor een interpreter wordt weggenomen.
wanneer uw code een tijdje draait, heeft de profiler thread genoeg gegevens verzameld om te vertellen welke methode geoptimaliseerd moet worden.
volgende, krukas optimalisaties beginnen in een andere thread. Het vertaalt de JavaScript abstracte syntaxis boom naar een high-level statische single-assignment (SSA) representatie genaamd waterstof en probeert die waterstof grafiek te optimaliseren. De meeste optimalisaties worden gedaan op dit niveau.,
Inlining
de eerste optimalisatie is zoveel mogelijk code van tevoren inlinen. Inlining is het proces van het vervangen van een aanroep site (de regel van de code waar de functie wordt aangeroepen) met de body van de aangeroepen functie. Deze eenvoudige stap maakt het mogelijk na optimalisaties om meer betekenis te zijn.
Verborgen klasse
JavaScript is een prototype-gebaseerde taal: er zijn geen klassen en objecten worden gemaakt met behulp van een proces., JavaScript is ook een dynamische programmeertaal, wat betekent dat eigenschappen gemakkelijk kunnen worden toegevoegd of verwijderd uit een object na de instantiatie.
De meeste JavaScript-tolken gebruiken woordenboekachtige structuren (gebaseerd op hash-functie) om de locatie van objecteigenschappen in het geheugen op te slaan. Deze structuur maakt het ophalen van de waarde van een eigenschap in JavaScript rekenkundig duurder dan het zou zijn in een niet-dynamische programmeertaal zoals Java of C#., In Java worden alle objecteigenschappen bepaald door een vaste objectlay-out voor compilatie en kunnen ze niet dynamisch worden toegevoegd of verwijderd tijdens runtime (nou ja, C# heeft het dynamische type dat een ander onderwerp is). Als gevolg hiervan kunnen de waarden van Eigenschappen (of pointers naar die eigenschappen) worden opgeslagen als een continue buffer in het geheugen met een vaste-offset tussen elk. De lengte van een offset kan eenvoudig worden bepaald op basis van het eigenschapstype, terwijl dit niet mogelijk is in JavaScript waar een eigenschapstype kan veranderen tijdens runtime.,
omdat het gebruik van woordenboeken om de locatie van objecteigenschappen in het geheugen te vinden erg inefficiënt is, gebruikt V8 een andere methode: verborgen klassen. Verborgen klassen werken op dezelfde manier als de vaste object lay-outs (klassen) gebruikt in talen zoals Java, behalve dat ze worden gemaakt tijdens runtime. Laten we nu eens kijken hoe ze er eigenlijk uitzien:
function Point(x, y) { this.x = x; this.y = y; }var p1 = new Point(1, 2);
zodra de” new Point(1, 2) “aanroep plaatsvindt, zal V8 een verborgen klasse aanmaken met de naam”C0”.,