Ao longo dos anos, a ciência da computação foi amplamente desenvolvida e disseminada devido à vasta gama de vantagens na utilização dos meios computacionais para resolução de problemas das mais variadas naturezas. Atualmente, a computação manifesta-se em diversos âmbitos da sociedade e essa mudança fez com que o processo de programação de computadores se tornasse popular em diferentes áreas do conhecimento. Dentre a variedade de ferramentas computacionais disponíveis aos profissionais, estão as linguagens de programação.
Uma linguagem de programação para computadores é uma linguagem formal, bem estruturada, que, de forma geral, é utilizada para dar instruções precisas a um computador. O programador organiza sequencialmente essas instruções em um código para que a máquina seja capaz de interpretá-las e executá-las, produzindo resultados que podem ser analisados, armazenados e até mesmo utilizados em futuros códigos. Para o programador, essas linguagens facilitam o controle sobre o processo complexo que envolve os circuitos da máquina e permite que o processo de desenvolvimento dessa área se torne mais simples e, consequentemente, mais rápido.
A cada ano, novas linguagens de programação são desenvolvidas, procurando explorar diferentes soluções para os desafios que demandam computação. Cada linguagem apresenta suas especificações, vantagens e desvantagens, e podem ser aplicadas em diversas situações. Nessa matéria, gostaríamos de apresentar uma linguagem de programação brasileira, atual, e que vem se tornando cada vez mais popular ao redor do mundo: Elixir[1].
Criada em 2012 pela empresa de consultoria de software Plataformatec[2] em um projeto de pesquisa e desenvolvimento liderado por José Valim[3], a linguagem de programação Elixir, atualmente na versão 1.6, teve sua primeira versão lançada em 2014[1]. Trata-se de uma linguagem com código aberto que é executada na Máquina Virtual Erlang (Erlang VM), cujo principal objetivo é oferecer uma programação produtiva para aplicações distribuídas seguras e de fácil manutenção, potencializando os recursos da máquina virtual sobre a qual está fundada sem custos de performance.
A Plataformatec é uma empresa que faz consultoria e desenvolvimento para companhias que utilizam as linguagens Ruby ou Elixir. Dentre as companhias que a Plataformatec presta serviços estão Globo.com e Abril[2]. Ela também exerce grande influência na pesquisa e desenvolvimento de projetos Open Source para as linguagens Ruby e Elixir.
José Valim, criador da linguagem Elixir, nasceu em Porto Alegre em 1986 e, atualmente, mora na Polônia com sua esposa e filho[4]. José se formou em Engenharia pela Escola Politécnica da Universidade de São Paulo e possui Mestrado em Ciência da Computação pela Politécnica de Torino, na Itália. Desde bem cedo, durante a graduação, José começou a interagir com a comunidade de Ruby e, com o passar do tempo, começou a participar de conferências brasileiras sobre a linguagem[5]. Depois de alguns anos, Valim e um grupo de amigos conseguiram se consolidar e tornaram-se importantes membros na comunidade de Ruby e fundaram com sucesso a consultoria de software Plataformatec.
Durante sua estadia na Itália, José se inscreveu no Google Summer of Code em 2009. A ideia que ele submeteu chamou a atenção de Yehuda Katz, pessoa envolvida no desenvolvimento de Ruby on Rails, que virou seu mentor durante aquele verão. Essa experiência fez com que, ao final do evento, José fosse convidado a tornar-se membro do Rails Core team, grupo responsável pelo desenvolvimento do Ruby on Rails[4].
Quanto ao desenvolvimento da linguagem Elixir, de acordo com o próprio criador da linguagem, o principal incentivo para o projeto foi a necessidade de ferramentas produtivas que permitissem a solução de problemas de concorrência[5]. José atuava na elaboração de melhorias de performance para Rails, e sua equipe trabalhava com sistemas multi-cores cada vez mais complexos. Porém, a falta de ferramentas adequadas em Ruby para lidar com esse tipo de problema causou muita frustração a Valim e sua equipe.
Eventualmente, a necessidade levou José à utilização da linguagem Erlang que apresenta ferramentas de suporte a aplicações distribuídas[4]. Entretanto, um dos problemas enfrentados por ele nesse novo cenário foi a falta de alguns recursos, que são encontrados em outras linguagens. Essa carência foi determinante para o início do desenvolvimento da linguagem Elixir, que tinha o intuito de juntar diversos recursos e ferramentas[5]. Seu desenvolvimento ocorreu em cima da Máquina Virtual Erlang, que é conhecida por criar aplicações distribuídas com baixa latência e tolerante a falhas. Uma máquina virtual é um software que simula um ambiente computacional, no qual outras aplicações são executadas. Nesse caso, por exemplo, as aplicações da linguagem Elixir são executadas no ambiente da Erlang VM.
A linguagem também possui um terminal interativo chamado IEx (Elixir’s Interactive Shell), que executa códigos, comandos e funções em tempo real, facilitando a depuração de código e o aprendizado da linguagem[1]. Ela também foi projetada para ser extensível, ou seja, é possível adicionar módulos que estendem a funcionalidade da linguagem, de forma a aumentar a produtividade do desenvolvedor e a adaptabilidade à linguagem. Esses módulos, quando integrados ao Elixir, adicionam novas funcionalidades e construções como se fossem realmente parte da linguagem em si. Elixir é uma linguagem multi-paradigma, e é considerada uma linguagem de programação funcional, distribuída, orientada a processos e concorrente.
O paradigma de programação funcional originou-se de um conceito puramente matemático: a teoria de funções. Logo, ele é composto por métodos que retornam dados que apenas dependem de seus argumentos. Os mesmos resultados são sempre encontrados se os mesmos argumentos forem utilizados, independentemente de fatores externos como tempo de execução ou variáveis globais[6]. Diferente da programação orientada a objetos, paradigma de programação mais utilizado atualmente e que tem o foco na construção de tipos complexos (os objetos), a programação funcional coloca ênfase em funções e procedimentos sem o uso de objetos, e todas as computações são feitas por meio da aplicação (ou execução) de funções[7].
Programação distribuída baseia-se na ideia de dividir uma aplicação em dezenas, centenas ou até milhares de diferentes aplicações menores que se comunicam e compartilham diferentes recursos e funcionalidades, utilizando uma rede integrada de dispositivos[8]. Isso resulta em uma aplicação paralelizada e redundante, aumenta a responsividade, eficiência, rapidez e estabilidade da aplicação, pois caso uma aplicação falhe, suas funções podem ser distribuídas para serem executadas pelas demais.
A programação orientada a processos é um paradigma que delimita a separação de dados e dos métodos que agem sobre eles[9]. Isso permite uma paralelização de redes distribuídas mais eficiente e organizada com processos que compartilham um mesmo conjunto de dados.
Entende-se paradigma de programação concorrente como uma forma de computação em que diversas tarefas são executadas dentro do mesmo período de tempo. A diferença entre programação concorrente e programação paralela é que, enquanto na paralela a execução das instruções ocorrem no mesmo instante de tempo, na programação concorrente o início de uma tarefa pode acontecer antes do término de outra, mas não são obrigatoriamente executadas no mesmo instante[10].
A linguagem Elixir traz uma nova forma de lidar com soluções de aplicações distribuídas, apresentando ferramentas que colaboram tanto no desenvolvimento quanto na manutenção dessas soluções. A comunidade da linguagem vem se mostrando bastante receptiva e colaborativa, auxiliando os novos interessados. Acreditamos que seja uma possibilidade a ser explorada e que pode interessar alguns dos leitores, em especial aqueles que apresentam entusiasmo pela área de sistemas distribuídos.
BIBLIOGRAFIA:
[2] http://plataformatec.com.br/
[3] https://br.linkedin.com/in/jovalim
[4] http://austinelixir.org/2016-10-17-jose-interview/
[5] https://www.sitepoint.com/an-interview-with-elixir-creator-jose-valim/
[6] http://people.cs.aau.dk/~normark/prog3-03/html/notes/paradigms_themes-paradigm-overview-section.html
[7] https://wiki.haskell.org/Declaration_vs._expression_style#Declaration_style
[8] http://iopscience.iop.org/article/10.1088/1742-6596/608/1/012038/meta