Pourquoi Facebook convertit-il le code PHP en C ++? [fermé]

42

J'ai lu que Facebook avait commencé en PHP, puis pour gagner en rapidité, ils compilent maintenant PHP sous forme de code C ++. Si c'est le cas, pourquoi ne pas:

  1. Juste programmer en c ++? Il doit sûrement y avoir quelques erreurs / bugs lorsqu’on clique sur un bouton du compilateur magique qui porte PHP en code c ++, n’est-ce pas?

  2. Si cet impressionnant convertisseur fonctionne si bien, pourquoi rester en PHP? Pourquoi ne pas utiliser quelque chose comme Ruby ou Python? Note - J'ai choisi ces deux au hasard, mais surtout parce que presque tout le monde dit que coder dans ces langues est une "joie". Alors pourquoi ne pas développer dans un super langage et ensuite appuyer sur le bouton de compilation magique c ++?

utilisateur72245
la source
12
Vos deux alternatives signifieraient probablement rejeter tout le code PHP, les outils et l'expertise spécifiques à PHP, la moitié de l'infrastructure de support, etc. déjà présents et en partant de zéro.
Pourquoi? Si vous pouvez convertir le code en C ++, tout le monde peut utiliser son langage favori, cliquer sur un bouton de conversion et le faire valider dans la base de code C ++. Non?
user72245
7
Non, les compilateurs produisent en gros un code qui fonctionne, mais qui est laid et contre nature, et suppriment des éléments tels que les noms de variables, les commentaires, sans parler de toutes sortes d'abstractions. Dans une large mesure, c'est inévitable. Bien que certains projets visent à traduire réellement dans un code base maintenable dans une autre langue, le problème est beaucoup plus difficile, notamment avec des langues très différentes. En outre, même en supposant que le C ++ parfaitement idiomatique apparaisse, toute personne travaillant sur la base de code devrait apprendre le C ++ ou être renvoyée et remplacée par des personnes connaissant le C ++. Et puis vous n'avez toujours pas abordé l'outillage.
1
Aussi (je viens de découvrir cela moi-même, mais cela correspond à mon instinct et à mon expérience avec d'autres implémentations de langage dynamique), notez que le compilateur PHP-à-C ++ est en train d'être supprimé et remplacé par un interpréteur de bytecode + JIT appelé HHVM ( développés plus tard dans le cadre du même projet-cadre) qui le surperforme énormément et a moins de restrictions. Voir github.com/facebook/hiphop-php/wiki
@Delnan: Les mauvais compilateurs produisent un code laid et non naturel. Mais c'est à peine inévitable. Jetez un coup d'œil à Smart , qui compile jusqu'à JavaScript. La sortie est très lisible, sauf si vous activez l’obscurcissement et / ou la minification bien sûr. <snark>(Dans la mesure où JS peut toujours être appelé "lisible", c'est-à-dire.)</snark>
Mason Wheeler

Réponses:

65

Ils ne le font pas. Pas plus, du moins. Cela pose trop de problèmes, notamment des problèmes de déploiement et l’annulation de l’un des principaux avantages de l’utilisation d’un langage de script: pouvoir modifier les scripts sans recompiler. Ils ont donc réorganisé le système HipHop. une architecture de machine virtuelle avec une phase JIT transparente et déconseillé le compilateur C ++.

Il est intéressant de noter qu'apparemment, le faire de cette façon est environ deux fois plus rapide (que dans performant) que l'approche de trans-compilation C ++ d'origine.

Maçon Wheeler
la source
4
Tout ce que je comprends de cela, c'est que Facebook a du mal à trouver un équilibre entre les besoins de l'entreprise et les capacités des développeurs. Intéressant tout de même, bien que j'ajouterais que pour obtenir de meilleures performances d'une solution JIT par rapport à une solution native, cela signifie simplement que leur jiggerypokery PHP-> C ++ était en fait un pantalon.
James
7
@ James Bien que je doute que "HipHopc" ait été le plus grand compilateur d'optimisation à ce jour, ce résultat particulier ne montre pas qu'ils craignent d'écrire des compilateurs, cela montre simplement que la compilation statique de langages dynamiques est beaucoup moins efficace que la compilation dynamique. Ce qui a été constaté à maintes reprises par des personnes qui savent comment écrire des compilateurs d'optimisation. Un compilateur JIT peut facilement réaliser une multitude d’optimisations. Un compilateur AOT (sans analyse très coûteuse de l'ensemble du programme) peut rarement faire beaucoup plus que supprimer le surcoût de l'interprétation elle-même, sans supprimer réellement la dynamique.
2
@delnan Eh bien, oui, si vous bloquez le principal avantage d'un compilateur AOT (analyse complète du programme) en soulignant le point entier d'un compilateur AOT (avoir beaucoup de temps pour effectuer une analyse), alors, il ne comparera pas JIT fait ce qu’elle est bonne (optimisations rapides). Mais ce n'est pas juste, n'est-ce pas?
Alice
2
@ delnan Ce n'est tout simplement pas vrai, ou du moins intellectuellement malhonnête. Une équipe commune d'enquête dispose de peu de temps par rapport à une AOT pour effectuer des optimisations; Java a écrit des articles sur les allocateurs de registre qui n'étaient pas idéaux, mais suffisamment rapides pour être utilisés par JIT. L'utilisation de SSA permet d'obtenir d'énormes quantités d'optimisations gratuites que la plupart des JIT ont du mal à suivre. Les AOT peuvent utiliser des algorithmes d'inférence de type éprouvés (Hindley – Milner et l'algorithme W) qui ne sont pas compliqués, alors qu'une JIT ne l'obtient absolument pas gratuitement, en payant des coûts en termes de mémoire. Un JIT peut mieux faire certaines optimisations, de même qu'un AOT.
Alice
1
@ Alice Nous parlons de langages très dynamiques. Il n'y a pas d'algorithme d'inférence de type AOT (c'est-à-dire statique) simple et efficace pour des langages tels que Python ou JavaScript. Il existe des algorithmes complexes en ligne / d'exécution (tels que ceux utilisés dans SpiderMonkey, par exemple) qui sont efficaces, et il existe des algorithmes AOT complexes (par exemple, Starkiller) qui n'ont jusqu'à présent pas prouvé leur efficacité. L'algorithme W ne commence même pas à aborder la complexité des langages dynamiques.
34

L'ingénieur principal de Facebook, Haiping Zhao, répond probablement mieux à vos questions .

  1. HipHop transforme par programmation votre code source PHP en C ++ hautement optimisé, puis utilise g ++ pour le compiler. HipHop exécute le code source de manière sémantique et sacrifie certaines fonctionnalités rarement utilisées, telles que eval (), en échange de performances améliorées.

  2. Un moyen courant de remédier à ces inefficiences consiste à réécrire les parties les plus complexes de votre application PHP directement en C ++ en tant qu'extensions PHP. Cela transforme en grande partie PHP en un langage collé entre votre HTML frontal et la logique applicative en C ++. D'un point de vue technique, cela fonctionne bien, mais réduit considérablement le nombre d'ingénieurs capables de travailler sur l'ensemble de votre application.

Le reste de l'article est une bonne lecture, et je le recommande. Cela donne une idée des problèmes de programmation auxquels Facebook est confrontée et de la façon dont ils tentent de résoudre ces problèmes.

josh3736
la source
7
Notez que ceci est obsolète; c'était leur premier essai, mais Facebook ne le fait plus de cette façon. Voir ma réponse ci-dessous.
Mason Wheeler
@MasonWheeler - excellent lien et mise à jour.
19

Juste programmer en c ++? Il doit sûrement y avoir quelques erreurs / bugs lorsqu’on clique sur un bouton du compilateur magique qui porte PHP en code c ++, n’est-ce pas?

C'est vrai, mais programmer en C ++ impliquerait de remplacer l'intégralité de leur base de code existante - une idée mondialement reconnue pour sa stupidité et sa dévastation.

Si cet impressionnant convertisseur fonctionne si bien, pourquoi rester en PHP? Pourquoi ne pas utiliser quelque chose comme Ruby ou Python? Note - J'ai choisi ces deux au hasard, mais surtout parce que presque tout le monde dit que coder dans ces langues est une "joie". Alors pourquoi ne pas développer dans un super langage et ensuite appuyer sur le bouton de compilation magique c ++?

Cela impliquerait, encore une fois, le remplacement de leur base de code PHP existante.

Dans un monde idéal, ils coderaient simplement en C ++ à partir de zéro. Malheureusement, comme ils ont un tas de code existant en PHP, ce n'est pas possible. Alors, au lieu de cela, ils corrigent le problème. C'est tellement moins cher.

DeadMG
la source
2
+1 pour ceci: "Alors, au lieu de cela, ils corrigent le problème. C'est tellement moins cher." C'est vrai - si 3500 ingénieurs travaillent sur leur produit, cela coûte moins cher de former une petite équipe de 5 à 50 personnes concentrée sur l'écriture d'un bon compilateur PHP-> C ++, plutôt que de demander à toute l'équipe d'ingénieurs de réécrire 6 années de code .
Suman
Désolé, je suis confus. Pourquoi devraient-ils le réécrire ? Vous venez de le dire vous-même - HipHop convertit tout le code en C ++. Il suffit donc de le convertir, puis de coller en C ++.
user72245
16
@ user72245 simplement parce qu'il le convertit en C ++ ne signifie pas qu'il le convertit en C ++ lisible ou maintenable
Mr.Mindor
Pourquoi est - ce they hack around the problem? Optimiser le code en C ++ ou même en assembleur n’est pas une nouveauté, il le faisait avant l’installation d’un PC.
Steve
gardez également à l'esprit que les programmeurs de Facebook sont des programmeurs PHP. Vous pouvez certes tout convertir en C ++ et commencer à programmer en C ++, mais vos programmeurs existants n’ont aucune expérience de ce langage. Vous devrez les recycler ou engager de nouveaux programmeurs pour poursuivre le développement.
Gavin Coates
8

“En effet, pourquoi ne pas travailler directement en assembleur, car le code C ++ est finalement traduit en instructions de code machine?”

- C’est en substance ce à quoi l’argument se réduit. Et j'espère que cela explique pourquoi cela n'a pas été fait:

  • Un ensemble de compétences (considérablement!) Différent est requis pour programmer en assembleur (C ++) et en C ++ (PHP).
  • Il est potentiellement beaucoup plus difficile à programmer, pour diverses raisons
  • Le code produit par un assembleur / compilateur peut ne pas être lisible par l'homme (parler: maintenable), même si vous pouvez , à partir de zéro, écrire des programmes lisibles en assembleur (C ++).
Konrad Rudolph
la source
2
Une fois, j’ai maintenu une demande d’assurance écrite en assemblée conçue dans les années 1970. En octobre, on m'a demandé de modifier les salutations sur une "lettre" pour dire l'équivalent de "Joyeuses fêtes". Il n'a été achevé qu'en février de l'année suivante en raison de sa complexité. Je suis devenu très compétent en assemblage et je pouvais écrire du code optimal, à condition que ce ne soit pas plus que quelques milliers de lignes. Cependant, les compilateurs COBOL et C m'ont donné un coup de pied et ont produit un code plus optimal pour la plate-forme sur laquelle nous travaillions, en particulier pour les systèmes dépassant 1 m de lignes d'assemblage. Cela n'a aucun sens commercial.
Bloudraak
5

Je ne suis pas sur Facebook, mais ma meilleure hypothèse quant aux motifs serait "d’éviter des risques importants". À ce stade, le changement de langue n’est plus une décision technologique: c’est avant tout une décision commerciale.

Lorsque vous êtes une grande entreprise dont la taille correspond à celle de FB, vous attirez lentement des personnes qui acquièrent ensuite une expertise dans votre plate-forme de programmation (dans le cas de FB, il s’agit de PHP). Un par un, vous obtenez quelques milliers d'employés possédant une grande expertise en PHP. À ce stade, le passage à une autre langue devient très dangereux: vos ingénieurs ne maîtriseront pas le nouvel écosystème et auront besoin d'un temps considérable pour atteindre le niveau d'expertise requis par leurs emplois actuels, sans parler de l'amélioration de leurs compétences.

Laissant de côté les mérites relatifs de PHP et des langages alternatifs, avec le montant des investissements que FB a réalisés dans la technologie PHP, il serait trop arrogant de penser qu'un changement serait indolore et trop fou pour le tenter. En affaires, la technologie est un moyen de parvenir à une fin; la "joie" de la programmation n’entre même pas dans les discussions.

dasblinkenlight
la source
4

Je peux penser à un seul site Web majeur implémenté en C ++. H2G2

Même dans ce cas, l’implémentation actuelle est en fait un interpréteur avec un grand nombre de fonctions de manipulation de texte et de base de données intégrées (cela ne sonne-t-il pas un peu comme au début de PHP :-)).

Facebook est très satisfait des fonctionnalités de son site Web. Ils viennent juste de grandir à un point tel que PHP vanilla ne peut plus supporter les volumes traités. D'où la compilation de PHP en C ++, puis du code machine. Ils auraient pu écrire un compilateur complet pour PHP, mais ils auraient raté 20 années d’optimisation subtile dans la pile du compilateur gcc. Le point est que le code "C ++" n'est pas censé être lisible ou maintenable par l'homme, il s'agit simplement d'une étape intermédiaire sur la voie du code machine.

Comme beaucoup de programmeurs sur ce site, je pense que vous sous-estimez la quantité de travail investie dans la logique et les fonctionnalités de l'entreprise intégrées dans les applications existantes et dans le code de valeur en soi.

James Anderson
la source
Je peux penser à des dizaines, maintenant que WT est un succès.
Alice
@Alice - intéressant! Mais je ne trouve personne qui l'utilise pour un site à volume élevé. De plus, hello world 30 quelque chose de code pour faire 5 lignes de code PHP.
James Anderson
Comparer un exemple de "bonjour le monde" est en quelque sorte ridicule. En moins de 100 lignes, je peux configurer un WebSockets activé, un long sondage, un widget progressivement amélioré avec un référencement optimal, des URL propres nettes sans chargement complet de la page avec AJAX, et un encombrement réduit en CPU / RAM. PHP, du moins dans les configurations classiques, ne peut pas créer de Websockets, interroger de long, nettoyer des URL sans aide, nettoyer des URL avec AJAX, et il utilisera certainement une quantité (relativement) importante de RAM / CPU. Pour les applications Web et non pour les exemples simples, WT et C ++ sont considérablement supérieurs, et avec C ++ 11, leur longueur est comparable.
Alice