Por que o Facebook converte o código PHP em C ++? [fechadas]

42

Eu li que o Facebook começou em PHP e, para ganhar velocidade, agora eles compilam o PHP como código C ++. Se for esse o caso, por que não:

  1. Basta programar em c ++? Certamente deve haver ALGUNS erros / bugs ao pressionar um botão de compilador mágico que porta PHP para código c ++, certo?

  2. Se este impressionante conversor funciona tão bem, por que aderir ao PHP? Por que não usar algo como Ruby ou Python? Nota - escolhi esses dois aleatoriamente, mas principalmente porque quase todo mundo diz que codificar nesses idiomas é uma "alegria". Então, por que não desenvolver uma linguagem super ótima e clicar no botão de compilação c ++?

user72245
fonte
12
Ambas as suas alternativas provavelmente significariam jogar fora todo o código PHP, ferramentas e conhecimentos específicos do PHP, metade da infraestrutura de suporte etc. que já está lá e começa do zero.
Por quê? Se você pode converter código em C ++, certamente qualquer pessoa pode usar seu idioma favorito, pressionar um botão de conversão e comprometer-se com a Base de Código C ++. Não?
user72245
7
Não. Os compiladores, em geral, produzem código funcional, mas feio e antinatural, e retiram coisas como nomes de variáveis, comentários, sem mencionar todos os tipos de abstrações. Em grande medida, isso é inevitável. Embora existam alguns projetos que realmente se traduzam em uma base de código sustentável em outro idioma, o problema é muito mais difícil, especialmente em idiomas muito diferentes. Além disso, mesmo assumindo que o C ++ seja perfeitamente idiomático, todo mundo que trabalha na base de código precisa aprender C ++ ou ser demitido e substituído por pessoas que conhecem C ++. E você ainda não abordou as ferramentas.
1
Além disso (acabei de descobrir isso sozinho, mas está de acordo com o meu pressentimento e minha experiência com outras implementações de linguagem dinâmica), observe que o compilador PHP-para-C ++ está sendo eliminado e substituído por um interpretador de bytecode + JIT chamado HHVM ( desenvolvido posteriormente como parte do mesmo projeto abrangente) que o supera maciçamente e tem menos restrições. Veja github.com/facebook/hiphop-php/wiki
@ Delnan: Compiladores ruins produzem código feio e não natural. Mas isso não é inevitável. Dê uma olhada no Smart , que se compara ao JavaScript. A saída é muito legível, a menos que você ative a ofuscação e / ou minificação, é claro. <snark>(Na medida em que JS pode nunca ser chamado de "legível", ou seja.)</snark>
Mason Wheeler

Respostas:

65

Eles não. Não mais, pelo menos. Acontece que fazê-lo dessa maneira causa muitos problemas, incluindo dores de cabeça na implantação e anula uma das principais vantagens do uso de uma linguagem de script em primeiro lugar - poder alterar scripts sem a necessidade de recompilar - e, assim , reformulamos o sistema HipHop para uma arquitetura de VM com uma fase JIT transparente e reprovou o compilador C ++.

Curiosamente, aparentemente fazê-lo dessa maneira também é duas vezes mais rápido (como no desempenho) que a abordagem de trans-compilação C ++ original.

Mason Wheeler
fonte
4
Tudo o que recebo disso é que o Facebook está tendo dificuldades para equilibrar as necessidades de negócios e as capacidades dos desenvolvedores. Interessante, apesar de tudo, embora eu acrescentasse que obter um melhor desempenho de uma solução JIT em relação a uma solução nativa significa apenas que a linguagem de programação PHP-> C ++ era de fato uma calça.
James
7
@ James Embora eu duvide que "HipHopc" tenha sido o maior compilador de otimização de todos os tempos, esse resultado em particular não mostra que eles são péssimos em escrever compiladores, apenas mostra que a compilação estática de linguagens dinâmicas é muito menos eficaz que a compilação dinâmica. O que foi confirmado repetidamente por pessoas que definitivamente sabem como escrever compiladores otimizadores. Um compilador JIT pode executar diversas otimizações facilmente. Um compilador AOT (sem uma análise muito cara do programa inteiro) raramente pode fazer muito mais do que remover a sobrecarga da própria interpretação, sem remover a dinamicidade.
2
@delnan Bem, sim, se você prejudicar o benefício principal de um compilador AOT (análise de todo o programa) apontando o ponto inteiro de um compilador AOT (tendo muito tempo para fazer a análise), então com certeza ele não será comparado para um JIT fazendo o que um JIT é bom (otimizações rápidas de peekhole). Mas dificilmente é justo, agora é?
Alice
2
@ delnan Isso simplesmente não é verdade, ou pelo menos intelectualmente desonesto. Um JIT tem um tempo extremamente limitado em comparação com um AOT para fazer otimizações; Java escreveu artigos sobre alocadores de registro que são inferiores ao ideal, mas rápidos o suficiente para uso do JIT. O uso do SSA permite enormes quantidades de otimizações de graça que a maioria das dificuldades do JIT pode acompanhar. Os AOTs podem usar algoritmos de inferência de tipo comprovados (Hindley-Milner e algoritmo W) que não são complicados, enquanto um JIT absolutamente não recebe isso de graça, pagando custos em termos de memória. Um JIT pode fazer algumas otimizações melhor, assim como um AOT.
Alice em
1
@ Alice Estamos falando de linguagens altamente dinâmicas. Não há algoritmos de inferência do tipo AOT (estáticos) simples e eficazes para linguagens como Python ou JavaScript. Existem algoritmos complicados on-line / em tempo de execução (como usados ​​no SpiderMonkey, por exemplo) que são eficazes, e existem algoritmos complicados de AOT (por exemplo, Starkiller) que até agora não conseguiram provar sua eficácia. O algoritmo W nem sequer começa a abordar as complexidades das linguagens dinâmicas.
34

O engenheiro sênior do Facebook, Haiping Zhao, provavelmente responde melhor às suas perguntas .

  1. O HipHop programaticamente transforma seu código-fonte PHP em C ++ altamente otimizado e depois usa g ++ para compilá-lo. O HipHop executa o código-fonte de maneira semanticamente equivalente e sacrifica alguns recursos raramente usados ​​- como eval () - em troca de um desempenho aprimorado.

  2. Uma maneira comum de lidar com essas ineficiências é reescrever as partes mais complexas do seu aplicativo PHP diretamente no C ++ como extensões do PHP. Isso transforma amplamente o PHP em uma linguagem de cola entre o HTML do front-end e a lógica do aplicativo em C ++. Do ponto de vista técnico, isso funciona bem, mas reduz drasticamente o número de engenheiros capazes de trabalhar em todo o aplicativo.

O restante da postagem do blog é uma boa leitura, e eu recomendo. Ele fornece algumas dicas sobre os desafios de programação que o Facebook lida e como eles estão tentando resolver esses problemas.

josh3736
fonte
7
Observe que isso é obsoleto; essa foi sua primeira tentativa, mas o Facebook não faz mais dessa maneira. Veja minha resposta abaixo.
Mason Wheeler
@MasonWheeler - ótimo link e atualização.
19

Basta programar em c ++? Certamente deve haver ALGUNS erros / bugs ao pressionar um botão de compilador mágico que porta PHP para código c ++, certo?

Certo, mas a programação em C ++ implicaria substituir toda a base de código existente - uma idéia reconhecida mundialmente por ser totalmente estúpida e devastadora.

Se este impressionante conversor funciona tão bem, por que aderir ao PHP? Por que não usar algo como Ruby ou Python? Nota - escolhi esses dois aleatoriamente, mas principalmente porque quase todo mundo diz que codificar nesses idiomas é uma "alegria". Então, por que não desenvolver uma linguagem super ótima e clicar no botão de compilação c ++?

Porque isso implicaria, novamente, substituir a base de código PHP existente.

Em um mundo ideal, eles simplesmente codificariam em C ++ do zero. Infelizmente, como eles têm uma carga de código existente no PHP, isso não é possível. Então, em vez disso, eles resolvem o problema. É muito mais barato.

DeadMG
fonte
2
+1 para isso: "Em vez disso, eles resolvem o problema. É muito mais barato". É verdade - se eles têm 3500 engenheiros trabalhando em seu produto, é mais barato conseguir uma equipe pequena de 5 a 50 pessoas focada em escrever um bom compilador PHP-> C ++, do que ter toda a equipe de engenharia reescrevendo 6 anos de código .
Suman
Desculpe, estou confuso. Por que eles teriam que reescrevê-lo . Você acabou de dizer a si mesmo - o HipHop converte todo o código em C ++. Então, basta convertê-lo e colar no C ++.
user72245
16
@ user72245 só porque ele converte-lo para C ++ não significa que o converte em C legível ou sustentável ++
Mr.Mindor
Por que isso they hack around the problem? A otimização do código usando C ++ ou mesmo assembly não é novidade, faz isso desde antes de haver um PC.
19412 Steve Steve
Também tenha em mente que os programadores do Facebook são programadores PHP. Claro que você pode convertê-lo em C ++ e começar a programar em C ++, mas seus programadores existentes não têm experiência nessa linguagem. Você precisaria treiná-los novamente ou contratar novos programadores para continuar o desenvolvimento.
Gavin Coates
8

"De fato, por que não trabalhar diretamente na montagem, já que o código C ++ é finalmente traduzido em instruções de código de máquina?"

- Isso, em essência, é a que o argumento se reduz. E espero que isso torne óbvio por que não é feito:

  • É necessário um conjunto de habilidades (amplamente!) Diferente para programar em assembly (C ++) e em C ++ (PHP).
  • É potencialmente muito mais difícil de programar, por várias razões
  • O código produzido por um montador / compilador pode não ser legível por humanos (speak: mantenível), mesmo que você possa , a partir do zero, escrever programas legíveis em assembly (C ++).
Konrad Rudolph
fonte
2
Certa vez, mantive um pedido de seguro escrito em montagem concebido na década de 1970. Em outubro, fui encarregado de alterar os cumprimentos em uma "carta" para dizer o equivalente a "Boas Festas". Foi concluída apenas em fevereiro do próximo ano devido à complexidade. Tornei-me muito proficiente em montagem e sabia escrever código ideal, desde que não fosse mais do que algumas milhares de linhas. No entanto, os compiladores COBOL e C chutaram minha bunda e produziram um código muito mais ideal para a plataforma em que estávamos rodando, especialmente para sistemas que excedam 1m de linhas de montagem. Não faz sentido nos negócios.
bloudraak
5

Não estou no Facebook, mas meu melhor palpite sobre os motivos seria "evitar riscos significativos". Nesse ponto, mudar para um idioma diferente não é mais uma decisão de tecnologia: acima de tudo, é uma decisão de negócios.

Quando você é uma grande empresa que cresceu organicamente para o tamanho do FB, atrai lentamente pessoas que adquirem experiência em sua plataforma de programação (no caso do FB, isso é PHP). Um por um, você recebe alguns milhares de funcionários com grande experiência em PHP. Nesse momento, mudar para qualquer outro idioma se torna muito perigoso: seus engenheiros não estarão atualizados com o novo ecossistema e podem exigir um tempo significativo para atingir o nível de conhecimento exigido por seus empregos atuais, sem falar em melhorar suas habilidades.

Deixando de lado os méritos relativos do PHP e as linguagens alternativas, com a quantidade de investimento que o FB fez na tecnologia PHP, seria arrogante pensar que uma opção seria indolor e tola demais para tentar. Nos negócios, a tecnologia é um meio para atingir um fim, de modo que a "alegria" da programação nem entra em discussões.

dasblinkenlight
fonte
4

Só consigo pensar em um site importante que foi implementado em C ++. H2G2

Mesmo assim, a implementação atual é na verdade um intérprete com um grande número de funções de manipulação de texto e banco de dados embutidas (isso não soa nem um pouco como no PHP :-)).

O Facebook está bastante satisfeito com a funcionalidade do site. Eles acabaram de chegar ao ponto em que o PHP vanilla não suporta os volumes que processam. Daí a compilação do PHP no C ++, daí o código da máquina. Eles poderiam ter escrito um compilador completo para PHP, mas teriam perdido os 20 anos de otimização sutil que foram inseridos na pilha do compilador gcc. O ponto é que o código "C ++" não pode ser legível ou mantido por humanos, é apenas uma etapa intermediária no caminho para o código da máquina.

Como muitos programadores neste site, sinto que você subestima a quantidade de trabalho investido na lógica de negócios e na funcionalidade incorporada nos aplicativos existentes e no código de valor por si só.

James Anderson
fonte
Eu posso pensar em dezenas, agora que a WT é bem-sucedida.
Alice
@ Alice - interessante! Mas não consigo encontrar alguém usando isso para um site de alto volume. Além disso, olá mundo 30 algo com linhas de código para fazer 5 linhas de código PHP.
James Anderson
Comparar um exemplo de "olá mundo" é meio ridículo. Em menos de 100 linhas, eu posso configurar um websockets habilitado, uma longa pesquisa de retorno, um widget progressivamente aprimorado com SEO ideal, URLs limpos automáticos sem carregamento de página inteira usando AJAX e uma pequena área de CPU / RAM. O PHP, pelo menos em configurações típicas, não pode executar websockets, pesquisas longas, limpar URLs sem ajuda, limpar URLs com AJAX, e definitivamente usará uma quantidade enorme (comparativamente) de RAM / CPU. Para aplicativos da web e não exemplos simples, o WT e o C ++ são drasticamente superiores e, com o C ++ 11, de comprimento comparável.
Alice em