Hack: uma nova linguagem de programação para HHVM – Facebook Engineering

Em uma pressa? Tente o Hack agora: http://hacklang.org/

Hoje estamos lançando o Hack, uma linguagem de programação que desenvolvemos para HHVM que interage perfeitamente com o PHP. Hack reconcilia o rápido ciclo de desenvolvimento do PHP com a disciplina fornecida pela digitação estática, enquanto adiciona muitos recursos comumente encontrados em outras linguagens modernas de programação.

Temos implantado o Hack no Facebook e tem sido um grande sucesso. No último ano, migramos quase toda a nossa base de códigos PHP para o Hack, graças à adoção orgânica e a várias ferramentas de refatoração de origem doméstica.

Tambem estamos orgulhosos de lançar uma versão open source do Hack para o público em http://hacklang.org/ como parte da nossa plataforma HHVM runtime, que agora suportará tanto Hack como PHP.

Motivação

Todos os programadores de PHP estão familiarizados com tarefas do dia-a-dia que podem ser complicadas ou incómodas. O código acima é um grande exemplo de um erro comum onde um método poderia ser chamado inesperadamente sobre um objeto nulo, causando um erro que não seria apanhado até o tempo de execução. Outro exemplo é uma API complexa, onde os desenvolvedores podem ter um entendimento sólido da sua semântica, mas ainda assim gastar tempo procurando nomes de métodos mundanos na documentação.

Na escala do Facebook – com milhares de engenheiros enviando novos códigos duas vezes por dia – lentidões como essas são ainda mais problemáticas. Antes do Hack, nós tínhamos uma linguagem simples com um loop de feedback rápido – mas como poderíamos mitigar os tipos de problemas descritos acima? Poderia a detecção precoce de erros coexistir com a iteração rápida, tudo isso enquanto preservamos nosso investimento em PHP? Poderia uma melhor análise de código e introspecção ajudar a tornar os desenvolvedores mais produtivos com ferramentas como auto-completar?

Linguagens tipadas dinamicamente permitem um desenvolvimento rápido, mas sacrificam a capacidade de capturar erros precocemente e introspectar código rapidamente, particularmente em bases de código maiores. Por outro lado, linguagens tipadas estaticamente fornecem mais uma rede de segurança, mas muitas vezes ao custo de uma rápida iteração. Acreditávamos que tinha de haver um ponto doce.

Assim, nasceu o Hack. Acreditamos que ele oferece o melhor das linguagens tipadas dinamicamente e estaticamente, e que será valioso para projetos de todos os tamanhos.

A linguagem Hack

Hack tem raízes profundas em PHP. Na verdade, a maioria dos arquivos PHP já são arquivos Hack válidos. Nós fizemos uma escolha consciente para não suportar um punhado de funções e características obsoletas que eram incompatíveis com a digitação estática (por exemplo, “variáveis variáveis” e a função extract()). Nós também adicionamos muitas novas funcionalidades que acreditamos que ajudarão a tornar os desenvolvedores mais produtivos.

Nossa principal adição é a digitação estática. Desenvolvemos um sistema para anotar assinaturas de funções e membros de classe com informações de tipo; nosso algoritmo de verificação de tipo (o “verificador de tipo”) infere o resto. A verificação de digitação é incremental, de modo que mesmo dentro de um único arquivo algum código pode ser convertido para Hack enquanto o resto permanece digitado dinamicamente. Tecnicamente falando, o Hack é uma linguagem “gradualmente digitada*”* : o código dinamicamente digitado interage perfeitamente com o código estaticamente digitado.

Com o sistema de tipo do Hack, introduzimos várias características como genéricos, tipos anuláveis, aliasing de tipo e restrições nos parâmetros de tipo. Estas novas funcionalidades da linguagem são discretas, por isso o código que você escreve com o Hack ainda vai parecer e sentir-se como a linguagem dinâmica à qual os programadores de PHP estão acostumados.

No entanto, o Hack adiciona funcionalidades adicionais além da verificação estática de tipos, incluindo coleções, expressões lambda e execução de tipos de retorno e tipos de parâmetros.

Colecções fornecem uma alternativa limpa e segura aos arrays PHP. Nós as desenhamos especificamente para funcionar bem com a digitação estática e genéricos. A API Colections oferece muitas funções clássicas de ordem superior como map() e filter() para facilitar os estilos de programação funcional.

Expressões Lambda dão uma sintaxe concisa para a criação de fechamentos. Enquanto o PHP tem closures, requer que o programador nomeie explicitamente as variáveis que eles precisam usar a partir dos escopos de enclausuramento. Com as expressões lambda do Hack, nós inferimos automaticamente estes usos, poupando-lhe trabalho desnecessário. As expressões lambda tornam mais conveniente tirar total proveito da API Collections.

Run-time enforcement of return types and parameter types (including scalar types like int and string) provides safety beyond what can be checked statically while type annotations are being gradually added to a codebase. A aplicação do tempo de execução ajuda os programadores a detectar e diagnosticar certos tipos de problemas mais facilmente, e ajuda o JIT do HHVM a produzir código mais eficiente, tornando seguro confiar em anotações de tipo para fins de otimização.

Verificação de tipo instantânea

Durante o desenvolvimento, um programador PHP normalmente vai e vem rapidamente entre o código fonte e o navegador. Engenheiros podem iterar tão rapidamente quanto necessário, testando e ajustando uma experiência até que ela esteja perfeita.

Tradicionalmente, um verificador de tipo interromperia este loop de feedback, pois leva tempo para analisar o código-fonte. Nós não queríamos atrasar o fluxo de trabalho do PHP, por isso criamos uma nova abordagem para conciliar o feedback instantâneo com a segurança do tipo.

Nossa solução foi arquitetar o verificador de tipo como um servidor local que observa o sistema de arquivos. O servidor mantém todas as informações sobre o código fonte na memória e se atualiza automaticamente quando um arquivo muda no disco. Esta abordagem valeu a pena: o verificador de tipo normalmente roda em menos de 200 milissegundos e raramente leva mais de um segundo, tornando fácil a integração no fluxo de trabalho de desenvolvimento sem introduzir um atraso notável.

Migração de código

As vantagens do tipo de verificador de tipo e refatoração crescem quanto mais ele é usado dentro de uma base de código. Entendendo que seria difícil para algum código ser completamente transitado para Hack imediatamente, foi importante para nós que o Hack fosse desenvolvido de tal forma que pudesse coexistir diretamente com outros arquivos PHP já que ele está sendo introduzido incrementalmente.

O resto do processo de conversão, como adicionar anotações de tipo e usar novas funcionalidades de linguagem, pode ser feito conforme apropriado para a base de código. Por exemplo, uma anotação de tipo pode ser adicionada para uma função, mas deixada de fora para outra função, mesmo no mesmo arquivo. Se um parâmetro de função ou membro de classe não tem uma anotação de tipo explícita, o verificador de tipo considera seu tipo como dinâmico, e não verifica o tipo desse valor.

No Facebook, descobrimos que nossos engenheiros apreciaram o Hack o suficiente para começarem a converter a maioria do seu próprio código voluntariamente. Com milhões de linhas de código em nossa árvore, nós também queríamos alguma forma de automação, então construímos e usamos uma série de ferramentas de modificação de código para auxiliar o processo (que estamos lançando como parte do Hack).

Não se preocupe, seu PHP está seguro!

HHVM ainda é um tempo de execução de PHP, e pretendemos mantê-lo assim. Na verdade, estamos trabalhando duro para atingir a paridade com o PHP-5. Uma das maiores prioridades do HHVM é executar código fonte não modificado do PHP-5, tanto para a comunidade como porque confiamos em bibliotecas PHP de terceiros internamente.

HHVM é agora um tempo de execução que suporta *ambos* PHP e Hack, assim você pode começar a tirar vantagem das novas funcionalidades do Hack incrementalmente.

Diverta-se com o Hack!

Estamos encantados com o Hack e as ferramentas que você pode usar para converter automaticamente a sua base de código. Este é apenas o primeiro passo, e estamos dedicados a continuar a desenvolver este software para tornar o desenvolvimento ainda mais fácil, tanto para os nossos próprios engenheiros como para a comunidade em geral. O valor do Hack é *não* limitado a grandes projetos: com informações do tipo, boas mensagens de erro e feedback rápido, pequenas bases de código podem colher os benefícios do Hack também.

Próximo mês, também vamos introduzir a linguagem no Hack Developer Day no campus do Facebook em Menlo Park, e esperamos vê-lo pessoalmente ou online.

Adoraríamos ter o seu feedback sobre o nosso trabalho até agora, e daremos as boas-vindas a todos vocês para participar da comunidade HHVM e Hack.

Conhecimento

Há muitas pessoas que contribuíram para o desenvolvimento do Hack.

A equipa principal do Hack é composta por Julien Verlaguet, Joel Beales, Eugene Letuchy, Gabriel Levi, Joel Marcey, Erik Meijer, Alok Menghrajani, Bryan O’Sullivan, Drew Paroski, James Pearce, Joel Pobar, e Joshua Van Dyke Watzman.

Um agradecimento especial vai para os nossos primeiros adoptadores comunitários por darem um feedback valioso para tornar a língua melhor: James Miller, Simon Welsh, Nils Adermann, Fabien Potencier, e Alexander Mols.

Hack é escrito principalmente em OCaml. Gostaríamos de agradecer à equipe Gallium (INRIA) pelo desenvolvimento da linguagem OCaml, e à equipe Ocsigen (CNRS – Universidade de Paris Diderot – INRIA) pelo desenvolvimento da parte js_of_ocaml do Ocsigen.

E, é claro, obrigado a todos que ajudaram a fazer do Hack a linguagem que é hoje. A lista é muito exaustiva para um post de blog, mas você sabe quem você é.

Deixe uma resposta

O seu endereço de email não será publicado.