Introduzione ad HHVM

Di cosa stiamo parlando?

HHVM è una virtual machine open-source progettata per eseguire codice PHP e Hack. HHVM usa l’approccio a compilazione just-in-time (JIT) per raggiungere performance superiori (all’interprete standard PHP) pur mantenendo compatibilità con il codice PHP già scritto.

Uno degli obiettivi principali di HHVM è mantenere la piena compatibilità con PHP, questo obiettivo non è stato ancora raggiunto al 100% ma HHVM è già in grado di eseguire i 20 framework PHP più importanti su Github.

Come viene servita una pagina con HHVM

Quando HHVM riceve una richiesta, analizza la richiesta HTTP per identificare il file (lo script) da servire, una volta individuato interroga la cache del codice (salvata in un database SQLite) per stabilire se lo script era già stato compilato. Se il file è stato già compilato e non è cambiato dall’ultima compilazione HHVM esegue la versione in cache. Se il file non è presente in cache, allora il motere di analisi del codice di HHVM viene invocato per compilare lo script, eseguire l’inferenza dei tipi, eseguire ottimizzazioni, e salvare il risultato in cache per la prossima richiesta.

La compilazione e successiva esecuzione di uno script PHP (senza le fasi di ottimizzazione) può essere schematizzata nei seguenti passaggi:

  1. Il codice viene letto dal filesystem e copiato in memoria.
  2. Viene effettuata l’analisi lessicale, il codice PHP viene convertito in token.
  3. Viene effettuata l’analisi sintattica dei token.
  4. Viene effettuata la compilazione delle espressioni generate al punto 3 in bytecode.
  5. Viene eseguito il codice compilato

Da ciò risulta chiaro che che la prima volta che uno script viene richiesto si ha un ritardo iniziale dovute alle prime quattro fasi, l’obiettivo di una cache del codice è proprio saltare queste fasi. Una delle differenze principali tra la cache di HHVM e APC (la cache dell’interprete standard di PHP) è quella di essere salvata su disco, invece che risiedere in memoria. Questo comportadue vantaggi immediati: venendo meno i problemi relativi alla dimensione della cache, si azzera di fatto la probabilità che del byte-code già compilato, venga rimosso dalla cache per motivi di spazio, inoltre la cache sopravvive anche al crash del server o al riavvio.

Il vantaggio principale di HHVM rispetto all’interprete standard di PHP, è quello di usare un compilatore JIT. Il codice quindi non è solo trasformato in byte-code ma viene anche dinamicamente tradotto in assembly x86-64 ottimizzato, che può quindi essere eseguito nativamente. Di contro lo Zend Engine II, che è il motore delle rencenti versioni di PHP, compila il codice sorgente in byte-code (ottimizzato dalla versioni 5.5 in poi) e lo esegue sulla propria CPU virtuale, senza operare traduzioni dinamiche.

Essendo una tecnlogia recente non esistono veri e propri libri che parlano dell’argomento, per il 25 Agosto 2015 è prevista l’uscita di “Hack and HHVM: Programming Productivity Without Breaking Things” di Owen Yamauchi uno dei principali sviluppatori di HHVM, per questa ragione le fonti principali di documentazione sono stati il sito ufficiale di HHVM, il suo canale IRC e articoli di altre organizzazioni che hanno adottato HHVM.

Per oggi è tutto, spero di riuscire a parlarvi più approfonditamente di HHVM in un prossimo post… magari introducendo HACK, il nuovo linguaggio nato insieme ad HHVM.