V8 (JavaScript-moottori)

V8 on avoimen lähdekoodin JavaScript- ja WebAssembly-moottori. Sitä kehitettään osana Chromium-projektia. Projektin perustaja oli Lars Bak. 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. V8 on kirjoitettu C++-kielellä.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. Google Chromen versiosta 41 lähtien (2015) kokonaisuuteen kuuluu TurboFan-projekti, jonka tarkoituksena on lisätä nopeutta edelleen. 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. 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.

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. 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:
 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.

Lähteet 

Vapaat ohjelmistot
JavaScript -moottorit