¿Por qué Facebook convierte el código PHP a C ++? [cerrado]

42

Leí que Facebook comenzó en PHP, y luego para ganar velocidad, ahora compilan PHP como código C ++. Si ese es el caso, ¿por qué no ellos:

  1. ¿Solo programar en c ++? Seguramente debe haber ALGUNOS errores / errores al presionar un botón del compilador mágico que porta PHP a código c ++, ¿verdad?

  2. Si este impresionante convertidor funciona tan bien, ¿por qué quedarse con PHP? ¿Por qué no usar algo como Ruby o Python? Nota: elegí estos dos al azar, pero principalmente porque casi todos dicen que codificar en esos idiomas es una "alegría". Entonces, ¿por qué no desarrollar en un lenguaje súper genial y luego presionar el botón mágico de compilación de c ++?

usuario72245
fuente
12
Es probable que ambas alternativas signifiquen desechar todo el código PHP, las herramientas y la experiencia específicas de PHP, la mitad de la infraestructura de soporte, etc., que ya está allí y que comienza desde cero.
¿Por qué? Si puede convertir el código a C ++, seguramente cualquiera puede usar su idioma favorito, presionar un botón de conversión y hacer que se comprometa con la base de código de C ++. ¿No?
user72245
77
No. Los compiladores, en general, producen código funcional pero feo y antinatural, y eliminan cosas como nombres de variables, comentarios, sin mencionar todo tipo de abstracciones. En gran medida, esto es inevitable. Si bien hay algunos proyectos que apuntan a traducir realmente a una base de código mantenible en otro idioma, el problema es mucho más difícil, especialmente con idiomas muy diferentes. Además, incluso suponiendo que sale C ++ perfectamente idiomático, todos los que trabajan en la base de código tendrían que aprender C ++ o ser despedidos y reemplazados por personas que conocen C ++. Y luego aún no ha abordado las herramientas.
1
Además (acabo de descubrir esto yo mismo, pero está en línea con mi intuición y mi experiencia con otras implementaciones de lenguaje dinámico), tenga en cuenta que el compilador de PHP a C ++ se está eliminando gradualmente y reemplazado por un intérprete de código de bytes + JIT llamado HHVM ( desarrollado más tarde como parte del mismo proyecto general) que lo supera enormemente y tiene menos restricciones. Ver github.com/facebook/hiphop-php/wiki
@Delnan: Los compiladores malos producen código feo y antinatural. Pero no es inevitable. Echa un vistazo a Smart , que se compila en JavaScript. El resultado es muy legible, a menos que active la ofuscación y / o la minificación, por supuesto. <snark>(En la medida en que JS pueda llamarse "legible", es decir)</snark>
Mason Wheeler

Respuestas:

65

Ellos no. Ya no, al menos. Resulta que hacerlo de esa manera causa demasiados problemas, incluidos dolores de cabeza de implementación y anular una de las principales ventajas de usar un lenguaje de secuencias de comandos en primer lugar, poder cambiar las secuencias de comandos sin necesidad de volver a compilar, por lo que renovaron el sistema HipHop en una arquitectura VM con una fase JIT transparente y en desuso el compilador de C ++.

Curiosamente, aparentemente hacerlo de esta manera también es aproximadamente el doble de rápido (como en el rendimiento) que el enfoque original de compilación trans de C ++.

Mason Wheeler
fuente
44
Todo lo que obtengo de esto es que Facebook está teniendo dificultades para equilibrar las necesidades del negocio con las capacidades del desarrollador. De todos modos, es interesante, aunque agregaría que obtener un mejor rendimiento de una solución JIT en lugar de una nativa solo significa que su jiggerypokery PHP-> C ++ era de hecho pantalones.
James
77
@James Aunque dudo que "HipHopc" haya sido el mejor compilador de optimización de la historia, ese resultado en particular no muestra que sean malos para escribir compiladores, solo muestra que la compilación estática de lenguajes dinámicos es mucho menos efectiva que la compilación dinámica. Lo que resultó ser cierto varias veces, por personas que definitivamente saben cómo escribir compiladores de optimización. Un compilador JIT puede realizar una gran cantidad de optimizaciones fácilmente. Un compilador AOT (sin un análisis de programa completo muy costoso) rara vez puede hacer mucho más que eliminar la sobrecarga de la interpretación en sí, sin eliminar la dinámica.
2
@delnan Bueno, sí, si paraliza el beneficio principal de un compilador AOT (análisis de todo el programa) al señalar el punto completo de un compilador AOT (que tiene mucho tiempo para hacer el análisis), entonces seguro, no se comparará a un JIT haciendo lo que un JIT es bueno (optimizaciones rápidas). Pero no es justo, ¿verdad?
Alice
2
@delnan Esto simplemente no es cierto, o al menos intelectualmente deshonesto. Un JIT tiene un tiempo extremadamente limitado en comparación con un AOT para hacer optimizaciones; Java escribió documentos sobre asignadores de registros que son menos que ideales, pero lo suficientemente rápidos como para usarlos en JIT. El uso de SSA permite enormes cantidades de optimizaciones gratuitas que la mayoría de los JIT luchan para mantenerse al día. Los AOT pueden usar algoritmos de inferencia de tipos probados (Hindley-Milner y el algoritmo W) que no son complicados, mientras que un JIT no lo obtiene de forma gratuita, pagando costos en términos de memoria. Un JIT puede hacer algunas optimizaciones mejor, y también un AOT.
Alice
1
@Alice Estamos hablando de lenguajes altamente dinámicos. No existen algoritmos de inferencia de tipo AOT (es decir, estáticos) simples y efectivos para lenguajes como Python o JavaScript. Existen algoritmos complicados en línea / tiempo de ejecución (como los utilizados en SpiderMonkey, por ejemplo) que son efectivos, y hay algoritmos AOT complicados (por ejemplo, Starkiller) que hasta ahora no demostraron ser efectivos. El algoritmo W ni siquiera comienza a abordar las complejidades de los lenguajes dinámicos.
34

El ingeniero sénior de Facebook Haiping Zhao probablemente responde mejor a sus preguntas .

  1. HipHop transforma programáticamente su código fuente PHP en C ++ altamente optimizado y luego usa g ++ para compilarlo. HipHop ejecuta el código fuente de una manera semánticamente equivalente y sacrifica algunas características raramente utilizadas, como eval (), a cambio de un mejor rendimiento.

  2. Una forma común de abordar estas ineficiencias es reescribir las partes más complejas de su aplicación PHP directamente en C ++ como Extensiones PHP. Esto transforma PHP en gran medida en un lenguaje de pegamento entre su front-end HTML y la lógica de la aplicación en C ++. Desde una perspectiva técnica, esto funciona bien, pero reduce drásticamente la cantidad de ingenieros que pueden trabajar en toda su aplicación.

El resto de la publicación del blog es una buena lectura, y lo recomiendo. Da una idea de los desafíos de programación que enfrenta Facebook y cómo están tratando de resolver esos problemas.

josh3736
fuente
77
Tenga en cuenta que esto es obsoleto; ese fue su primer intento, pero Facebook ya no lo hace de esta manera. Vea mi respuesta a continuación.
Mason Wheeler
@MasonWheeler: excelente enlace y actualización.
19

¿Solo programar en c ++? Seguramente debe haber ALGUNOS errores / errores al presionar un botón del compilador mágico que porta PHP a código c ++, ¿verdad?

Correcto, pero programar en C ++ implicaría reemplazar toda su base de código existente, una idea mundialmente conocida por ser completamente estúpida y devastadora.

Si este impresionante convertidor funciona tan bien, ¿por qué quedarse con PHP? ¿Por qué no usar algo como Ruby o Python? Nota: elegí estos dos al azar, pero principalmente porque casi todos dicen que codificar en esos idiomas es una "alegría". Entonces, ¿por qué no desarrollar en un lenguaje súper genial y luego presionar el botón mágico de compilación de c ++?

Porque eso, de nuevo, implicaría reemplazar su base de código PHP existente.

En un mundo ideal, simplemente codificarían en C ++ desde cero. Desafortunadamente, debido a que tienen un montón de código existente en PHP, eso no es posible. Entonces, en cambio, piratean el problema. Es mucho más barato.

DeadMG
fuente
2
+1 para esto: "Así que, en cambio, piratean el problema. Es mucho más barato". Es cierto: si tienen 3500 ingenieros trabajando en su producto, es mucho más barato conseguir que un pequeño equipo de 5-50 personas se concentre en escribir un buen compilador PHP-> C ++, que hacer que todo el equipo de ingeniería reescriba 6 años de código .
Suman
Lo siento estoy confundido. ¿Por qué tendrían que reescribirlo ? Acaba de decirlo usted mismo: HipHop convierte todo el código a C ++. Tan solo conviértalo, luego pegue en C ++.
usuario72245
16
@ user72245 solo porque lo convierte a C ++ no significa que lo convierta en C ++ legible o mantenible
Mr.Mindor
¿Por qué es esto they hack around the problem? La optimización del código usando C ++ o incluso el ensamblaje no es nada nuevo, lo he estado haciendo desde antes de que hubiera una PC.
Steve
También tenga en cuenta que los programadores de Facebook son programadores PHP. Claro que puede convertirlo a C ++ y comenzar a programar en C ++, pero sus programadores existentes no tienen experiencia en este lenguaje. Tendría que volver a capacitarlos o contratar nuevos programadores para continuar el desarrollo.
Gavin Coates
8

"De hecho, ¿por qué no trabajar en ensamblado directamente, ya que el código C ++ se traduce finalmente en instrucciones de código de máquina?"

- Eso, en esencia, es a lo que se reduce el argumento. Y espero que esto haga obvio por qué no se hace:

  • Se requiere un conjunto de habilidades (¡muy amplio!) Diferente para programar en ensamblado (C ++) que en C ++ (PHP).
  • Es potencialmente mucho más difícil de programar, por una variedad de razones.
  • El código producido por un ensamblador / compilador puede no ser legible por humanos (hablar: mantenible), aunque puede , desde cero, escribir programas legibles en ensamblador (C ++).
Konrad Rudolph
fuente
2
Una vez mantuve una solicitud de seguro escrita en asamblea concebida en la década de 1970. En octubre, me encargaron cambiar los saludos en una "carta" para decir el equivalente de "Felices Fiestas". Solo se completó en febrero del próximo año debido a la complejidad. Me volví muy competente en ensamblaje y podía escribir código óptimo, siempre que no fuera más que un par de miles de líneas. Sin embargo, los compiladores COBOL y C me patearon el trasero y produjeron un código mucho más óptimo para la plataforma en la que estábamos ejecutando, especialmente para sistemas que superan las líneas de ensamblaje de 1 millón. No tiene sentido comercial.
bloudraak
5

No estoy en Facebook, pero mi mejor conjetura sobre los motivos sería "evitar riesgos significativos". En este punto, cambiar a un idioma diferente ya no es una decisión tecnológica: sobre todo, es una decisión comercial.

Cuando eres una gran empresa que creció orgánicamente al tamaño de FB, atraes lentamente a personas que luego adquieren experiencia en tu plataforma de programación (en el caso de FB, eso es PHP). Uno por uno, obtienes unos pocos miles de empleados con gran experiencia en PHP. En este punto, cambiar a cualquier otro idioma se vuelve muy peligroso: sus ingenieros no estarán al día en el nuevo ecosistema y pueden requerir un tiempo significativo para alcanzar el nivel de experiencia exigido por sus trabajos actuales, y mucho menos mejorar sus habilidades.

Dejando de lado los méritos relativos de PHP y los lenguajes alternativos, con la cantidad de inversión que el FB hizo en la tecnología PHP, sería demasiado arrogante pensar que un cambio sería indoloro y demasiado tonto para intentarlo. En los negocios, la tecnología es un medio para un fin, por lo que la "alegría" de la programación ni siquiera entra en discusión.

dasblinkenlight
fuente
4

Solo puedo pensar en un sitio web importante que se implementó en C ++. H2G2

Incluso entonces, el ión de implementación actual es en realidad un intérprete con una gran cantidad de funciones de manipulación de texto y bases de datos incorporadas (eso no suena un poco como PHP anterior :-)).

Facebook está bastante contento con la funcionalidad de su sitio web. Acaban de crecer hasta el punto en que PHP vainilla no puede soportar los volúmenes que procesan. De ahí la compilación de PHP allí en el código de máquina de C ++. Podrían haber escrito un compilador completo para PHP, pero se habrían perdido los 20 años de optimización sutil que se han introducido en la pila del compilador gcc. El punto es que el código "C ++" no debe ser legible o mantenible por humanos, es solo un paso intermedio en el camino hacia el código de la máquina.

Al igual que muchos programadores en este sitio, siento que usted subestima la cantidad de trabajo invertido en la lógica empresarial y la funcionalidad integrada en las aplicaciones existentes, y valora el código por sí mismo.

James Anderson
fuente
Puedo pensar en docenas, ahora que WT tiene éxito.
Alice
@Alice - ¡interesante! Pero no puedo encontrar a nadie que use esto para un sitio de alto volumen. Además de hello world 30 algo líneas de código para hacer 5 líneas de código PHP.
James Anderson
Comparar un ejemplo de "hola mundo" es algo ridículo. En menos de 100 líneas, puedo configurar un websockets habilitado, una larga encuesta de retroceso, un widget mejorado progresivamente con un SEO óptimo, URL limpias automáticas sin cargas de página completas usando AJAX y una pequeña huella de CPU / RAM. PHP, al menos en configuraciones típicas, no puede hacer websockets, encuestas largas, limpiar URL sin ayuda, limpiar URL con AJAX, y definitivamente usará una enorme (comparativamente) cantidad de RAM / CPU. Para aplicaciones web y ejemplos no simples, WT y C ++ son drásticamente superiores, y con C ++ 11, de longitud comparable.
Alice