V8 (JavaScript-moottori)
V8 on avoimen lähdekoodin JavaScript- ja WebAssembly-moottori. Sitä kehitettään osana Chromium-projektia.[1] Projektin perustaja oli Lars Bak.[2] V8-moottorin ensimmäinen versio julkaistiin yhdessä Google Chromen ensimmäisen version kanssa 2. syyskuuta 2008. V8-moottoria käytetään myös asiakas-palvelin-arkkitehtuurin palvelinpäässä, esimerkiksi Couchbase-, MongoDB- ja Node.js-ympäristöissä.
Historia
V8 kääntää JavaScriptiä konekielelle. Sen assembler perustuu Strongtalk-assembleriin.[3] V8 on kirjoitettu C++-kielellä.[4]Alkuperäisen kääntäjän nimi oli Full-codegen. Uusi, Crankshaft-niminen käännösympäristö julkaistiin 7. joulukuuta 2010. Julkistuksen myötä käännösnopeus parani.[5] Google Chromen versiosta 41 lähtien (2015) kokonaisuuteen kuuluu TurboFan-projekti, jonka tarkoituksena on lisätä nopeutta edelleen.[6] Vuonna 2016 V8-moottoriin lisättiin Ignition-tulkki, jonka tarkoitus on vähentää käytetyn muistin määrää pienimuistisissa Android-puhelimissa verrattuna TurboFan- ja Crankshaft-kääntäjiin.[7] Vuonna 2017 moottorin kääntäjäkokonaisuus uudistettiin siten, että siihen kuuluu Ignition-tulkki ja optimoiva kääntäjä TurboFan. Versiosta 5.9 lähtien Full-codegen ja Crankshaft eivät enää kuulu V8:aan, koska tiimi uskoo, etteivät ne enää pysy JavaScriptin uusien piirteiden kehityksessä mukana.[8]
Ominaisuudet
V8 tuottaa koodista ensin omalla parserillaan syntaksipuun. Sen jälkeen Ignition-tulkki generoi syntaksipuusta välikielisen tavukoodin käyttäen V8:n sisäistä tavukoodiformaattia.[9] TurboFan on V8:n optimoiva kääntäjä, joka tuottaa tavukoodista konekieltä. Toisin sanoen V8 kääntää JavaScriptiä konekieliseksi koodiksi juuri ennen ohjelman suoritusta (just-in-time compilation). Käännettyä koodia optimoidaan ja uudelleenoptimoidaan ajoaikaisesti koodin suoritusprofiloinnin pohjalta.
Seuraavia optimointitekniikoita käytetään:[10]
- Koodin kutsukohtia korvataan suoritettavalla koodilla makrojen tapaan (inlining).
- Objektien tarpeetonta kopiointia vältetään (copy elision).
- Nopeutetaan metodien sitomista ajoaikaisiin sisältöihin varastoimalla aikaisempia kutsuja välimuistiin (inline caching).
- Muistinhallintaan liittyvä roskienkeruu suoritetaan vaiheittain siten, että ohjelman suoritus jatkuu roskienkeruujaksojen välillä.
Käyttö
V8 voi kääntää x86-, ARM- ja MIPS-arkkitehtuurien konekielelle niiden 32- ja 64-bittisissä versioissa. Se on sovitettu myös palvelinkäyttöön PowerPC- ja IBM System/390 -pohjaisille palvelimille.[11][12][13]
Lähteet
- McCloud, Scott: Google on Google Chrome – Comic Book Blogoscoped. 2008. Google. Viitattu 24.8.2020. (englanniksi)
- Minto, Rob: The Genius Behind Google’s Web Browser. (Maksullinen artikkeli) Financial Times, 17.3.2009. Lontoo: Artikkelin verkkoversio. Viitattu 24.8.2020. (englanniksi)
- V8 JavaScript Engine: License Google Code. Google. Arkistoitu 22.7.2010. Viitattu 24.8.2020. (englanniksi)
- Pasquali, Sandro: Mastering Node.js, s. 15. Birmingham, Mumbai: PACKT Publishing, 2013. ISBN 978-1-78216-632-0. (englanniksi)
- A New Crankshaft for V8 Chromium Blog. 7.12.2010. Google. Viitattu 24.8.2020. (englanniksi)
- Revving up JavaScript performance with TurboFan Chromium Blog. 7.7.2015. Google. Viitattu 24.8.2020. (englanniksi)
- McIlroy, Ross: BlinkOn 6 Day 1 Talk 2: Ignition – an Interpreter for V8 YouTubessa. Viitattu 24.8.2020. (englanniksi)
- Launching Ignition and TurboFan V8 Dev Blog Post Archive. 16.5.2017. Viitattu 24.8.2020. (englanniksi)
- Hinkelmann, Franziska: Understanding V8’s Bytecode Medium. 19.12.2017. Viitattu 24.8.2020. (englanniksi)
- A Game Changer for Interactive Performance Chromium Blog. 21.11.2011. Google. Viitattu 24.8.2020. (englanniksi)
- V8 JavaScript Engine Git Repositories on Chromium. Google Git. Viitattu 24.8.2020. (englanniksi)
- What Is V8? V8 Dev Blog. Viitattu 24.8.2020. (englanniksi)
- ChangeLog V8 Google Code. 2012. Arkistoitu 22.10.2012. Viitattu 24.8.2020. (englanniksi)