Casa / Avatar / Compilatori PHP gratuiti. Una selezione di compilatori online: eseguiamo e testiamo il codice direttamente nel browser Quando pensare alla compilazione

Compilatori PHP gratuiti. Una selezione di compilatori online: eseguiamo e testiamo il codice direttamente nel browser Quando pensare alla compilazione

Esistono due tipi di linguaggi di programmazione: interpretati e compilati. Che linguaggio è PHP? Per rispondere a questa domanda dobbiamo comprendere la terminologia.

Un programma che traduce il codice scritto in un linguaggio di programmazione in un altro è chiamato traduttore. Un compilatore è anche un traduttore. Traduce il codice scritto in un linguaggio di alto livello in codice macchina. Il processo di compilazione crea un file eseguibile binario che può essere eseguito senza un compilatore.

Un interprete è una categoria completamente diversa. L'interprete non traduce il codice, ma lo esegue. L'interprete analizza il codice del programma ed ne esegue ogni riga. Ogni volta che esegui tale codice, devi utilizzare un interprete.

In termini di prestazioni, gli interpreti sono significativamente inferiori ai compilatori, poiché il codice binario viene eseguito molto più velocemente. Ma gli interpreti ti consentono di controllare completamente il programma durante la sua esecuzione.

Per quanto riguarda PHP, non è né un compilatore né un interprete. PHP è un incrocio tra un compilatore e un interprete. Proviamo a capirlo e osserviamo come PHP elabora il codice.

Diamo un'occhiata all'immagine:

Vediamo che PHP è composto da due blocchi quasi indipendenti: un traduttore e un interprete. Perché hai avuto bisogno di farlo? Ovviamente per ragioni di velocità.

L'input PHP è uno script. Lo traduce (lo traduce), controllandone la sintassi, in uno speciale bytecode (rappresentazione interna). PHP esegue quindi il bytecode (non il codice del programma stesso), ma non crea un file eseguibile.

Il bytecode è molto più compatto del normale codice di programma, quindi è più facile (e veloce) da interpretare (eseguire). Giudicate voi stessi: l'analisi viene eseguita solo una volta nella fase di traduzione e viene eseguito il "prodotto semilavorato" - bytecode, che è molto più conveniente per questi scopi. Pertanto, PHP è più un interprete che un compilatore. Questa “doppia opera” si è resa necessaria per i seguenti scopi.

Considera il ciclo:

Per (i=0;i<10; i++) { Operator_1; Operator_2; Operator_3; ............ Operator_99; Operator_100; }

Questo ciclo “girerà” 10 volte. Per ognuno di questi dieci passaggi, l'interprete deve 100 righe di codice. E deve analizzare ed eseguire 10*100 = 1000 righe di codice! Se traduci l'intero ciclo in bytecode una volta, dovrà essere analizzato 10 volte meno! Ciò significa che gli script verranno eseguiti 10 volte più velocemente!

Si scopre che PHP lo è.

La fase principale del lavoro di PHP è l'interpretazione della rappresentazione interna del programma e la sua esecuzione. È questa fase che richiede più tempo negli scenari gravi. Tuttavia il rallentamento non è così significativo.

Vale la pena ricordare che PHP versione 3 era un interprete “puro” e con PHP 4 gli script hanno iniziato a essere eseguiti molto più velocemente, poiché PHP versione 4 (e PHP5) è un traduttore interpretativo.

Il linguaggio Perl, che viene quasi sempre chiamato compilatore, funziona esattamente allo stesso modo: traduce il testo del programma in una rappresentazione interna e quindi utilizza il codice risultante durante l'esecuzione. Quindi possiamo dire che PHP versione 4 è un compilatore esattamente nello stesso modo in cui lo è Perl.

Quindi, siamo costretti a concludere che PHP è un interprete con un blocco di traduzione integrato che ottimizza il flusso di interpretazione.

Usare un interprete (e quindi PHP) ha i suoi innegabili vantaggi:

  • Non è necessario preoccuparsi di liberare la memoria allocata, non è necessario chiudere i file quando si finisce di lavorarci: l'interprete eseguirà tutto il lavoro di routine, poiché il programma viene eseguito sotto il suo vigile controllo;
  • Non è necessario pensare ai tipi di variabile e non è necessario dichiarare una variabile prima del suo primo utilizzo;
  • Il debug dei programmi e il rilevamento degli errori sono notevolmente semplificati: l'interprete ha il controllo completo su questo processo;
  • Nell'ambito delle applicazioni web l'interprete ha anche un vantaggio molto importante: non c'è pericolo che il server si blocchi se il programma non funziona correttamente.

Ci sono anche altri vantaggi. In generale, l'utilizzo di un interprete può conferire agli script la potenza che gli utenti Web si aspettano da essi.

La penalità prestazionale di PHP è evidente nel caso di loop grandi e complessi, quando si elaborano un gran numero di righe, ecc. Tuttavia, tieni presente che questo è l'unico inconveniente di PHP, che apparirà sempre meno man mano che verranno rilasciati processori più potenti , così che alla fine scompariranno del tutto.

<<< Назад
(Cosa c'è di nuovo in PHP5?)
Contenuto Avanti >>>
(Transizione a PHP 5.3)

Se hai altre domande o qualcosa non ti è chiaro, benvenuto nel ns

La compilazione di PHP dal codice sorgente viene spesso eseguita su sistemi simili a Unix. Coloro che lavorano in un ambiente con sistema operativo Windows molto probabilmente scaricheranno e installeranno PHP da pacchetti binari. E anche se non sono d'accordo sul fatto che sia più semplice utilizzare una soluzione precompilata, anche sui sistemi Unix ci sono alcuni vantaggi che possono derivare dalla compilazione di un binario dal sorgente. Nel complesso:

  • Hai la possibilità di mettere a punto il prodotto finale durante la compilazione. Forse vuoi una certa estensione che venga compilata direttamente nel binario anziché caricarla come libreria esterna. O forse vuoi disattivare qualcosa che solitamente è disponibile per impostazione predefinita.
  • Puoi fare un trucco, durante il processo di compilazione se necessario, che potrebbe migliorare le prestazioni per un ambiente specifico (ovviamente, questo presuppone che tu sappia già cosa stai facendo in questo caso non leggeresti questo articolo !).
  • La compilazione potrebbe essere l'unico modo per far funzionare le cose se i binari compilati sono stati creati su versioni precedenti di software e librerie di supporto e ora stai utilizzando un nuovo sistema.

Avvertimento: la compilazione può essere frustrante, soprattutto su Windows! È necessario assicurarsi che l'ambiente di compilazione sia configurato correttamente, imparare a utilizzare correttamente il compilatore e altri strumenti di compilazione e soddisfare eventuali dipendenze della libreria. Ci auguriamo che questo articolo sia il tuo primo passo per superare molti di questi ostacoli.

Configurazione dell'ambiente di compilazione

PHP è scritto in C e quindi è necessario un compilatore C se intendi creare PHP dal codice sorgente. C++ è una super suite di C, quindi un buon compilatore C++ dovrebbe essere in grado di compilare codice C, sebbene non sia sempre così. Per Windows, Visual Microsoft, C++ Express (che in seguito si chiamerà VC++) è disponibile gratuitamente sul sito Microsoft. È stata utilizzata l'edizione del 2010.

Quando scegli una versione del compilatore, dovresti tenere presente come eseguirai PHP. Se devi lavorare con mod_php dei binari Apache compilati ufficialmente e vuoi farlo, compila PHP utilizzando Visual Studio 6, poiché questa è la versione di compilazione di Apache. Il modulo deve avere come target la stessa libreria runtime di Apache, in questo caso msvcrt.dll. Se stai creando Apache anche dal codice sorgente o se eseguirai PHP come FastCGI o CLI, questo non è un problema e 2010 funzionerà correttamente.

È inoltre necessario installare il software Windows Development Kit (SDK). L'SDK ci fornisce gli importanti file di intestazione per la piattaforma Windows che dovremo compilare con successo. Anche in questo caso è stata utilizzata la versione 7.1.

Installa il compilatore e quindi l'SDK. Non discuterò dell'installazione poiché entrambi dispongono di una procedura guidata di installazione grafica che ti guiderà attraverso l'intero processo.

Se disponi di un compilatore funzionante, scarica gli strumenti binari e i pacchetti conosciuti da windows.php.net. Il pacchetto di strumenti binari (sto utilizzando l'archivio 20110915) contiene strumenti di sviluppo come re2c, bison e alcuni comandi aggiuntivi necessari per creare PHP. Il pacchetto conosciuto (sto usando l'archivio 5.4 poiché corrisponde alla versione di PHP che compilerò) contiene gli header minimi e le librerie di dipendenze necessarie, ad esempio zlib.h.

Probabilmente è ovvio che desideri scaricare anche il sorgente PHP da windows.php.net. Al momento della stesura di questo articolo, la versione corrente di PHP è la 5.4.6, quindi questo è il numero di versione che vedrai negli esempi.

È una buona idea creare uno spazio di lavoro in cui estrarre il codice sorgente e compilarlo in modo che non influenzi il resto del sistema. Crea una cartella C:\PHP-Dev che fungerà da directory di lavoro, quindi estrai l'archivio binario e gli strumenti al suo interno.

Successivamente, estrai il contenuto dell'archivio, il sorgente PHP in C:\PHP-Dev ora hai php5.4 nella cartella sorgente e quindi estrai il suo archivio deps nella cartella fratello deps. La struttura della directory dovrebbe assomigliare a questa:

Apri il prompt dei comandi di Windows SDK installato con l'SDK (Start => Microsoft Windows SDK => Prompt dei comandi di Windows SDK) ed esegui i seguenti comandi:

Setenv /release /xp /x86 cd C:\PHP-Dev bin\phpsdk_setvars.bat

È preferibile utilizzare la riga di comando della console SDK prima della normale console cmd.exe, poiché imposta molte variabili di ambiente specifiche per la compilazione del codice sorgente. Anche le compilazioni successive dei comandi dovranno essere eseguite in questa console.

setenv imposta alcune proprietà di build per l'ambiente, in questo caso l'ambiente di destinazione è la versione Windows XP a 32 bit della build. Puoi provare a costruire con /x64 se stai cercando l'avventura. La definizione di diverse versioni di Windows come /Vista molto probabilmente avrà problemi di output a causa di alcune strane definizioni negli script (PHP vuole comunque essere compatibile con XP). A meno che tu non sappia veramente cosa stai facendo, probabilmente è più sicuro attenersi ai valori consigliati che ho usato sopra.

Lo script phpsdk_setvars.bat accede ad alcune variabili di ambiente aggiuntive, il processo di compilazione è riuscito a trovare gli strumenti binari.

Tieni presente che tutte queste impostazioni variabili sono solo sessioni temporanee nella console. Se chiudi tutto rapidamente per tornare alla compilazione in un secondo momento, dovrai eseguire nuovamente il comando e, in caso contrario, otterrai errori come il seguente, quando successivamente eseguirai configure, non sarai in grado di continuare:

Controllo di bison.exe in corso... ERRORE: è richiesto il bisonte

Assicurarti di avere il giusto ambiente di compilazione, le fonti necessarie ed eventuali dipendenze è la parte più difficile del processo. Quindi ora che il tuo ambiente è configurato con il codice sorgente e le dipendenze, è il momento di compilare!

Compilazione di PHP

Nella riga di comando dell'SDK, vai alla cartella sorgente PHP ed esegui buildconf. Il comando è responsabile della generazione di file di configurazione che verranno creati dal Makefile per controllare il processo di compilazione.

Una volta completato buildconf (ci vorrà solo un secondo), esegui configure --help - ed esamina la guida per quali funzionalità desideri abilitare/disabilitare, quindi esegui nuovamente configure con qualunque opzione desideri. È una buona idea controllare l'output prima di spostarsi, poiché ti avviserà se una qualsiasi delle dipendenze richieste non è disponibile. Se ciò accade, puoi installare le dipendenze ed eseguire nuovamente la configurazione oppure modificare le chiamate per disabilitare le estensioni che ne hanno bisogno.

Infine, esegui NMAKE per avviare la compilazione.

Cd C:\PHP-Dev\php5.4 buildconf configura nmake nmake test

Se una qualsiasi configurazione o NMAKE fallisce, il problema è uno dei due: primo, l'ambiente non è configurato correttamente, secondo, hai abilitato una funzionalità che dipende dalle librerie esterne e le librerie non sono installate sul tuo sistema. Ricontrolla di aver creato l'ambiente secondo le istruzioni sopra riportate e che siano state configurate eventuali librerie aggiuntive che potrebbero essere richieste nelle impostazioni di configurazione sottostanti.

Una volta completato il primo NMAKE del processo di compilazione troverai i tuoi nuovissimi file PHP nella cartella Release_TS. Il test NMAKE esegue nuovi test di errore a doppia capacità per garantire che tutto funzioni come dovrebbe. I risultati dei test NMAKE vengono inviati al team QA che dipende da loro per migliorare PHP, quindi potrebbero essere necessari alcuni minuti per lavorarci, è un grosso problema.

A questo punto puoi anche sfruttare il passaggio aggiuntivo di eseguire lo snap-in NMAKE, che creerà archivi ZIP e file binari che puoi copiare.

Estensioni di compilazione

Esistono due modi per compilare le estensioni PHP: staticamente e dinamicamente. Un'estensione compilata staticamente viene compilata in un binario PHP, mentre un'estensione compilata dinamicamente è una DLL separata che può essere caricata successivamente tramite un file php.ini. Le estensioni vengono in genere compilate come DLL, sebbene vi siano alcuni vantaggi nella compilazione statica e, in definitiva, dipende dalle tue esigenze.

Per compilare estensioni PHP su Windows, estrai la cartella dell'estensione del codice sorgente nella cartella ext della directory dei sorgenti PHP. Quindi, riconfigura lo script eseguendo buildconf --force e ricompilando PHP utilizzando le opzioni appropriate per abilitare l'estensione.

Ad esempio, compiliamo staticamente l'estensione AOP. Scarica il codice sorgente da PECL ed estrailo in una cartella, ext. Quindi segui questi passaggi:

Cd C:\PHP-Dev\php5.4 buildconf --force configure --enable-aop nmake

L'opzione --force, buildconf forza il ripristino dello script di configurazione. Successivamente, esegui configure --help e dovresti vedere l'opzione per abilitare la nuova estensione nell'output. In questo caso è --enable-AOP.

Al termine di nmake, avrai un binario PHP appena creato con AOP.

Le estensioni saranno disponibili come DLL anziché come cotte in PHP, puoi seguire gli stessi passaggi di cui sopra ma specificando "condiviso" come valore per la configurazione consente l'opzione.

Buildconf --force configure --enable-aop=condiviso

Di conseguenza, la DLL si troverà nella cartella Release_TS insieme al binario PHP al termine della compilazione, in questo caso il nome è php_aop.dll .

PS

Compilare su Windows è ancora un po' complicato, soprattutto quando si tratta di estensioni. Essere in grado di compilare il codice sorgente è una buona abilità, soprattutto se si desidera modificare PHP in seguito.

L'articolo è stato preparato per te dal team del sito
Articolo originale:
Tradotto da: Victor Klim

Alexey Romanenko: Mi chiamo Alexey Romanenko, lavoro alla RBC. L’argomento di questo rapporto è alquanto controverso. Sembrerebbe, perché compilare script PHP quando tutto sembra funzionare così?

Probabilmente la domanda principale è: “Perché?” In generale, lo scopo di questa presentazione è cercare di capire se tale compilazione è necessaria, in caso affermativo, perché, in quale forma e a chi.

Cos'è un compilatore PHP?

Innanzitutto, una breve panoramica di cosa sia un compilatore PHP. Ti dirò come funziona, cos'è e come puoi accelerarlo.

Il primo modulo funzionale è il cosiddetto SAPI (Server API), che fornisce un'interfaccia per l'accesso a PHP da vari client (Apache, una sorta di server CGI (Common Gateway Interface) e altri). C'è anche SAPI incorporato, che ti consente di incorporare PHP in qualsiasi applicazione.

La seconda parte principale è PHP Core, che elabora le richieste, implementa tutto il lavoro con la rete, il file system e analizza gli script stessi.

La terza parte globale è lo Zend Engine, che compila i nostri script in bytecode, lo esegue sulla sua macchina virtuale e gestisce la gestione della memoria (implementa allocatori completi).

Una delle parti più importanti e più grandi è il modulo Estensioni, che implementa il 99% di ciò che utilizziamo in PHP. Questi sono "wrapper" per alcune librerie, o funzionalità, o classi, librerie integrate, ecc. Possiamo anche scrivere le nostre estensioni.

Come viene eseguito lo script stesso?

Primo. Si verifica l'analisi lessicale: il file viene scaricato, analizzato, tutti i caratteri dell'insieme di questo file vengono tradotti in un determinato insieme di token, con cui poi lavoriamo.

La fase di analisi analizza questi token. Sulla base di questa analisi viene compilata una determinata struttura grammaticale, sulla base della quale verrà poi generato il bytecode.

Alla fine, Zend Engine lo esegue. Il risultato viene restituito al client.

Stiamo parlando di carichi elevati. Se ripeti questo schema di azioni ogni volta, tutto funzionerà molto lentamente. Quando il nostro interprete riceve diverse centinaia o migliaia di richieste contemporaneamente, la velocità è semplicemente inesistente.

Ma ci sono soluzioni. Sono conosciuti da molto tempo.

Come ottenere l'accelerazione?

La soluzione più semplice, economica e ben testata è il caching del bytecode. Invece di passare attraverso la fase di analisi, memorizziamo semplicemente nella cache il nostro bytecode. Per questo ci sono estensioni speciali - sono ben note a tutti coloro che hanno lavorato con PHP - queste sono APC, eAccelerator, Xcache e così via. Zend Engine esegue semplicemente il bytecode.

La seconda opzione è la profilazione del codice, identificando i colli di bottiglia. Possiamo riscrivere qualcosa come estensioni PHP (questa sarà un'estensione in C/C++), compilarla e usarla come moduli.

La terza opzione è più globale: dimentica PHP e riscrivi tutto. In generale, questa opzione ha diritto alla vita, ma solo nel caso in cui non ci sia abbastanza codice PHP. Nei progetti grandi e grandi (o che esistono da molto tempo), di solito si accumula molto e ci vorrà molto tempo per riscrivere tutto. I requisiti aziendali non ti consentiranno di farlo. In generale, scrivere qualcosa in PHP, ad esempio per un server front-end, non richiede molto tempo, perché è un linguaggio semplice. Ti consente di fare rapidamente cose che richiedono più tempo per essere eseguite nelle lingue di basso livello.

Esiste un'opzione alternativa, che recentemente è diventata molto diffusa, ed è quella di compilare PHP da qualche parte, in qualcosa di più veloce.

Compiliamo qualcosa?

Con la parola “compilazione” intendo la traduzione del codice dello script PHP in qualcos'altro, in qualche altro codice.

In questo caso può essere di due tipi.

Il codice nativo è un tipo di file binario che può essere eseguito su una macchina fisica.

Codice non nativo. È possibile compilare del bytecode che può essere eseguito su un'altra macchina virtuale, ad esempio sulla JVM.

Come puoi compilare codice nativo da PHP?

Compilatore Roadsend. Il suo seguito è Raven. C'è anche PHC (questo è un compilatore PHP Open Source). Recentemente è apparso anche HipHop (Facebook).

Fornirò una breve panoramica di cosa si può fare per il codice non nativo. Per quanto ne so, ci sono 3 opzioni di lavoro. Questa è la generazione di bytecode per Java e la generazione di bytecode per .Net: Quercus, Project Zero, Phalanger. Non prenderò in considerazione la compilazione in codice non nativo, perché non lo usiamo. Torniamo alla compilazione in codice nativo.

Secondo me il compilatore più vecchio è Roadsend. Ha iniziato a essere sviluppato molto tempo fa, nel 2002. Originariamente era un'applicazione commerciale. È stato chiuso, solo nel 2007 è stato rilasciato in Open Source. Esiste uno schema di compilazione molto complesso: per il linguaggio Scheme viene utilizzato un certo compilatore Bigloo, dopodiché viene generato il codice nativo. Questo compilatore non utilizza Zend Engine.

Possiamo generare un file binario eseguibile separato o generare un modulo per Apache. È anche possibile generare un file binario che funzionerà come server web. Ma non funziona. Non so perché, ma a me non funziona affatto.

Per quanto ne so, i lavori su Roadsend non sono attualmente in corso. Si è evoluto nel progetto Raven, che è stato completamente riscritto in C++. Come compilatore, utilizza LLVM per generare codice.

Al momento tutto sembra molto promettente.

Ma è ancora in costruzione. Anche nella documentazione ci sono accenni al fatto che non genereremo file binari. Aspettare.

Le cose sarebbero tristi se non avessimo la PHC. Questo è un compilatore OpenSource. È stato sviluppato dal 2005. Uno dei suoi svantaggi: utilizza SAPI integrato. Non stiamo abbandonando la macchina Java, lo Zend Engine. Essenzialmente, traduce il codice PHP nel codice del modulo di estensione PHP. Successivamente viene compilato, ma il processo di esecuzione coinvolge ancora una volta Zend Engine.

Esempio di utilizzo del PHC

Molto simile a come lavoriamo, ad esempio, con i compilatori convenzionali, gcc. Il primo mostra che esiste un binario, possiamo anche semplicemente generare il codice C. Poiché lo stesso gcc viene utilizzato internamente dopo aver generato questo codice, possiamo utilizzare i flag destinati all'ottimizzazione e altre cose.

Stavamo parlando di un'applicazione che viene eseguita dalla riga di comando.

Per avviare un'applicazione web è necessario eseguire diversi passaggi, è piuttosto complesso. Per prima cosa devi generare un'estensione, quindi compilare il codice e quindi collegarlo in qualche modo (dinamicamente o staticamente).

Principali vantaggi dell'assistenza sanitaria primaria

Essenzialmente utilizziamo lo stesso PHP e siamo completamente compatibili. Tutte le altre estensioni sono supportate. Usiamo tutto ciò che abbiamo compilato. Documentazione abbastanza buona.

A proposito, uno dei bonus aggiuntivi di PHC è che puoi generare il lavoro XML del nostro script in base a come è costruito XML, a volte questo può essere utile.

Aspetti negativi

Secondo me, questo è un binario inferiore, perché ha ancora una dipendenza da Zend Engine. C'è anche una certa complessità in termini di connessione di progetti web.

La stessa cosa

Questa segnalazione probabilmente non sarebbe avvenuta se non fosse apparso HipHop, una soluzione di Facebook. I suoi creatori hanno anche accumulato una grande quantità di codice PHP e hanno pensato a lungo a cosa farne.

A quanto ho capito, dopo che le opzioni per riscrivere tutto sono state rifiutate, si è deciso di scrivere una sorta di traduttore (in questo caso in codice C++). Il progetto è relativamente giovane; è stato ufficialmente rilasciato solo nel febbraio di quest'anno. Il codice PHP viene tradotto in codice C++ e quindi generato utilizzando gli strumenti standard del tuo sistema operativo. Tuttavia, per ora è supportato solo il sistema operativo Linux.

Proprio ieri ho chiesto a un rappresentante di Facebook informazioni su questa decisione. Ha detto che attualmente il 100% del codice PHP è compilato tramite HipHop. Il codice non funziona nella sua forma pura tramite l'interprete PHP. Ancora una volta, i creatori hanno annunciato una significativa riduzione del carico del processore.

Funzionalità di base dell'HipHop

Genera direttamente il binario stesso, che può essere eseguito dalla riga di comando. Esiste un'opzione per avviarlo come server Web di streaming. C'è anche un debugger integrato separato. Può eseguire il debug degli script sia localmente che in remoto (funzionerà come server).

Il processo di assemblaggio non è banale. C'è una descrizione, ma non è raccolta ovunque. Al momento, come ho detto, è tutto assemblato per Linux, inoltre inizialmente tutto era “su misura” per 64 bit. Sebbene 32 bit siano ora supportati sperimentalmente. Ma sono riuscito ad assemblarlo e ad aggiustarlo un po' - in generale, ha fatto tutto questo, perché non è assemblato per impostazione predefinita.

Inoltre, hanno le proprie versioni di libcore e, secondo me, ci sono anche un paio di librerie che necessitano di patch. In generale, il processo di assemblaggio non è così semplice.

All'uscita dopo l'assemblaggio, riceviamo un determinato file hpp, che è un traduttore del nostro codice PHP in C++. Se guardiamo le bandiere, ce ne sono parecchie. Ne ho evidenziati qui alcuni fondamentali di cui potresti aver bisogno.

Possiamo utilizzare un file in formato HDF come file di configurazione (config), specificando varie direttive. Lì possiamo impostare il livello di errore e altre cose (HDF è tutto ciò che è disponibile in forma strutturata). Possiamo anche prendere la configurazione stessa dal database o usarla direttamente sulla riga di comando.

Impostiamo il livello di registrazione durante la compilazione: mostriamo tutti gli errori o visualizziamo anche avvisi, informazioni aggiuntive o in generale teniamo un registro completo di tutto ciò che accade.

Una direttiva molto utile è input_list=FILE, che ci permette di specificare un elenco di script che vogliamo compilare. Vale anche la pena menzionare una direttiva come lazy-bind. Possiamo specificare tutti i file di progetto, quelli che verranno compilati.

Esempio di esecuzione della compilazione di script PHP

È stato installato il terzo livello di registrazione, ci sono informazioni abbastanza generali sul tempo, puoi vedere quanto tempo ci è voluto. In effetti, la sceneggiatura è abbastanza semplice. Questo è il solito "Hello, World", ho appena fatto uno screenshot.

Il file più pesante è il nostro binario "programma", la sua dimensione è di 28 MB. In sostanza, il nostro "Hello, World" pesa 28 MB. Volevo sottolineare che oltre alla riga standard "Echo "Hello, World!", questo binario include molto altro. Questo è un server web a tutti gli effetti, un server a tutti gli effetti per l'amministrazione.

Che cosa stiamo facendo?

Abbiamo "Hello..." in C++, che esegue una funzione composta da una riga "echo "Hello, World". Inoltre, vengono caricate molte cose di terze parti. Come possiamo vedere, questo è un file a tutti gli effetti nel C++.

Questo è il programma risultante. Contiene già diversi tasti diversi per diverse configurazioni, ma ne citerò solo alcuni.

Questo è --mode, questa è la modalità di lancio del nostro programma. Possiamo eseguirlo direttamente (dalla riga di comando) o in modalità server web o demone completo. Ci sono un paio di altre opzioni, ma non sono importanti.

config viene utilizzato nello stesso formato. Non ho dato direttive perché ce ne sono tante. HipHop viene fornito con la documentazione. Non è sul sito wiki, ma con la distribuzione viene fornita la documentazione, dove tutto è chiaramente descritto. Non mi aspettavo nemmeno che la descrizione fosse così dettagliata. Ciò ti consente di configurare la soluzione in modo abbastanza flessibile.

Per eseguire in modalità server, possiamo specificare la porta. Per l'amministrazione viene utilizzata una porta separata, dove è possibile inviare alcune richieste che consentono di gestire il server. Se abbiamo un server di debug in esecuzione, indichiamo l'host e la porta a cui ci “collegheremo” per il debug.

Esempio di lancio

Ad esempio, abbiamo specificato la porta 9999 per la trasmissione. Eseguendo semplici richieste http, possiamo ricevere statistiche, gestire in qualche modo il server o ottenere alcune informazioni aggiuntive. In generale, è molto conveniente.

Opzione per ottenere informazioni sullo stato

E' possibile ricevere lo stato del server impostato in vari formati built-in (xml, json, html). In sostanza, vengono fornite informazioni sul processo master del server stesso e sui gestori, ovvero i thread che elaborano le richieste.

Statistiche aggiuntive

In effetti, vengono fornite molte statistiche. Poiché HipHop funziona in modo nativo con memcache e SQL sotto forma di MySQL, fornisce informazioni dettagliate su tutte le operazioni eseguite con esso.

Statistiche complete sulla memoria

C'è una funzionalità molto utile qui: Statistiche dell'applicazione. Utilizzando le funzioni aggiuntive dello stesso HipHop in PHP, possiamo scrivere statistiche nei nostri script, che poi riceviamo attraverso l'accesso regolare a http.

Debug

Come ho già detto, è possibile utilizzare il "debug" integrato per eseguire il debug degli script. Questo è molto comodo perché l'interprete hppi funziona in modo simile a quello che abbiamo compilato. C'è una differenza nel "comportamento" degli script quando vengono eseguiti in PHP standard e quando utilizzano alcuni dati compilati. Per eseguire il debug di ciò che è stato compilato, Facebook ha scritto un interprete separato.

Nel primo caso eseguiamo il codice con lo switch “-f” e vediamo come si comporta il file; tutto l'output va a stdout. Oppure possiamo eseguirlo in modalità debug ed entrare nel debugger interattivo. È molto simile al GDB standard: puoi anche impostare punti di interruzione, eseguire, inserire valori variabili, tracciare e altro.

Una delle funzionalità aggiuntive

Abbiamo un programma che si è rivelato dopo la compilazione. Può essere utilizzato come server RPC. Eseguiamo richieste su http e, chiamando la funzione params, possiamo passare un parametro come array json o come parametro separato. Avremo restituito json, che restituisce i risultati di queste funzioni. Questo è molto comodo: la funzionalità necessaria è già integrata fin dall'inizio.

Contro dell'HipHop

Al momento, HipHop non supporta costrutti e funzioni del linguaggio come eval(), create_function() e preg_replace() con /e, sebbene siano tutte analoghe a eval(). È vero, nelle ultime versioni, secondo me, puoi ancora abilitare eval() tramite config. Ma non è consigliabile farlo. In generale, eval() è pessimo da usare.

I principali vantaggi dell'HipHop

Naturalmente, il vantaggio principale è il supporto di Facebook. Funziona e viene sviluppato abbastanza attivamente. Intorno a questo progetto sta emergendo una comunità di sviluppatori. È stata scritta un'implementazione PHP completamente nuova.

Come ho già detto, il vantaggio è che viene generato codice nativo. Si sostiene un aumento delle prestazioni riducendo i costi di carico del processore (i test lo confermano).

È abbastanza flessibile nella configurazione. Sono rimasto piacevolmente sorpreso dal fatto che ci siano alcune opzioni di personalizzazione. Penso che ciò sia dovuto al fatto che il progetto funziona davvero. Tutto ciò che viene utilizzato viene incrementato.

Come ho già detto, HipHop offre molte funzionalità aggiuntive. Questi includono l'utilizzo come server RPC, amministrazione, varie statistiche e molto altro. A proposito, esiste anche un'API per lavorare con altre lingue.

Per questa soluzione è stata scritta una documentazione abbastanza buona. Un altro vantaggio: si tratta di una soluzione effettivamente pronta per l'uso in produzione (esempio: Facebook).

Aspetti negativi

Lo svantaggio principale è che al momento è supportato un numero piuttosto limitato di moduli. Ad esempio, quando lavoriamo con un database, possiamo utilizzare solo funzioni MySQL. Non c'è supporto PostgreSQL qui.

Esiste anche la complessità dell'assemblaggio, di cui ho già parlato. Ci sono problemi con la creazione su sistemi a 32 bit. Ma penso che questo verrà risolto presto. Per ora viene utilizzata solo la compilazione da PHP 5.2. La versione 5.3 non è ancora supportata, ma lo sarà come promesso.

Cosa non dovresti aspettarti dalla compilation in generale e dall'HipHop in particolare?

La compilazione non accelererà in alcun modo le lente query SQL nel database. Se il collo di bottiglia è il database, compilarlo o non compilarlo, non servirà a nulla.

La compilazione non accelera il caricamento statico, ma solo il caricamento dinamico. Rende il debug molto più difficile. Molte persone sono probabilmente abituate al fatto che tutto sia abbastanza semplice da eseguire il debug in PHP. Ciò non accadrà più durante la compilazione. Sebbene, come ho notato, Facebook abbia reso questo processo il più semplice possibile, senza di esso sarebbe ancora più difficile compilarlo ogni volta.

Non aspettarti che questa sia una sorta di “proiettile d'argento” che risolverà tutti i tuoi problemi. In effetti, la compilazione risolve una gamma piuttosto ristretta di problemi. Se lo sono, allora questo può aiutare.

Quali problemi risolve la compilazione?

Riduce il carico sulla CPU, poiché quando si lavora attivamente con PHP e un gran numero di richieste, il carico su di essa aumenta in modo abbastanza significativo. Naturalmente, mi piacerebbe fare alcuni test.

Test

Il primo test (il più semplice) è un'operazione piuttosto costosa che richiede parecchio tempo per essere completata. Nei test ho cercato di astrarmi e di non fare richieste utilizzando qualche risorsa esterna.

Il carico ricade interamente sul processore. Il test ha dimostrato che HipHop "ha vinto" contro tutti: funziona quasi una volta e mezza più velocemente del compilatore PHP standard. PHC ha superato questo test molto lentamente.

Per il secondo test delle prestazioni ho utilizzato lo script PHP ufficiale, scaricabile da SVN. Esegue una serie di funzioni che eseguono l'ordinamento, l'assegnazione, la somma: operazioni piuttosto costose da un punto di vista matematico.

L'HipHop era di nuovo avanti. Inoltre con PHP standard la differenza oraria è di circa 3 volte. PHC si è comportato meglio qui, ma era circa la metà peggiore dell'HipHop.

PHP viene utilizzato principalmente per i thread che gestiscono le richieste http: vale la pena tenerlo a mente.

Diverse configurazioni standard (Apache con PHP, Nginx con fpm-php e plug-in APC per il caching del codice). Come quinta opzione: HipHop.

Ad essere sincero, i test non li ho condotti sul server, ma su un laptop. I numeri, ovviamente, potrebbero non corrispondere del tutto alla realtà, ma in questo caso i risultati sono normali. Vale la pena notare che all'aumentare del carico, aumenta contemporaneamente il numero di richieste e il numero totale di richieste. Il prossimo è RPS. Abbiamo testato una pagina standard che include 10 inclusioni semplici. Essenzialmente, si tratta di testare PHP come interprete.

Domanda del pubblico: Quali sono i numeri nella cella: secondi?

Alexey Romanenko: Questo è fps.

Qui possiamo concludere che all'aumentare del numero di richieste simultanee, HipHop si comporta molto bene.

Si può vedere che l'utilizzo di APC è una pratica standard. Ciò dimostra che aggiunge, ad esempio, come Apache un incremento di prestazioni di circa 2 volte. Questo succede anche con Nginx. Ma il fatto che Nginx sia lento non significa che questo pacchetto sia peggiore. Solo un test specifico. Se testiamo davvero qui, Apache “morirà” in caso di richieste lente.

Probabilmente vogliamo capire se ne abbiamo bisogno o meno.

Quando dovresti pensare alla compilazione?

Molto probabilmente, questo è necessario quando vediamo che il nostro collo di bottiglia è la CPU. Se siamo vincolati alla CPU e utilizziamo PHP come interprete standard, probabilmente vale la pena considerare che forse parte del progetto può essere compilato.

Per alcuni casi in cui l'applicazione necessita di autonomia per essere eseguita, è improbabile che questo metodo sia adatto.

Ridurre il numero di server. Quando ci sono molti server, riducendo la produttività di 2 volte, grosso modo, riduciamo anche il numero della metà. Quando si tratta di un server, non ha senso, ma quando ce ne sono 100-200, probabilmente ha senso.

Il motivo principale per cui Facebook ha iniziato a utilizzare HipHop è la presenza di grandi quantità di codice PHP che non c'è modo di riscrivere (o non c'è nessuno, o semplicemente è costoso). Aumentare la produttività di 2 volte è già positivo.

Probabilmente tutto. In attesa di domande.

Domande e risposte

Domanda del pubblico: Ciao. Per favore dimmi se hai altri esempi di implementazioni di successo di Hiphop, oltre a Facebook. Vorresti trasferire, ad esempio, il sito web di RBC su HipHop? Alexey Romanenko: Inizierò con il secondo. Il sito web della RBC è difficile da tradurre. Per quanto riguarda l'implementazione di successo. Ho compilato PHP Unit da solo, è stato compilato con successo. Inoltre, per quanto ne so, la scheda PHP Bunty viene compilata con successo. Numerose organizzazioni, infatti, utilizzano già la compilazione. Ulteriori test dimostreranno quanto sarà giustificato utilizzare questo progetto. Domanda del pubblico: Puoi fare un esempio di un'organizzazione che lo utilizza? Alexey Romanenko: Onestamente non te lo dirò adesso, ma questo è l’Occidente. Per quanto ne so, qui non lo usa nessuno. Domanda del pubblico: Qual è la differenza in fase di esecuzione oltre alla mancanza di supporto per alcune delle funzionalità che hai menzionato. Quanto è pericoloso tradurre un progetto “live”? Alexey Romanenko: La differenza è che qualsiasi programma compilato può bloccarsi. Forse appariranno alcuni problemi che non sono stati ancora identificati. In effetti, ci sono una serie di differenze nel "comportamento" del PHP stesso. Non li ho inclusi perché informazioni più dettagliate possono essere trovate nella documentazione. Il team di Facebook ha scritto il proprio interprete, che è essenzialmente equivalente al 99,9% a quello che funzionerà in forma compilata. È meglio testare il tuo codice non con un interprete PHP standard, ma, come ho detto, con hppi per PHP.

Quasi tutti gli sviluppatori prima o poi affrontano la necessità di eseguire o controllare rapidamente del codice, ma non tutti sanno che per un compito così semplice non è affatto necessario eseguire pesanti IDE desktop o compilatori di applicazioni. Basta utilizzare strumenti online che ti permettono di fare tutto molto più velocemente: Ctrl+C, Ctrl+V, Esegui, colpisci - e l'output del programma è già davanti ai tuoi occhi rossastri.

Abbiamo selezionato i migliori compilatori online: alcuni sono abbastanza universali, altri sono personalizzati per compiti rigorosamente definiti. In ogni caso, non saranno superflui.

Codificazione

Koding.com non è un compilatore online nel senso tradizionale. Ogni utente del servizio può creare diverse macchine virtuali a tutti gli effetti con Ubuntu 14.04 nel cloud, sulle quali può fare quello che vuole, inclusa la compilazione del codice. Tutte le lingue più diffuse sono supportate per impostazione predefinita, ma puoi facilmente aggiungerne di tue.

Oltre al pannello di controllo per il tuo server, nell'interfaccia sono disponibili un comodo IDE e una finestra terminale. Koding è lo strumento più universale; successivamente esamineremo opzioni più semplici e specializzate.

IdeaOne

IdeOne è un compilatore online e uno strumento di debug che ti consente di eseguire codice in oltre 60 linguaggi di programmazione e le loro versioni specifiche direttamente nel browser.

Per coloro che non hanno una ragazza, i creatori hanno fornito la compilazione del codice nel linguaggio Brainfuck.

JDoodle

Un altro compilatore online che supporta molte lingue, incluse alcune che non troverai in molti altri compilatori online. Una caratteristica interessante di JDoodle è la capacità di collaborare: basta inviare un collegamento alla sessione corrente e generare bug a doppia velocità!

jsFiddle

Non lasciarti ingannare dal nome: jsFiddle non è progettato solo per JavaScript. Questo editor front-end online ti consente di testare qualsiasi combinazione di JavaScript, HTML e CSS. Naturalmente è disponibile il supporto per diversi framework, ad esempio jQuery, Vue, React, TypeScript e preprocessori CSS come SCSS. Per comodità, puoi selezionare un'associazione di tasti dal tuo editor preferito. Vero, solo se il tuo editor preferito è Vim, Emacs o Sublime Text.

CodicePad

CodePad è un servizio minimalista in cui è possibile archiviare codice, condividerlo ed eseguirlo con successivo output dei risultati della sua esecuzione. Esistono molti dei linguaggi più comuni tra cui scegliere, ma sfortunatamente nessuna scelta di versioni specifiche di interpreti o compilatori.

Il suo vantaggio principale è la semplicità e la facilità: il sito funzionerà velocemente anche con una connessione Internet lenta. Viene fornita la connessione automatica delle intestazioni standard, nonché l'integrazione con Vim o Emacs.

Uno degli svantaggi è la completa mancanza di evidenziazione della sintassi quando si inserisce il codice nel modulo. Tuttavia, quando si visualizza una registrazione già salvata, la retroilluminazione è presente.

GCC GodBolt

GCC GodBolt è un compilatore C++ interattivo. Sono entrato in questa raccolta perché ha un'interfaccia semplice, oltre a un gran numero di impostazioni, comprese le opzioni che possono essere regolate utilizzando i tasti.

Esistono molte versioni del compilatore tra cui scegliere, comprese quelle più recenti. Una delle caratteristiche interessanti è la traduzione istantanea del codice del programma in linguaggio assembly.