Perché Facebook converte il codice PHP in C ++? [chiuso]


42

Ho letto che Facebook è iniziato in PHP, e quindi per guadagnare velocità, ora compilano PHP come codice C ++. In tal caso, perché non:

  1. Basta programmare in c ++? Sicuramente ci devono essere ALCUNI errori / bug quando si preme un pulsante del compilatore magico che porta PHP al codice c ++, giusto?

  2. Se questo impressionante convertitore funziona così bene, perché attenersi a PHP? Perché non usare qualcosa come Ruby o Python? Nota: ho scelto questi due a caso, ma soprattutto perché quasi tutti dicono che scrivere codice in quelle lingue è una "gioia". Quindi perché non sviluppare in un linguaggio super fantastico e quindi premere il pulsante di compilazione c ++ magico?


12
Entrambe le tue alternative significherebbe probabilmente buttare via tutto il codice PHP, strumenti e competenze specifici di PHP, metà dell'infrastruttura di supporto, ecc. Che è già lì e iniziare da zero.

Perché? Se riesci a convertire il codice in C ++, sicuramente chiunque può usare la propria lingua preferita, premere un pulsante di conversione e farlo impegnare nella base di codici C ++. No?
user72245

7
No. I compilatori, nel complesso, producono un codice funzionante ma brutto e innaturale, e spogliano cose come nomi variabili, commenti, per non parlare di tutti i tipi di astrazioni. In larga misura, questo è inevitabile. Mentre ci sono alcuni progetti che mirano a tradursi effettivamente in una base di codice mantenibile in un'altra lingua, il problema è molto più difficile, specialmente con lingue molto diverse. Inoltre, anche supponendo che esca perfettamente il C ++ idiomatico, tutti coloro che lavorano sulla base di codice dovrebbero imparare il C ++ o essere licenziati e sostituiti con persone che conoscono il C ++. E poi non hai ancora affrontato gli utensili.

1
Inoltre (l'ho appena scoperto da solo, ma è in linea con il mio istinto e la mia esperienza con altre implementazioni di linguaggio dinamico), si noti che il compilatore PHP-to-C ++ viene gradualmente eliminato e sostituito con un interprete bytecode + JIT chiamato HHVM ( sviluppato in seguito come parte dello stesso progetto ombrello) che lo supera ampiamente e ha meno restrizioni. Vedi github.com/facebook/hiphop-php/wiki

@Delnan: i compilatori difettosi producono codice brutto e innaturale. Ma è quasi inevitabile. Dai un'occhiata a Smart , che si compila fino a JavaScript. L'output è molto leggibile, a meno che non si attivi ovviamente l'offuscamento e / o la minificazione. <snark>(Nella misura in cui JS può mai essere definito "leggibile", cioè.)</snark>
Mason Wheeler,

Risposte:


65

Non lo fanno. Almeno non più. Risulta che farlo in quel modo provoca troppi problemi, tra cui mal di testa da dispiegamento e annullare uno dei principali vantaggi dell'utilizzo di un linguaggio di scripting in primo luogo - essere in grado di cambiare gli script senza dover ricompilare - così hanno rinnovato il sistema HipHop in un'architettura di macchina virtuale con una fase JIT trasparente e deprecato il compilatore C ++.

Abbastanza interessante, apparentemente farlo in questo modo è anche circa due volte più veloce (rispetto ai performanti) rispetto all'approccio originale di trans-compilazione C ++.


4
Tutto ciò che ottengo è che Facebook sta attraversando un momento difficile bilanciare le esigenze aziendali con le capacità degli sviluppatori. Interessante lo stesso, anche se aggiungerei che ottenere prestazioni migliori da una soluzione JIT rispetto a una nativa significa solo che il loro jiggerypokery PHP-> C ++ era in realtà pantaloni.
James,

7
@James Anche se dubito che "HipHopc" sia stato il miglior compilatore di ottimizzazione di sempre, quel particolare risultato non mostra che fanno schifo nella scrittura di compilatori, ma mostra solo che la compilazione statica di linguaggi dinamici è molto meno efficace della compilazione dinamica. Che è stato scoperto essere ripetutamente vero, da persone che sanno sicuramente come scrivere compilatori ottimizzanti. Un compilatore JIT può eseguire facilmente numerose ottimizzazioni. Un compilatore AOT (senza analisi costose dell'intero programma) raramente può fare molto di più che rimuovere il sovraccarico dell'interpretazione stessa, senza effettivamente rimuovere la dinamicità.

2
@delnan Bene, sì, se paralizzi il vantaggio principale di un compilatore AOT (analisi dell'intero programma) sottolineando l'intero punto di un compilatore AOT (avendo molto tempo per fare analisi), allora sicuramente non comparerà a un JIT che fa ciò che un JIT è bravo (ottimizzazioni rapide a sbirciatina). Ma non è giusto, adesso?
Alice,

2
@delnan Questo semplicemente non è vero, o almeno intellettualmente disonesto. Un JIT ha un tempo estremamente limitato rispetto ad un AOT per fare ottimizzazioni; Java ha scritto articoli sugli allocatori di registro che sono meno che ideali, ma abbastanza veloci per l'uso di JIT. L'uso di SSA consente enormi quantità di ottimizzazioni gratuite che la maggior parte della lotta della JIT deve tenere il passo. Gli AOT possono utilizzare algoritmi di inferenza del tipo comprovati (Hindley – Milner e algoritmo W) che non sono complicati, mentre un JIT non lo ottiene assolutamente gratuitamente, pagando i costi in termini di memoria. Una SIC può fare meglio alcune ottimizzazioni, così come una AOT.
Alice,

1
@Alice Stiamo parlando di linguaggi altamente dinamici. Non esistono algoritmi di inferenza di tipo AOT (cioè statici) semplici ed efficaci per linguaggi come Python o JavaScript. Esistono complicati algoritmi on-line / run-time (come quelli usati in SpiderMonkey per esempio) che sono efficaci, e ci sono complicati algoritmi AOT (ad esempio Starkiller) che finora non sono riusciti a dimostrarsi efficaci. L'algoritmo W non inizia nemmeno ad affrontare le complessità dei linguaggi dinamici.

34

L'ingegnere senior di Facebook Haiping Zhao probabilmente risponde meglio alle tue domande .

  1. HipHop trasforma a livello di codice il codice sorgente PHP in C ++ altamente ottimizzato e quindi utilizza g ++ per compilarlo. HipHop esegue il codice sorgente in modo semanticamente equivalente e sacrifica alcune funzionalità usate raramente - come eval () - in cambio di prestazioni migliorate.

  2. Un modo comune per affrontare queste inefficienze è riscrivere le parti più complesse dell'applicazione PHP direttamente in C ++ come estensioni PHP. Questo in gran parte trasforma PHP in un linguaggio colla tra il tuo front-end HTML e la logica dell'applicazione in C ++. Da un punto di vista tecnico funziona bene, ma riduce drasticamente il numero di ingegneri che sono in grado di lavorare sull'intera applicazione.

Il resto del post sul blog è una buona lettura e lo consiglio vivamente. Fornisce alcune informazioni sulle sfide di programmazione affrontate da Facebook e su come stanno cercando di affrontare questi problemi.


7
Si noti che questo è obsoleto; quello era il loro primo tentativo, ma Facebook non lo fa più in questo modo. Vedi la mia risposta, sotto.
Mason Wheeler,

@MasonWheeler: ottimo collegamento e aggiornamento.

19

Basta programmare in c ++? Sicuramente ci devono essere ALCUNI errori / bug quando si preme un pulsante del compilatore magico che porta PHP al codice c ++, giusto?

Giusto, ma la programmazione in C ++ implicherebbe la sostituzione dell'intera base di codice esistente, un'idea di fama mondiale per essere assolutamente stupida e devastante.

Se questo impressionante convertitore funziona così bene, perché attenersi a PHP? Perché non usare qualcosa come Ruby o Python? Nota: ho scelto questi due a caso, ma soprattutto perché quasi tutti dicono che scrivere codice in quelle lingue è una "gioia". Quindi perché non sviluppare in un linguaggio super fantastico e quindi premere il pulsante di compilazione c ++ magico?

Perché ciò implicherebbe, ancora una volta, la sostituzione della loro base di codice PHP esistente.

In un mondo ideale, semplicemente scriverebbero codice in C ++ da zero. Sfortunatamente, poiché hanno un carico di codice esistente in PHP, questo non è possibile. Quindi, invece, risolvono il problema. È solo molto più economico.


2
+1 per questo: "Quindi, invece, risolvono il problema. È solo molto più economico." È vero - se hanno 3500 ingegneri che lavorano sul loro prodotto, è più economico ottenere un piccolo team di 5-50 persone concentrato sulla scrittura di un buon compilatore PHP-> C ++, piuttosto che avere l'intero team di ingegneri riscrivere un codice di 6 anni .
Suman,

Scusa, sono confuso. Perché dovrebbero riscriverlo . L'hai appena detto tu stesso: HipHop converte tutto il codice in C ++. Quindi basta convertirlo, quindi attenersi al C ++.
user72245

16
@ user72245 solo perché lo converte in C ++ non significa che lo converta in C ++ leggibile o
gestibile

Perché questo they hack around the problem? L'ottimizzazione del codice tramite C ++ o anche l'assemblaggio non è affatto nuova, lo facevo da prima che esistesse un PC.
Steve,

tieni presente anche che i programmatori di Facebook sono programmatori PHP. Sicuro che potresti convertirlo tutto in C ++ e iniziare a programmare in C ++, ma i tuoi programmatori esistenti non hanno esperienza in questo linguaggio. Dovresti riqualificarli o assumere nuovi programmatori per continuare lo sviluppo.
Gavin Coates,

8

"In effetti, perché non lavorare direttamente in assembly, poiché il codice C ++ viene infine tradotto in istruzioni di codice macchina?"

- Questo, nella sua essenza, è ciò a cui l'argomento si riduce. E spero che questo renda evidente il motivo per cui non è stato fatto:

  • Per programmare in assembly (C ++) è necessario un set di abilità (enormemente diverso) rispetto a C ++ (PHP).
  • È potenzialmente molto più difficile da programmare, per una serie di motivi
  • Il codice prodotto da un assemblatore / compilatore potrebbe non essere leggibile dall'uomo (parlare: mantenibile), anche se è possibile , da zero, scrivere programmi leggibili in assembly (C ++).

2
Una volta ho gestito una domanda di assicurazione scritta in assemblea concepita negli anni '70. In ottobre, mi è stato assegnato il compito di cambiare i saluti in una "lettera" per dire l'equivalente di "Buone Feste". Fu completato solo a febbraio dell'anno successivo a causa della complessità. Sono diventato molto esperto nell'assemblaggio e ho potuto scrivere codice ottimale, a condizione che non fosse più di un paio di migliaia di righe. Tuttavia, i compilatori COBOL e C mi hanno dato un calcio nel culo e hanno prodotto un codice molto più ottimale per la piattaforma su cui stavamo girando, specialmente per i sistemi che superavano le linee di assemblaggio superiori a 1 m. Non ha senso per gli affari.
Bloudraak,

5

Non sono su Facebook, ma la mia migliore ipotesi sui motivi sarebbe "evitare rischi significativi". A questo punto, il passaggio a una lingua diversa non è più una decisione tecnologica: soprattutto, è una decisione aziendale.

Quando sei una grande azienda cresciuta organicamente fino alla dimensione di FB, attiri lentamente persone che poi acquisiscono esperienza nella tua piattaforma di programmazione (nel caso di FB, questo è PHP). Uno per uno, ottieni poche migliaia di dipendenti con una grande esperienza in PHP. A questo punto, passare a qualsiasi altra lingua diventa molto pericoloso: i tuoi ingegneri non saranno al passo con il nuovo ecosistema e potrebbero richiedere un tempo significativo per raggiungere il livello di competenza richiesto dai loro lavori attuali, e tanto meno migliorare le loro abilità.

Tralasciando i meriti relativi di PHP e delle lingue alternative, con la quantità di investimenti che l'FB ha fatto nella tecnologia PHP sarebbe troppo arrogante pensare che un passaggio sarebbe indolore e troppo sciocco per provarlo. Negli affari, la tecnologia è un mezzo per raggiungere un fine, quindi la "gioia" della programmazione non entra nemmeno nelle discussioni.


4

Mi viene in mente solo un sito Web importante che è stato implementato in C ++. H2G2

Anche allora l'attuale attrezzo è in realtà un interprete con un gran numero di funzioni di manipolazione del testo e del database integrate (non suona un po 'come e PHP iniziale :-)).

Facebook è abbastanza soddisfatto della funzionalità del proprio sito Web. Sono appena cresciuti al punto che PHP vanilla non può supportare i volumi che elaborano. Da qui la compilazione di lì PHP in C ++ quindi codice macchina. Avrebbero potuto scrivere un compilatore completo per PHP, ma avrebbero perso i 20 anni di sottile ottimizzazione che sono entrati nello stack del compilatore gcc. Il punto è che il codice "C ++" non è pensato per essere leggibile dall'uomo o mantenibile, è solo un passaggio intermedio sulla strada per il codice macchina.

Come molti programmatori su questo sito, sento che sottovaluti la quantità di lavoro investito nella sua logica aziendale e funzionalità incorporate nelle applicazioni esistenti e, nel suo valore, il codice valore.


Posso pensare a dozzine, ora che WT ha successo.
Alice,

@Alice - interessante! Ma non riesco a trovare nessuno che lo utilizza per un sito ad alto volume. Inoltre ciao mondo 30 qualcosa righe di codice per fare 5 righe di codice PHP.
James Anderson,

Confrontare un esempio di "ciao mondo" è ridicolo. In meno di 100 righe, posso impostare un websocket abilitato, un lungo sondaggio indietro, un widget progressivamente migliorato con SEO ottimale, URL automatici puliti senza caricamenti di pagine complete utilizzando AJAX e un ingombro CPU / RAM ridotto. PHP, almeno nelle configurazioni tipiche, non può eseguire WebSocket, sondaggi lunghi, URL puliti senza aiuto, URL puliti con AJAX e utilizzerà sicuramente un'enorme quantità (relativamente) di RAM / CPU. Per le webapp e non semplici esempi, WT e C ++ sono drasticamente superiori e con C ++ 11, comparabili in lunghezza.
Alice,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.