Por que desenvolvo com o Elixir e não com o PHP ?

O propósito das linguagens

No headline de cada linguagem percebemos que o propósito das duas são muito semelhantes, no PHP temos “PHP é uma linguagem de script popular de propósito geral especialmente adequada para desenvolvimento web” (PHP is a popular general-purpose scripting language that is especially suited to web development.) e para o Elixir temos “Elixir é uma linguagem funcional, dinâmica desenvolvida para construção de aplicações escaláveis e sustentáveis.” (Elixir is a dynamic, functional language designed for building scalable and maintainable applications.).

O PHP surgiu em 1994 com Rasmus Lerdof como um conjunto de binários CGI para resolver algumas necessidades que ele tinha em seu currículo online. O PHP passou por muitas evoluções até chegar a uma linguagem robusta e estável em que se encontra atualmente.

O Elixir foi desenvolvido em 2012 pelo brasileiro José Valim. Ele, escreveu uma linguagem com sintaxe semelhante ao Ruby, mas que gerava binários para a máquina virtual do Erlang.

Erlang é uma linguagem de programação desenvolvida na década de 80 pela Ericson focada em melhorar os sistemas de telefonia na qual ela era pioneira. Existe, no youtube, um vídeo muito interessante para a época sobre o poder da linguagem Erlang (https://www.youtube.com/watch?v=uKfKtXYLG78).

Esta linguagem defende o slogan “Concorrente, Tolerante a falhas e confiável.”, e podemos perceber que é neste quadro que a internet se configura.

A internet precisa de aplicações CONCORRENTES, TOLERANTE A FALHAS e CONFIÁVEIS.

Quando dizemos aplicações CONCORRENTES, queremos dizer que a aplicação pode receber inúmeras conexões simultâneas sem cair, por exemplo o aplicativo de mensagens instantâneas Whatsapp tem milhares de usuários conectados. Com TOLERANTE A FALHAS, queremos dizer que essa aplicação, mesmo que dê algum problema e ela venha a cair, o próprio sistema se encarrega de subi-la, e, aplicações CONFIÁVEIS são aplicações que mantém estabilidade. Uma frase famosa no mundo do Erlang é “nove noves de confiabilidade” (nine nines reliability), e isso existe porque um dos sistemas em produção feito em Erlang em um período de 20 anos teve 99,9999999% de tempo de atividade.

É na base do Erlang que José Valim desenvolveu o Elixir, mantendo todo o poder da linguagem mãe com uma sintaxe semelhante ao Ruby (fácil de entender), mantendo a CONCORRÊNCIA, TOLERÂNCIA A FALHAS e CONFIABILIDADE em suas aplicações, isso tudo porque Elixir compila para a máquina virtual do Erlang, o BEAM (Bogdan’s Erlang Abstract Machine).

Compilada e Interpretada

Apesar do Elixir e do PHP manterem, em termos gerais, o mesmo propósito, as duas linguagens apresentam características de linguagem muito diferentes, quero me referir ao fato de que uma é compilada e a outra interpretada.

Mas, o que isso quer dizer?

Em linguagens compiladas seus códigos são transformados diretamente em código executável para somente depois rodar a aplicação, como é o caso do C, Java, Erlang, Elixir. O usuário final não precisa recompilar o programa para executá-lo.

Em linguagens interpretadas, ao tempo em que roda a aplicação, o interpretador lê o código fonte linha a linha e o converte em código executável que é o caso do PHP, Python, Javascript. O usuário final, para cada nova execução do programa, o código é interpretado novamente.

Dependendo do tamanho da aplicação, escrever em linguagem interpretada poder gerar lentidão para o usuário final na execução do programa.

Funcional e Imperativa

Aqui entramos no paradigma de linguagens, e existem vários. Quero me referir apenas a dois, funcional e imperativa, que estão inteiramente ligados ao nosso objeto de estudo, o Elixir e o PHP.

O paradigma imperativo é o mais conhecido, é o que é ensinado no B-A-BA da programação. Ela descreve a computação como ações que mudam o estado de uma variável. E esse nome IMPERATIVO está ligado ao tempo verbal imperativo. É quando o programador diz ao computador: Faça isso, depois faça aquilo, depois aquilo outro… Na vida cotidiana isso é muito comum.

O paradigma funcional é diferente, ele trata a computação como uma avaliação de funções matemáticas e evita estados ou dados mutáveis. É um contraste à programação imperativa que muda o estado de uma variável.

Em síntese, em uma aplicação construída sobre o paradigma imperativo observaremos variáveis guardando valores (estados), e essas mesmas variáveis mudam seus valores dependendo das instruções que se seguem. Nesse paradigma também encontramos as variáveis globais e locais e que por pequenos equívocos do desenvolvedor pode gerar grandes problemas nas aplicações, são os famosos SIDE-EFFECTS (efeitos colaterais).

Uma aplicação construída no paradigma funcional, as variáveis, uma vez definidas, não mudam seu valor. E não existem variáveis globais, eliminando a possibilidade dos efeitos colaterais. As funções, nesse paradigma, são funções puras: dependem dos argumentos de entrada. E isso faz com que o resultado sempre seja o mesmo se os dados de entrada forem os mesmos.

Quando olhamos para a internet, percebemos que isso é importante: Ter o mesmo resultado para uma mesma pergunta.

Qual o futuro da internet?

No meu ponto de vista, a internet tem caminhado para a disponibilização de aplicações complexas (e gigantescas — em termos de funcionalidade), já conseguimos acessar páginas de aplicações web que editam foto (https://www.befunky.com), editam vídeo (https://clipchamp.com/), editores de texto e planilhas eletrônicas como é o caso do Google Docs(https://www.google.com/docs).

O futuro da internet depende de linguagens de programação que mantenham os princípios de concorrência, tolerância a falhas e confiabilidade, sem falar na importância do multiprocessamento para a escalabilidade das aplicações. A velocidade, organização e clareza dos códigos fonte são essenciais para a manutenção. Estratégias como o DRY ( Don’t Repeat Yoursef) apresentado pelo Ruby é um ponto a ser considerado pelo desenvolvedor. Programação Orientada a Testes é fundamental para a manutenção e implementação de novas features da aplicação. Linguagens que se antecipam aos erros são necessárias para o contexto da internet e Elixir é uma delas.