UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE CENTRO REGIONAL DE ENSINO SUPERIOR DO SERIDÓ DEPARTAMENTO DE CIÊNCIAS EXATAS E APLICADAS CURSO DE BACHARELADO EM SISTEMAS DE INFORMAÇÃO CIRO MORAIS MEDEIROS COMPARAÇÃO ENTRE AS LINGUAGENS DE PROGRAMAÇÃO SUPORTADAS PELO GOOGLE APP ENGINE Dezembro de 2015 Caicó RN
CIRO MORAIS MEDEIROS COMPARAÇÃO ENTRE AS LINGUAGENS DE PROGRAMAÇÃO SUPORTADAS PELO GOOGLE APP ENGINE
Trabalho de conclusão de curso apresentado ao curso de Bacharelado em Sistemas de Informação do Centro de Ensino Superior do Seridó da Universidade Federal do Rio Grande do Norte, como avaliação da disciplina TCC II, sob a orientação do professor Dr. Flavius da Luz e Gorgônio. Dezembro de 2015 Caicó RN
Medeiros, Ciro Morais.
Comparação entre as linguagens de programação suportadas pelo Google App Engine / Ciro Morais Medeiros. - Caicó, 2016.
56f: il.
Orientador : Flavius da Luz e Gorgônio Dr.
Monografia (Bacharel em Sistemas de Informação) Universidade Federal do Rio Grande do Norte. Centro de Ensino Superior do Seridó - Campus Caicó.
1. Google App Engine. 2. Computação na nuvem. 3.
Linguagens de programação. I. Gorgônio, Flavius da Luz e. II. Título.
Catalogação da Publicação na Fonte
Universidade Federal do Rio Grande do Norte - UFRN Sistema de Bibliotecas - SISBI
The tools we are trying to use and the language or notation we are using to express or record our thoughts are the major factors determining what we can think or express at all! Edsger Dijkstra
AGRADECIMENTOS
Agradeço primeiramente à força que me fez chegar até aqui. Alguns a chamam de Deus, outras de destino, força de vontade, etc... O que importa é que foi graças a ela que consegui passar por todos os obstáculos da graduação.
Agradeço à minha família, que foi minha base e meu espelho durante toda a minha vida. Amo vocês.
Agradeço também aos meus amigos, com quem compartilhei tantas boas risadas durante o curso.
Agradeço aos professores do curso, que sempre me indicaram o caminho certo, em vez do mais fácil.
Por fim, agradeço à minha namorada, por me aturar até hoje. Amo você, Isabela.
RESUMO
A computação na nuvem é um novo modelo computacional onde recursos de TI (tecnologia da informação) de terceiros são disponibilizados através da internet. Grandes empresas oferecem sua infraestrutura de TI às empresas clientes, provisionando alto poder computacional, armazenamento e disponibilidade dos dados, escalabilidade e outros recursos. Dentre as empresas provedoras de computação em nuvem está o Google, com o Google App Engine (GAE). Na maioria dos casos, o modelo de pagamento pelo uso desses recursos é o PAYG (do inglês "payasyougo"), o que caracteriza a computação como uma utilidade (assim como eletricidade, água, etc.). Com a crescente adoção da computação na nuvem por parte das empresas do mercado atual, existe a tendência de se desenvolver software baseado nessa arquitetura e um dos desafios enfrentados é a escolha de uma linguagem de programação adequada. O presente trabalho compara as linguagens de programação suportadas pela plataforma Google App Engine, sendo elas Go, Java, PHP e Python, de acordo com os critérios facilidade de leitura, facilidade de escrita, desempenho, custo de mãodeobra, confiabilidade, popularidade e abrangência das APIs. Através da análise do desempenho de uma aplicação desenvolvida em cada linguagem suportada, dos códigosfonte produzidos e da implementação interna das linguagens, este trabalho objetiva facilitar a escolha da linguagem de programação ideal para um determinado projeto de software nesta plataforma. Ao final da pesquisa são apontados os pontos fortes e fracos de cada linguagem de programação estudada.
Palavraschave: Computação na nuvem; Google App Engine; Linguagens de programação.
ABSTRACT
Cloud computing is a new computing model where thirdparty IT (Information Technology) resources are provided over the internet. Big companies offer their IT infrastructure to business customers, provisioning high computational power, data storage and availability, scalability, and other resources. Among the companies providing cloud computing is Google, with Google App Engine. In most cases, the payment model for the use of these resources is PAYG ("payasyougo"), which characterizes computing as a utility (such as electricity, water, etc.). With the increasing adoption of cloud computing by enterprises in the actual market, there is a tendency to develop software based on this architecture and one of the challenges is the choice of a suitable programming language. This paper compares the programming languages supported by Google App Engine platform, which are Go, Java, PHP and Python, according to the criteria readability, writability, performance, cost of labor, reliability and APIs coverage. By analyzing the performance of an application developed in each supported language, the sources produced and the internal implementation of languages, this work aims to facilitate the choice of the ideal programming language for a given software project on this platform. At the end of the research the strengths and weaknesses of each compared programming language are pointed.
SUMÁRIO 1 INTRODUÇÃO ... 1.1 Contextualização ... 1.2 Problema ... 1.3 Objetivos ... 1.3.1 Objetivos Gerais ... 1.3.2 Objetivos Específicos ... 1.4 Justificativa ... 1.5 Delimitação do Estudo ... 1.6 Classificação da Pesquisa ... 1.7 Apresentação do Trabalho ... 2 REVISÃO BIBLIOGRÁFICA ... 2.1 Linguagens de Programação ... 2.1.1 História ... 2.1.2 Paradigmas de Programação ... 2.1.3 Interpretação, Compilação e Implementação Híbrida ... 2.1.4 A Linguagem Go ... 2.1.5 A Linguagem Java ... 2.1.6 A Linguagem PHP ... 2.1.7 A Linguagem Python ... 2.2 Critérios de Avaliação de Linguagens de Programação ... 2.2.1 Facilidade de Leitura ... 2.2.2 Facilidade de Escrita ... 2.2.3 Confiabilidade ... 2.2.4 Desempenho ... 2.2.5 Custos ... 2.2.6 Popularidade ... 2.2.7 Outros Critérios ... 2.3 Computação na Nuvem ... 2.3.1 Definição ... 2.3.2 Modelos de Serviço ... 2.3.3 Modelos de Implantação ... 2.4 Google App Engine ... 2.4.1 Recursos Disponíveis no GAE ... 2.4.2 Linguagens de Programação Suportadas e seus Ambientes de Execução ... 2.5 Estudos Relacionados ao Tema de Pesquisa ... 3 MÉTODO DE COMPARAÇÃO ENTRE AS LINGUAGENS DE PROGRAMAÇÃO SUPORTADAS PELO GAE ... 3.1 Descrição da Aplicação ... 3.2 Critérios de Comparação Adotados e Suas Formas de Medição ... 3.2.1 Facilidade de Leitura ... 3.2.2 Facilidade de Escrita ... 3.2.3 Desempenho ... 3.2.4 Custo de MãodeObra ... 3.2.5 Abrangência das APIs ... 3.2.6 Confiabilidade ... 1 1 2 3 3 3 3 4 5 6 7 7 7 8 10 11 12 12 13 13 13 14 15 16 16 17 17 18 18 19 20 21 21 22 23 26 26 27 27 27 28 28 29 29
3.2.7 Popularidade ... 3.2.8 Critérios Desconsiderados ... 3.3 Ambiente de Desenvolvimento ... 3.3.1 IDE ... 3.3.2 Controle de Versões e Repositório Remoto ... 3.3.3 Sistema Operacional ... 3.3.4 SDKs do GAE ... 3.3.5 Navegador Web ... 4 RESULTADOS ... 4.1 Facilidade de Leitura ... 4.2 Facilidade de Escrita ... 4.3 Desempenho ... 4.4 Custo de Mãodeobra ... 4.5 Abrangência das APIs ... 4.6 Confiabilidade ... 4.7 Popularidade ... 4.8 Conclusões ... 4.9 Trabalhos Futuros ... REFERÊNCIAS APÊNDICES 29 30 31 31 31 32 32 32 33 33 33 35 36 37 39 41 41 42
1 INTRODUÇÃO
1.1 Contextualização
A computação na nuvem (do inglês cloud computing ) é um termo que possui inúmeras definições que abordam características diferentes, mas podese definíla de maneira simplificada como recursos computacionais (capacidade de processamento, armazenamento, conectividade e serviços) disponibilizados através da internet (TAURION, 2009; BUYYA, BROBERG e GOSCINSKI, 2011). As grandes empresas do ramo tecnológico tem fornecido sua infraestrutura para hospedar aplicações de terceiros seguindo o modelo de pagamento PAYG (do inglês " payasyougo"), onde o cliente só paga pelos recursos que utilizar, caracterizando a computação como uma utilidade, assim como energia elétrica, água, etc.
É importante ressaltar as diferenças entre internet e web. Internet é toda a rede de computadores interligados através do mundo. A web, por sua vez, é tudo o que funciona sobre o protocolo HTTP ( HyperText Transfer Protocol ) e é uma das maneiras de se acessar a internet. Dessa forma, serviços como o FTP ( File Transfer Protocol ) e email não fazem parte da web, mas sim da internet.
Apesar de ser um tema muito discutido atualmente na área de informática, a computação na nuvem tem suas raízes nas décadas de 1960 e 1970, mas só próximo ao ano 2000 começou sua popularização, quando as grandes empresas passaram a adotar esta nova arquitetura computacional (GOMES, 2012). As raízes da computação na nuvem podem ser identificadas observandose o avanço de várias tecnologias, especialmente virtualização de hardware, tecnologias da internet, gerenciamento de sistemas e computação distribuída. As empresas estão passando por uma substituição da infraestrutura computacional interna por nuvens externas. Esse fato remete a quase um século, quando as fábricas perceberam que era mais barato conectar suas máquinas na tomada e receber energia elétrica fornecida por uma companhia do que produzir a sua própria (BUYYA, BROBERG e GOSCINSKI, 2011).
Diversas empresas, em todo o mundo e em diversas áreas do mercado, tem disponibilizado seus serviços em soluções baseadas na computação na nuvem, como por exemplo: a Automobili Lamborghini, produtora de carros luxuosos utiliza a Amazon Web Services (AWS) para hospedar seu website; a Webzen, desenvolvedora de jogos online optou pelo Windows Azure para suportar o lançamento mundial de Arctic Combat, um jogo multijogador com milhares de usuários; e a Khan Academy, uma organização sem fins
lucrativos, utiliza o Google App Engine (GAE) para hospedar seu site de vídeoaulas sobre ciência . 1
Uma pesquisa da International Data Corporation (IDC) mostra que "os gastos mundiais em serviços de nuvem pública estão crescendo atualmente a uma taxa de crescimento anual composta de 26,4% [...]." (SHETTY, 2014, tradução nossa). Devido aos recursos oferecidos pelos provedores de computação na nuvem, atualmente existe a tendência de se desenvolver software baseado nessa arquitetura.
Aplicativos móveis, sistemas de gerenciamento, de armazenamento de arquivos e outros passaram a utilizar a computação na nuvem para ganhar competitividade garantindo melhores serviços e maior disponibilidade destes, além de outras propriedades. Os caminhos para entrar no mundo da cloud computing são diversos e a escolha errada pode levar ao fracasso de um projeto.
1.2 Problema
Quando se pretende desenvolver software para a nuvem é necessário conhecer, de início, os provedores existentes, seus recursos, preços, maleabilidade, pontos positivos e negativos com relação aos outros. Depois de escolher um provedor, surge uma nova lista de opções e escolhas a serem feitas: máquinas virtuais, linguagem de programação e banco de dados são algumas das tecnologias envolvidas.
Escolher uma tecnologia ideal não é uma tarefa fácil. Envolve diversos fatores técnicos e outros subjetivos, que muitas vezes se opõem uns aos outros tornando a escolha muito mais difícil. E o problema ainda vai além: uma tecnologia pode ser ideal para uma aplicação no início, mas deixar de ser com o passar do tempo. Um fato semelhante a esse aconteceu com o Twitter, que substituiu o seu frontend escrito com RubyonRails por outro escrito em Java. Essa mudança proporcionou uma redução de três vezes a latência das buscas do Twitter e ainda aprimorou o uso da infraestrutura de hardware . 2
Para uma equipe de desenvolvimento, uma das tecnologias mais visíveis num projeto de software é a linguagem de programação e percebese que ela interfere em todas as fases do processo de desenvolvimento (VAREJÃO, 2004). Tendo isso em mente, para os projetistas de
1 Casos de sucesso retirados de <http://aws.amazon.com/pt/solutions/casestudies/automobililamborghini/>, <http://channel9.msdn.com/Blogs/WindowsAzure/WindowsAzureCaseStudyWebzen/> e <https://cloud.g oogle.com/files/KhanAcademy.pdf> respectivamente.
sistemas surge sempre a questão: "Qual linguagem escolher?". Por isso, este trabalho estuda as linguagens de programação para desenvolvimento no GAE, com o objetivo de facilitar a escolha de uma linguagem de programação ideal para um projeto de software nesta plataforma.
1.3 Objetivos
1.3.1 Objetivos Gerais
Analisar e comparar as linguagens de programação atualmente suportadas pelo GAE a fim de facilitar a escolha da linguagem mais adequada para o desenvolvimento de aplicativos nesta plataforma.
1.3.2 Objetivos Específicos
Para atingir o objetivo geral deste estudo, é suficiente alcançar cada um dos seguintes: (a) Elencar e descrever um conjunto de critérios para comparação de linguagens
de programação para plataformas de computação na nuvem;
(b) Desenvolver, em cada uma das linguagens suportadas pelo GAE, uma aplicação semelhante que utilize vários recursos desta plataforma;
(c) Analisar os códigosfonte da aplicação e a implementação interna das linguagens;
(d) Medir o desempenho das aplicações a partir do seu tempo de resposta;
(e) Identificar pontos positivos e negativos na utilização de cada linguagem de programação na plataforma GAE.
1.4 Justificativa
Este estudo está justificado nos âmbitos pessoal, acadêmico e profissional.
Como justificativa pessoal, existe a vontade de explorar as capacidades da plataforma GAE e de conhecer e estudar novas linguagens de programação para a nuvem.
Apesar da necessidade de se ter sugestões com embasamento teórico que indiquem qual linguagem de programação escolher para se iniciar um projeto de software para o GAE, não existem muitos estudos adequados. A maioria não compara as linguagens de programação suportadas e muitas vezes nem menciona mais de uma. Além disso, com o passar do tempo, o Google acrescenta diversas melhorias à plataforma e esses estudos vão se tornando desatualizados e/ou incompletos. Assim, este trabalho se justifica no âmbito acadêmico.
Devido aos benefícios proporcionados pela nuvem, empresas de todos os portes têm hospedado suas aplicações na nova plataforma. A tendência é que as novas aplicações sejam desenvolvidas para a nuvem enquanto as já existentes fazem a migração. Com essa tendência em vista, tornase muito importante o estudo das plataformas de nuvem disponíveis no mercado e este trabalho, portanto, está de acordo com o cenário atual da tecnologia da informação e justificado no âmbito profissional.
1.5 Delimitação do Estudo
Estudar todos os provedores de computação em nuvem que estão no mercado atualmente é uma tarefa que vai além do escopo deste trabalho. Além disso, uma única plataforma possui muitas características a serem investigadas, o que exige um estudo mais prolongado e aprofundado do que este. Dessa forma, foi necessário escolher apenas uma dessas plataformas e focar apenas numa característica.
As plataformas de computação em nuvem do mercado atual representam uma população muito grande para ser estudada. Nas referências bibliográficas consultadas, porém, três plataformas são mencionadas mais frequentemente: o GAE, a AWS e o Windows Azure. Todas oferecem grande poder computacional, porém cada um tem suas particularidades e, como dito, analisar todas ainda é uma tarefa grande demais para este trabalho.
Segundo Edin (2011), o Windows Azure apresenta uma abordagem mais simples para se colocar uma aplicação na nuvem, enquanto que a AWS oferece mais detalhamento na configuração dos recursos computacionais da plataforma. O GAE mostrase mais simples que o Windows Azure e a AWS, não necessitando de configuração de máquinas virtuais para executar uma aplicação em sua infraestrutura nem de cartão de crédito ou conta bancária (caso não seja preciso ultrapassar o limite gratuito).
Quanto ao uso gratuito das plataformas, o GAE se sai melhor. A AWS dá 1 ano de uso gratuito de recursos reduzidos, enquanto o Windows Azure disponibiliza 460 reais para serem gastos com a plataforma. O GAE, entretanto, oferece gratuitamente recursos reduzidos por tempo indeterminado. Por prezar pela simplicidade e oferecer uso gratuito (embora que seja com recursos reduzidos) por tempo indeterminado, o GAE foi escolhido para ser analisado.
Escolher uma única plataforma para ser analisada ainda é um universo muito amplo para o tamanho deste estudo e, por isso, ele se restringe às linguagens de programação. A primeira coisa a se fazer para criar uma aplicação no GAE é escolher qual linguagem de
programação será utilizada. Atualmente o GAE suporta quatro linguagens de programação: Python, Java, PHP e Go. Cada uma delas foi implementada de forma a abrir mão de alguma característica (facilidade de leitura e escrita, por exemplo) em benefício de outra julgada pelos projetistas como mais importante (como segurança). Assim, a escolha de uma delas é algo desafiador, pois vários fatores devem ser levados em conta e essa escolha interfere profundamente no resultado final de um projeto de software.
1.6 Classificação da Pesquisa
Devido às dificuldades inerentes à classificação de pesquisas da área de Ciências Exatas, particularmente na área de Ciência da Computação, sob a ótica das Ciências Humanas e Sociais, este trabalho apresenta uma dupla classificação metodológica, inicialmente a partir de um pesquisador das Ciências Humanas (GIL, 2010) e, posteriormente, a partir de um pesquisador da área de Ciência da Computação (WASLAWICK, 2008).
Esta pesquisa pode ser classificada, de acordo com Gil (2010), de quatro maneiras diferentes: segundo a área de conhecimento, a finalidade, o nível de explicação e o método adotado. Com relação à área de conhecimento, essa pesquisa se enquadra nas Ciências Exatas e da Terra. É uma pesquisa aplicada, pois sua finalidade é buscar conhecimentos sobre uma situação específica: a escolha da linguagem de programação mais adequada para desenvolvimento de aplicações no GAE. De acordo com o nível de explicação, esta pesquisa é dita como exploratória, pois busca conhecer melhor um problema (qual linguagem escolher?) para formular hipóteses. Como o método de comparação envolve a criação de aplicações, medição e interpretação de dados estatísticos, além de manipulação de variáveis, podemos dizer que esta pesquisa é do tipo experimental.
Já de acordo com Waslawick (2008), esta pesquisa classificase como exploratória, pois não formula uma teoria nem apresenta resultados estatisticamente aceitos sobre a escolha de linguagens de programação. Este trabalho visa facilitar a escolha de uma linguagem de programação para se programar na plataforma GAE oferecendo ao leitor uma análise comparativa quanti e qualitativa das referidas linguagens.
1.7 Apresentação do Trabalho
O restante deste trabalho está estruturado em três seções, intituladas: Revisão Bibliográfica, Método de Comparação entre as Linguagens de Programação Suportadas pelo GAE e Resultados.
Na Revisão Bibliográfica estão apresentados os conceitos fundamentais para o entendimento desta pesquisa. Conceitos de paradigmas de programação, critérios de comparação de linguagens de programação entre outros são abordados e definidos segundo autores renomados da área.
A terceira seção, o Método de Comparação entre as Linguagens de Programação Suportadas pelo GAE, apresenta de forma detalhada o método utilizado para realizar a comparação entre as linguagens de programação do GAE, descrevendo os critérios adotados e suas formas de medição e as demais etapas do método.
A última seção, chamada Resultados, apresenta os resultados obtidos com a pesquisa, organizada por critério avaliado. Ao final são apresentadas as conclusões.
2 REVISÃO BIBLIOGRÁFICA
2.1 Linguagens de Programação
2.1.1 História
A evolução das linguagens de programação deuse através da necessidade de se produzir programas complexos mais facilmente e de melhor qualidade. Essa evolução limitouse de início à capacidade do hardware existente, porém, com o avanço tecnológico, a reusabilidade e a manutenção, por exemplo, passaram a receber mais atenção do que o desempenho isolado.
No começo da programação, as máquinas eram extremamente lentas e a memória era escassa. A velocidade de um programa e o uso de memória eram, portanto, as principais preocupações. Assim, a eficiência de execução era o critério de projeto mais importante (LOUDEN e LAMBERT, 2011, p. 27). Antes do surgimento das linguagens de programação, os computadores eram programados na própria linguagem de máquina. Por causa disso os programadores precisavam conhecer profundamente o funcionamento, a arquitetura e o conjunto de instruções da máquina que executaria seus programas. Em geral, os programas eram muito simples, tinham fins científicos e eram escritos por apenas um programador, não necessitando assim de processos de desenvolvimento bem elaborados.
Percebeuse que as linguagens de máquina diminuíam muito a produtividade dos programadores e por volta da década de 1960 as linguagens passaram a ser projetadas para as pessoas e não mais para as máquinas. Mas devido à cultura de programação da época e à escassez de recursos computacionais, as linguagens de programação foram fortemente influenciadas pelas linguagens de máquina e seu objetivo principal ainda era a eficiência.
A necessidade de se utilizar o computador em aplicações mais complexas obrigou a criação de linguagens de programação que possibilitassem abstração de dados e modularização de um sistema de software para ser desenvolvido e mantido por uma equipe de programadores. Nas décadas de 1970 e 1980, simplicidade, abstração e confiabilidade se tornaram importantes características. Para garantir confiabilidade numa linguagem, seus projetistas introduziram sistemas de checagens para verificar a corretude de um programa.
Durante 1980 e 1990 os computadores se disseminaram pelo mundo e então surgiu a indústria do software e, junto com ela, a necessidade de atualização rápida dos programas
(VAREJÃO, 2004). Por causa disso, o reúso passou a ser um conceito central para produtividade. Ghezzi (1996) ainda acrescenta que, como grande parte do esforço e do dinheiro estava sendo gasto no desenvolvimento de sistemas, já não se podia mais simplesmente jogar fora os velhos sistemas quando era necessário um novo. Dessa forma, considerações econômicas convenceram as pessoas a adaptar os sistemas já existentes às suas novas necessidades.
Para conseguir esse reúso foram criadas as primeiras linguagens orientadas a objetos (C++, Java e outras), largamente utilizadas até os dias de hoje. A Figura 1 mostra a genealogia das principais linguagens de programação desde 1955 até 2005.
2.1.2 Paradigmas de Programação
Segundo Tucker (2008, p. 3), um paradigma de programação "é um padrão de resolução de problemas que se relaciona a um determinado gênero de programas e linguagens." Em palavras mais simples, podemos entender um paradigma de programação como a forma de descrever computações seguindo um padrão de pensamento. Cada paradigma de programação visa facilitar a resolução de uma classe específica de problemas.
O paradigma de programação mais antigo e que permanece até hoje é o imperativo, também conhecido como procedural. Um programa escrito numa linguagem (que suporta o paradigma) procedural consiste numa sequência de comandos, onde a execução de cada um deles faz com que o computador realize operações sobre variáveis (KEDAR, 2008). Em geral, essas linguagens apresentam estruturas de controle e repetição e seu elemento central são as atribuições de valores às variáveis. Exemplos de linguagens que se enquadram nesse paradigma são C e Pascal.
Existem também os paradigmas funcional e lógico, ambos derivados da matemática. Segundo Louden e Lambert (2011, p. 15, tradução nossa), "o paradigma funcional é baseado na noção abstrata de uma função como estudada no cálculo de lambda. O paradigma lógico é baseado na lógica simbólica." Esses paradigmas são importantes porque correspondem a fundamentações matemáticas, permitindo resolver problemas lógicomatemáticos complexos de forma abstrata e concisa.
O paradigma orientado a objetos (OO) é talvez o mais difundido atualmente. Como o próprio nome sugere, o conceito central deste paradigma é o objeto, "Uma cápsula contendo tanto dados como as operações para manipulálos, que provêm uma interface para o mundo
externo ao qual o objeto é acessível." (GABBRIELLI e MARTINI, 2006, p. 282, tradução nossa). Quem define os dados e as operações dos objetos são suas classes, de forma que os objetos são instâncias dessas classes. Linguagens OO permitem a utilização de técnicas importantes para o desenvolvimento de sistemas, como: encapsulamento de dados, herança de tipos, polimorfismo, etc. Essas técnicas permitem principalmente o reúso de código e a abstração de dados.
Figura 1 Genealogia Resumida das Principais Linguagens de Programação entre os anos de 1955 até 2005
2.1.3 Interpretação, Compilação e Implementação Híbrida
Toda linguagem possui um (ou mais de um) método de implementação. Esse método baseiase na tradução de um programa para poder ser executado pela máquina. A tradução é feita por outro programa chamado tradutor, "um programa que aceita outros programas escritos na linguagem em questão e os executa diretamente ou os transforma numa forma conveniente para execução." (LOUDEN e LAMBERT, 2011, p. 18, tradução nossa). São três os métodos de implementação existentes: compilação, interpretação e implementação híbrida. Cada um possui vantagens e desvantagens em relação aos outros e isto se torna um pontochave no projeto de novas linguagens.
Uma linguagem é dita interpretada quando o seu tradutor traduz e executa uma linha de cada vez. Essa abordagem proporciona a portabilidade do códigofonte, uma vez que podemos executar o mesmo código em qualquer máquina bastando apenas escrever um tradutor para a arquitetura desejada. A linguagem também se torna mais flexível e tem uma maior facilidade de escrita, já que na maioria das vezes não é necessário declarar tipos de variáveis. A depuração de programas interpretados também é mais fácil, já que se sabe exatamente qual linha de código acusou um erro. O preço que se paga por essas vantagens é a perda de desempenho, pois a tradução é feita em tempo de execução. Além disso, por não haver checagem estática de tipos, há também perda de confiabilidade, pois os erros só podem ser detectados em tempo de execução.
Quando é necessário traduzir um programa por completo antes de sua execução, dizemos que sua linguagem de programação é compilada. Linguagens compiladas tendem a produzir programas muito mais rápidos e seguros. Como não se perde tempo com tradução em tempo de execução, programas compilados possuem em geral desempenho melhor que quaisquer outros tipos de programas. Além disso, há um ganho na confiabilidade, porque é feita uma checagem estática de tipos. Essas vantagens, porém têm seus efeitos colaterais. Um programa compilado para uma arquitetura específica só funciona naquela arquitetura, o que reduz sua portabilidade. A necessidade de se declarar tipos tanto irrita os programadores, reduzindo sua produtividade, como deixa a linguagem menos flexível, amarrando variáveis aos seus tipos e impedindo o uso de técnicas de programação avançadas (porém menos confiáveis). Fortran, Cobol, C e C++ são linguagens compiladas (Tucker, 2008).
A implementação híbrida tenta pegar o melhor dos dois. Existe uma compilação parcial do código para uma linguagem independente de máquina onde são feitas checagens
estáticas para garantir confiabilidade. Depois, o código gerado é executado por uma máquina virtual, que traduz os comandos para linguagem de máquina em tempo de execução. Dessa forma, o código gerado pode ser executado em qualquer arquitetura que possua uma máquina virtual específica dela instalada. A portabilidade e a confiabilidade são preservadas nesse processo e o desempenho tem uma perda muito pequena, pois a tradução em tempo de execução do código gerado é muito rápida. Continua ainda o problema da redução de produtividade dos programadores e da flexibilidade da linguagem por causa da necessidade de se declarar tipos de variáveis.
2.1.4 A Linguagem Go
Go é uma linguagem de programação mantida por uma equipe de pesquisadores do Google e também por vários contribuidores da comunidade opensource . Foi criada em 2007 por Robert Griesemer, Rob Pike, e Ken Thompson, porém só em 2009 foi publicada e teve seu código aberto. Go foi projetado para resolver os problemas enfrentados no desenvolvimento de software do Google, e, apesar de não ser tão inovadora quanto parece, é uma excelente ferramenta para engenharia de grandes projetos de software. (PIKE, 2012)
Um dos propósitos da criação da linguagem Go é unir a facilidade de se programar numa linguagem interpretada de tipagem dinâmica à segurança e eficiência de uma compilada de tipagem estática. Portanto, foram incluídas na linguagem técnicas como inferência de tipos para prover construções concisas para declaração e atribuição de variáveis. Além disso, a linguagem possui construções e comandos específicos que facilitam a programação concorrente (GOLANG, 2015).
O método de implementação da linguagem é a compilação, ou seja, os programas são traduzidos completamente para a linguagem de máquina específica da arquitetura alvo para então poderem ser executados diretamente. Durante esse processo, são feitas várias checagens estáticas no código para garantir que não haja erros de sintaxe, por exemplo.
Devido à ausência de algumas capacidades da orientação a objetos, a linguagem força os programadores a utilizarem artifícios alternativos a herança de tipos, por exemplo, tem que ser implementada utilizandose a incorporação ( embedding) , que tornam alguns padrões de projeto mais fáceis ou mais difíceis de serem implementados (SCHMAGER, 2010).
2.1.5 A Linguagem Java
A linguagem de programação Java foi criada na década de 90 por um grupo de desenvolvedores chefiado por James Gosling da Sun Microsystems. Atualmente, a Oracle tem propriedade sobre ela (ORACLE, 2015). É uma linguagem orientada a objetos e de implementação híbrida, ou seja, tem seu códigofonte compilado para uma linguagem intermediária que é interpretada pela JVM (Java Virtual Machine).
Com o lema "Escreva uma vez. Execute em qualquer lugar." (tradução do inglês "Write It Once. Run It Everywhere ."), o Java prometia ser executável em qualquer plataforma desde computadores pessoais e smartphones até eletrodomésticos. Assim o fizeram e hoje computadores corporativos e pessoais, telefones celulares, tablets e aparelhos de TV executam Java.
Apesar da sintaxe semelhante ao C/C++, Java recebe muitas críticas sobre sua facilidade de escrita devido a algumas convenções. O uso de métodos acessadores e modificadores ( getters e setters ) para os atributos das classes muitas vezes é desnecessessário, porém convencionouse utilizálos sempre. Além disso, nomes de métodos, classes e variáveis em geral são muito extensos de forma que sejam autoexplicativos, porém acabam tornando a programação cansativa.
2.1.6 A Linguagem PHP
PHP (PHP Hypertext Preprocessor) é uma linguagem descripting criada por Rasmus
Lerdorf em 1995 especialmente para o desenvolvimento web. Nos dias de hoje é mantida pelo The PHP Group (PHP, 2015).
A implementação da linguagem é do tipo interpretada e, apesar de ter sido criada para o desenvolvimento web, se adequa a vários tipos de problemas, sendo assim considerada uma linguagem de propósito geral.
Por ter sido criada para a programação web inicialmente, é possível misturar código PHP com a linguagem de marcação HTML num mesmo arquivo ou escrever os códigos em arquivos separados. Assim, cabe à equipe de desenvolvimento organizar seu código da forma que achar melhor.
2.1.7 A Linguagem Python
Python é uma linguagem de programação interpretada multiparadigma que é utilizada em diversas áreas do desenvolvimento: desenvolvimento web, desktop, científico, de jogos e mais. Foi criada por Guido Van Rossum em 1991, mas é mantida atualmente pela Python Software Foundation (PYTHON, 2015).
Apresenta uma sintaxe muito simples, enxuta e intuitiva, além de um caráter interativo. Por causa disso vem sendo utilizada por muitas universidades para o ensino de algoritmos e lógica de programação, além engenheiros e outros profissionais que não são programadores especialistas e apenas desejam executar rapidamente pequenos projetos para formular melhor suas ideias.
Apesar da simplicidade, o Python é muito poderoso e largamente utilizado em diversos projetos de software. Existem vários frameworks e bibliotecas para se trabalhar com interface gráfica, cálculos matemáticos complexos, banco de dados, desenvolvimento web e outras tecnologias.
Por ser uma linguagem puramente interpretada, Python pode ser executada em qualquer ambiente que possua o interpretador instalado. Essa característica e a de ter uma tipagem dinâmica, porém acarretam muitas críticas sobre confiabilidade e desempenho. Como já foi dito, esses dois fatores prejudicam muito o desempenho, pois o interpretador precisa traduzir o código e fazer checagem de tipos em tempo de execução. A checagem dinâmica também causa grande perda na confiabilidade da linguagem, uma vez que é difícil testar manualmente todos os tipos de variáveis de um sistema grande.
2.2 Critérios de Avaliação de Linguagens de Programação
Alguns critérios são apontados como cruciais para se avaliar uma linguagem de programação (VAREJÃO, 2004; SEBESTA, 2011; GHEZZI, 1996; LOUDEN e LAMBERT, 2011). Dentre eles foi feita uma seleção e aqueles julgados como mais importantes estão descritos numa seção a seguir; no final há uma seção para os restantes.
2.2.1 Facilidade de Leitura
A facilidade de leitura, ou legibilidade, é um dos critérios mais importantes para se julgar uma linguagem de programação, pois determina a facilidade com a qual programas podem ser lidos e entendidos pelos próprios programadores ou por outros.
Antigamente as linguagens eram pensadas mais do ponto de vista da máquina do que dos programadores que as utilizariam, porém na década de 70 surgiu o conceito de ciclo de vida de software, onde a manutenção foi reconhecida como uma das partes principais desse ciclo. A partir daí, a legibilidade passou a ser um fator determinante da qualidade dos programas e das linguagens de programação.
Vários fatores afetam a facilidade de leitura, dentre eles (SEBESTA, 2011):
(a) Simplicidade geral o fato de uma linguagem ser simples a torna mais legível. (b) Ortogonalidade para ser ortogonal uma linguagem deve possuir um número
pequeno de construções primitivas que, combinadas, construam tanto estruturas de dados como estruturas de controle.
(c) Tipos de dados a existência de tipos adequados para representar ideias distintas auxilia na legibilidade. Ex.: usar variáveis booleanas para representar dados lógicos (como na maioria das linguagens modernas) é muito mais adequado que usar tipos inteiros (como na linguagem C).
(d) Sintaxe permitir vários caracteres para identificadores (nomes de variáveis, funções, etc.) e usar palavras reservadas para construções complexas contribuem para a facilidade de leitura de um programa. Além disso, a sintaxe deve expressar de maneira intrínseca a semântica do programa.
2.2.2 Facilidade de Escrita
A facilidade de escrita diz quão facilmente uma linguagem pode ser usada para criar programas dentro de um domínio específico (SEBESTA, 2011). Relacionase intimamente com a legibilidade, pois é necessário que o programador leia o código que acabou de escrever. Além disso, a facilidade de escrita pode ser prejudicial à legibilidade, pois construções muito sucintas podem ser difíceis de entender (VAREJÃO, 2004).
Além desses fatores, também influencia na facilidade de escrita a expressividade da linguagem. Basicamente, a expressividade pode ser entendida como o poder de fazer muito escrevendo pouco.
Um outro fator importante ainda é o suporte à abstração de dados e de processos. Isso implica na definição e utilização de recursos complexos da linguagem de forma a permitir que o programador ignore detalhes da implementação interna. Um exemplo de abstração são os dicionários (também chamados de mapas ou ainda de tabelas hash). Basta fornecer uma chave
(ou key) e um valor que a linguagem trata de associálos e guardálos na memória; para obter o valor armazenado, basta informar novamente a chave. Assim se omitem do programador as formas de alocação de memória para guardar os valores e também de se associar uma chave ao respectivo valor.
2.2.3 Confiabilidade
Sebesta (2011) define um programa como sendo confiável quando está de acordo com suas especificações em todas as situações. Esse critério também é influenciado por vários fatores: verificação de tipos, declaração de dados e tratamento de exceções, além dos critérios anteriores de legibilidade e facilidade de escrita.
As linguagens compiladas em geral exigem que sejam declaradas todas as variáveis de um programa. Para calcular, por exemplo, a soma de duas variáveis e guardála numa outra é necessário declarar as três variáveis antes de fazer uso delas (VAREJÃO, 2004). Esse procedimento de declaração torna uma linguagem mais segura evitando erros, por exemplo, de digitação. Se um programador por acaso digitar " resultdo " em vez de " resultado " para nomear uma variável, o próprio compilador é capaz de encontrar o erro. Por questões de simplicidade, algumas linguagens modernas não exigem a declaração de variáveis e, portanto, um erro de digitação como esse resulta na criação de uma variável a mais e o programa continua executando normalmente, porém com comportamento indesejado.
Segundo Ghezzi (1996), um propósito atraente no projeto de linguagens é fazer programas tão verificáveis estaticamente quanto possível, pois as verificações de tempo de execução não podem garantir a correção de um programa e ainda reduzem a velocidade de execução. Para aumentar sua confiabilidade, várias linguagens incluem a verificação de tipos. Essa verificação busca detectar erros de tipos de variáveis tanto em tempo de compilação como em tempo de execução, embora esta última seja menos desejável devido ao custo. Para entender melhor a checagem de tipos, suponhamos que exista um método somarque recebe dois números inteiros e retorna a soma dos dois (também inteira) numa linguagem que faz verificação estática de tipos. Caso um programador descuidado passe como parâmetro para a função somaros valores 1e 'a', o próprio compilador será capaz de identificar esse erro. Porém, se a linguagem não fizer essa verificação, só será possível descobrir o erro em tempo de execução, o que não é desejável, pois é mais difícil de encontrar e mais caro para reparar o erro.
"A habilidade de um programa de interceptar erros em tempo de execução [...], tomar medidas corretivas e então continuar é uma ajuda óbvia para a confiabilidade. Tal facilidade é chamada de tratamento de exceções." (SEBESTA, 2011, p. 25) Um exemplo simples da aplicação do tratamento de exceções seria um programa que abre um arquivo qualquer. O programa procura no disco o arquivo que deve abrir, mas ele pode ter sido apagado ou movido. Numa dessas situações, seria lançada uma exceção que o programa trataria informando amigavelmente ao usuário que o arquivo não foi encontrado, em vez de simplesmente parar de funcionar.
O uso explícito de ponteiros (ou apontadores) tem sido considerado perigoso por introduzir dois principais problemas: ponteiros "soltos", que apontam para regiões de memória que foram liberadas ou que não devem ser acessadas pelo programa; e má desalocação de memória, que gera o chamado lixo, ou garbage.
Vale ressaltar também que os dois critérios discutidos anteriormente (facilidade de leitura e de escrita) também influenciam na confiabilidade de um programa. Se uma linguagem é mais legível e tem uma escrita mais fácil, maiores são as chances dos programas escritos nela estarem corretos (SEBESTA, 2011).
2.2.4 Desempenho
Segundo Lilja (2005), análise de desempenho, quando aplicada a experimentos de engenharia e ciência da computação, deve ser pensada como a combinação de medida, interpretação e comunicação da "velocidade" ou "tamanho" de um sistema computacional. Existem várias formas de se analisar o desempenho de um sistema computacional.
Como na nuvem se paga por tempo de uso de CPU, uso de memória RAM e outros recursos, o desempenho se torna uma característica indispensável na avaliação de uma linguagem de programação desta arquitetura. Numa avaliação de desempenho de uma aplicação web especificamente é importante investigar também tempo de resposta a uma requisição, escalabilidade e outros fatores.
2.2.5 Custos
Os custos decorrentes da utilização de uma linguagem de programação são derivados de inúmeras características (SEBESTA, 2011). Dentre elas custo de treinamento de programadores, de escrita de programas, de compilação, do sistema de implementação da
linguagem, de prejuízos causados por baixa confiabilidade e, por fim, custos de manutenção. Alguns desses custos, porém, merecem mais destaque.
O custo para a escrita de programas numa determinada linguagem é obviamente muito importante e deve ser considerado. A confiabilidade da linguagem também deve ser considerada, principalmente em sistemas que envolvem um grau maior de risco (como sistemas médicos, por exemplo), pois o custo para se reverter situações ocasionadas por falhas num programa pode ser altíssimo. Sabemos também que softwares estão sujeitos a modificações frequentes, que estão presentes no processo de manutenção, e esse é portanto um custo constante e que permanece enquanto um sistema existir.
Os três custos destacados acima são fortemente influenciados pelas facilidades de leitura e escrita, reforçando a ideia de que estes são critérios importantíssimos para a avaliação de uma linguagem de programação.
2.2.6 Popularidade
Percebese que a popularidade de uma linguagem de programação é um fator benéfico para seus usuários, pois quanto mais popular for uma linguagem, maior será a interação entre os membros ativos da comunidade. A forma de medição da popularidade de linguagens de programação, porém, ainda é motivo de discussão.
Para realizar a medição atualmente as organizações utilizam dados obtidos através de mecanismos de busca e outras fontes, mas os resultados não são aceitos mundialmente. Em geral, fazse uma consulta em um ou vários mecanismos de busca com a seguinte estrutura "<linguagem> programming" e são somados os resultados retornados pelo mecanismo. Entretanto, essa abordagem recebe críticas porque alguns nomes de linguagens podem gerar expressões ambíguas, como "basic programming", por exemplo. Além disso, os resultados nem sempre se mostram atuais (TIOBE, 2015; CARBONNELLE, 2015; CASS, DIAKOPOULOS e ROMERO, 2014).
Apesar de não ser uma medição precisa e confiável, esta abordagem apresenta uma imagem aproximada do cenário real da popularidade de linguagens de programação.
2.2.7 Outros Critérios
Existem ainda outros critérios que podem ser usados para comparar linguagens de programação: facilidade de aprendizado, reusabilidade, modificabilidade e portabilidade.
Linguagens de programação com muitas características e várias formas de se fazer a mesma coisa tendem a ser mais difíceis de aprender. Isso acontece porque a maioria dos programadores aprende apenas um subconjunto pequeno dessas linguagens e não se preocupa em investigar o restante. Problemas acontecem quando um programador precisa entender o código que outro programador escreveu num subconjunto diferente do que ele conhece.
A reusabilidade de código caracteriza a capacidade de se utilizar o código de um sistema em outro com pouca ou nenhuma alteração. Já a modificabilidade diz respeito à facilidade de fazer modificações num sistema que não impliquem alterações em outras partes. Tendo em vista que a modularização e a reutilização de código são assuntos estudados há mais de três décadas, todas as linguagens modernas vem sendo projetadas para possibilitar ambas.
Ainda outra característica muito benéfica para uma linguagem de programação é a portabilidade, isto é, a capacidade de executar o mesmo código em diferentes plataformas sem a necessidade de fazer grandes alterações.
2.3 Computação na Nuvem
2.3.1 Definição
A definição formal para computação na nuvem dada pelo National Institute of Standards and Technology (NIST) é:
"[...] um modelo que permita acesso ubíquo, conveniente e sob demanda através de uma rede a um conjunto de recursos computacionais configuráveis (por exemplo, redes, servidores, armazenamento, aplicações e serviços) que podem ser rapidamente provisionados e liberados com um esforço mínimo de gerenciamento ou interação com o provedor de serviços." (MELL e GRANCE, 2011, p. 2, tradução nossa)
Apesar de haverem inúmeras outras definições dadas para o termo computação na nuvem, tomadas em conjunto, apontam características semelhantes (BUYYA, BROBERG e GOSCINSKI, 2011). Em geral, podese dizer que computação na nuvem caracteriza a disponibilização da TI (tecnologia da informação) como uma utilidade, ou seja, um serviço que faça parte do cotidiano semelhante ao fornecimento de água, eletricidade, etc. Observase que as plataformas de computação na nuvem seguem o modelo de cobrança payasyougo, ou seja, os clientes só pagam pelos recursos que utilizarem. O uso da nuvem se dá através da internet por meio de mecanismos padronizados, possibilitando que diferentes clientes tenham acesso à plataforma a qualquer hora e em qualquer lugar do mundo.
As plataformas oferecem sua infraestrutura de hardware alocando recursos sob demanda para executar programas de terceiros. Assim, é possível desenvolver aplicações e hospedálas numa infraestrutura de altíssimo poder computacional, armazenamento muito grande de dados, entre outros recursos, por preços baixos. A Tabela 1 apresenta uma lista dos principais provedores de computação na nuvem, dentre eles o Google.
No interior de uma nuvem existe uma infraestrutura poderosa de rede que realiza a chamada computação em grade (do inglês grid computing ). Ela permite a abstração do ambiente de forma que se enxergue apenas uma grande nuvem, com recursos que parecem ser infinitos. Chamase de nuvem por apresentar um caráter "nebuloso", unificado, como se fosse apenas um computador, quando na verdade é uma rede imensa de datacenters conectados ao redor do mundo.
2.3.2 Modelos de Serviço
Existem três principais modelos de serviço de computação na nuvem: SaaS, PaaS e IaaS (MELL e GRANCE, 2011). A sigla SaaS vem do inglês SoftwareasaService, que significa "software como um serviço" e esse modelo se referencia a um consumidor utilizando um software que está hospedado na nuvem. O consumidor não consegue enxergar as características mais subjacentes relacionadas à plataforma em si, mas geralmente tem acesso a configurar alguns recursos do software.
O modelo PaaS vem de PlatformasaService, que se traduz para "plataforma como um serviço" e remete a quando o consumidor é capaz de implantar suas próprias aplicações numa plataforma terceirizada. Também não é capaz de enxergar as características mais subjacentes, porém já controla as aplicações implantadas e é capaz de fazer configurações no ambiente de hospedagem.
O outro modelo de computação em nuvem é IaaS, do inglês InfrastructureasaService, que significa "infraestrutura como um serviço". Nele o consumidor é capaz de configurar especificamente máquinas virtuais controlando os recursos mais fundamentais para realizar computação, como processamento, armazenamento e rede e é capaz de instalar e executar qualquer tipo de software, desde aplicações até o sistema operacional.
Tabela 1 Principais provedores de computação na nuvem e seus modelos de serviço (em ordem alfabética) Fonte: Han (2011, p. 200, tradução nossa) 2.3.3 Modelos de Implantação
As plataformas de nuvem podem ser classificadas também com relação ao seu modelo de implantação (MELL e GRANCE, 2011). A nuvem privada é exclusiva de uma organização que agrega diversos consumidores, como unidades de negócio, por exemplo. Pode ser de propriedade da empresa, terceirizada ou uma combinação das duas, e a estrutura física pode estar ou não dentro da empresa.
A nuvem comunitária ( community cloud ) provê infraestrutura para uso exclusivo por uma comunidade de consumidores específicos de organizações com interesses comuns. Assim como na nuvem privada, a infraestrutura física pode pertencer às empresas consumidoras, a uma terceirizada ou uma mistura dos dois e pode estar ou não dentro da empresa.
Quando uma infraestrutura é oferecida por um provedor para um público de consumidores em geral, dizemos que esta é uma nuvem pública. Nesse modelo, ela é gerenciada por uma empresa ou uma organização governamental, por exemplo e está localizada nas instalações do provedor e não dos clientes.
Por fim, quando existe uma junção entre quaisquer dos três modelos citados acima, chamamos de nuvem híbrida. Nesse modelo, duas ou mais plataformas de nuvem mantêm entidades únicas, mas são unidas por tecnologia padronizada de forma que possibilite a portabilidade de dados e de aplicações permitindo por exemplo o balanceamento de carga entre nuvens.
2.4 Google App Engine
O Google App Engine, ou simplesmente GAE, permite que você execute suas aplicações na infraestrutura do Google, caracterizando assim uma nuvem pública com um modelo de serviço PaaS (plataforma como um serviço). Para isso, é preciso ter uma conta Google e baixar o SDK ( software development kit ) da linguagem de programação de sua preferência (GOOGLE, 2014).
2.4.1 Recursos Disponíveis no GAE
O GAE provê diversos recursos, também chamados de serviços, que podem ser agrupados em armazenamento e busca de dados, comunicação, gerência de processos, processamento e configuração e gerência dos aplicativos (GOOGLE, 2015).
Datastore, Blobstore, e Memcache são alguns dos serviços de armazenamento. O Datastore é um banco de dados NoSQL usado para armazenar as entidades de uma aplicação. O Blobstore é outro serviço de armazenamento, destinado a armazenar arquivos muito grandes ( blobs), como vídeos, imagens, arquivos de áudio etc. O Memcache serve para garantir alta performance nas aplicações através do uso de memória cache no lugar do armazenamento persistente para acessar as mesmas informações repetidas vezes.
Para prover comunicação entre uma aplicação e o meio externo existem vários serviços. A Channel API, que possibilita a conexão entre a aplicação e a máquina cliente permitindo o envio de mensagens em tempo real e o serviço de emails, chamado de Mail, são alguns deles.
O GAE também disponibiliza alguns serviços de gerência de processos. Como aplicações web precisam responder rapidamente, tarefas longas precisam ser realizadas em segundo plano sem interromper o usuário e a Task Queue API resolve esse tipo de problema. Além disso, podese programar tarefas para serem realizadas em horas certas ou intervalos regulares de tempo através do Cron Service.
Também é possível realizar processamento intenso no GAE. A Images API é utilizada no processamento de imagens, garantindo acesso a propriedades (como tamanho, formato e um histograma do valor das cores) e permitindo redimensionar, girar, cortar, melhorar imagens automaticamente e convertêlas entre formatos. Existe também a MapReduce, que realiza processamento distribuído em larga escala.
Para manusear uma aplicação de forma eficiente existem também muitos serviços. As aplicações podem precisar se identificar para entrar em contato com outras e para isso existe a App Identity, que permite criar tokens que garantem a sua identidade. Para gerenciar usuários, a Users API provê a autenticação com contas do Google e de outras formas.
Todos esses recursos são usados através das APIs disponibilizadas dentro do SDK específico de cada linguagem. A maioria está disponível, mas alguns ainda estão em fase de desenvolvimento. A lista completa pode ser vista na documentação (GOOGLE, 2015).
2.4.2 Linguagens de Programação Suportadas e seus Ambientes de Execução
Atualmente o GAE suporta quatro linguagens de programação: Java, Python, PHP e Go. Cada linguagem possui um ambiente de execução (do inglês runtime environment ) seguro e restrito à sua aplicação.
O ambiente de execução isola as aplicações de forma a garantir que elas não interfiram no desempenho nem na escalabilidade de outras. Para isso, algumas funcionalidades (como escrever no disco rígido, abrir conexões de rede, criar threads ) das bibliotecas padrão das linguagens foram vetadas. Existem os serviços específicos da plataforma que realizam tarefas de armazenamento, uso de threads e conexões que devem ser utilizados em substituição a essas bibliotecas.
O GAE executa aplicações Java utilizando a JVM 7. O padrão de aplicações web utilizado é o de Java Servlet, onde o GAE invoca os servlets do aplicativo para lidar com requisições. As classes dos servlets, JavaServer Pages (JSPs), arquivos estáticos e de configurações devem estar contidos numa estrutura de diretórios WAR. Existem plugins para o Eclipse e outras IDEs que ajudam no desenvolvimento de aplicações Java e projetos do GAE em geral.
Aplicações desenvolvidas em Python interagem com a plataforma do Google usando o protocolo WSGI, de forma que os aplicativos possam utilizar qualquer framework compatível com este protocolo. O framework webapp2 é simples para se começar e já vem incluído.
Frameworks mais robustos desenvolvidos por terceiros (como o Django) também funcionam no GAE. O interpretador pode executar qualquer código Python que você escreva, assim como os módulos da biblioteca padrão, com algumas exceções para garantia de segurança do ambiente de execução. O App Engine suporta atualmente o Python 2.7.
O ambiente de execução do PHP executa aplicações usando o PHP 5.5, e suporta as extensões de arquivos padronizadas mais comuns. O GAE usa um servidor próprio que pode ser configurado através de um arquivo app.yaml. O PHP já esta em fase de testes (beta) e em breve poderá ser utilizado em aplicações com ambientes de produção.
O GAE executa a versão 1.4 do Go e suporta as goroutines , mas elas são programadas numa única thread, de forma que elas sejam executadas concorrentemente, mas não em paralelo. O próprio ambiente trata da compilação do código da aplicação enviado, assim não é necessário se preocupar com isto. O Go já está em fase de testes (beta) e em breve poderá ser utilizado em aplicações com ambientes de produção.
2.5 Estudos Relacionados ao Tema de Pesquisa
Existem vários estudos sobre a plataforma GAE e muitos outros sobre comparação entre linguagens de programação. Os estudos que comparam linguagens de programação já tem décadas de idade e possuem autores já consolidados como referência na área. Já sobre a plataforma de nuvem do Google, existem também vários estudos, porém devido às melhorias constantes aplicadas à plataforma, eles acabam ficando desatualizados e incompletos.
Han (2011) apresenta um estudo de algumas das principais plataformas de nuvem do mercado. São elas a AWS, o Windows Azure e o GAE. O autor descreve as três plataformas mostrando suas principais características, além de falar também sobre o custo de se utilizar a computação na nuvem e o de gerência da própria infraestrutura de computação. O estudo, porém data de 2011 e muitas afirmações sobre as características das plataformas de nuvem estudadas já estão desatualizadas.
Um estudo mais focado no GAE foi feito por Rodrigo Soares (2009) onde são analisadas várias características da plataforma, entre elas as linguagens de programação. O objetivo do estudo, porém é algo mais amplo que envolve a criação de um portal de serviços desenvolvido para suprir carências do ambiente disponibilizado pelo Google. Por causa desta prioridade, o autor acabou focando apenas na linguagem Java. Além disso, como o estudo é de 2009, havia apenas suporte às linguagens Java e Python.
Outro estudo também focado no GAE foi feito por Victor Müller (2010). Nele, o autor apresenta detalhadamente a plataforma: características, cotas e limites, preços e serviços disponíveis. Além disso, apresenta também as ferramentas disponibilizadas pelo Google para ajudar no desenvolvimento de aplicações, como o Google Web Toolkit (GWT) para desenvolvedores Java. Porém, o estudo aborda apenas esta linguagem.
Com relação à comparação entre linguagens de programação, como foi dito, já existem inúmeros estudos e alguns autores que se destacam como referência, porém um específico merece mais atenção no contexto deste trabalho. Resende Júnior (2005) apresenta uma comparação entre linguagens para a internet. O autor foi muito abrangente definindo catorze critérios de avaliação e abordando várias linguagens (PHP, Perl, Python, ColdFusion, ASP, ASP.NET e Java), além de realizar testes em diferentes arquiteturas. Entretanto, o estudo não aborda a computação na nuvem.
Sete linguagens foram avaliadas empiricamente num estudo feito por Lutz Prechelt (2000). O autor avaliou o tempo de execução, o consumo de memória, a confiabilidade e a quantidade de comentários nos códigos de programas escritos nas linguagens C, C++, Java, Perl, Python, Rexx e Tcl, além da produtividade dos programadores ao utilizar cada uma delas. Um ponto forte nesse estudo é que foram analisadas linguagens compiladas, interpretadas e híbridas. Porém uma deficiência é que foi analisada apenas uma aplicação relativamente simples, que nem necessitou de utilizar o paradigma orientado a objetos.
D. Delorey, C. Knutson e S. Chun (2007) realizaram uma pesquisa em quase 10.000 projetos de código aberto hospedados no site SourceForge.net a fim de identificar de forma empírica se a linguagem de programação influencia na produtividade do programador. A Figura 2 apresenta em ordem crescente da esquerda para a direita a média estimada de produção de linhas de código por ano por programador de cada uma das linguagens. Podemos perceber que Python, Java e PHP estão agrupadas no centro da figura, enquanto C, C++, C# e Pascal ficam à direita e JavaScript, Perl e Tcl ficam à esquerda. Isso mostra indícios de que o paradigma de programação da linguagem pode influenciar na produtividade do programador. Não se pode, porém, dizer que Pascal ou C sejam mais produtivas do que Python ou Perl, por exemplo, pois estas últimas tendem a requerer menos linhas de código do que as primeiras para se fazer uma mesma tarefa.
Figura 2 Média estimada de produção do programador (em linhas de código por ano)
Fonte: D. Delorey, C. Knutson e S. Chun (2007)
Schmager (2010) apresenta uma avaliação da linguagem Go com padrões de projeto. Foram implementados 23 (vinte e três) padrões de projeto a fim de avaliar o suporte da linguagem aos padrões mais comuns. O resultado é que alguns artifícios da linguagem Go simplificam alguns padrões de projeto quando comparados com sua implementação em Java, sendo o padrão Adapter o mais notável deles. Porém, o padrão Template Method , tão usado em frameworks web, por exemplo, tornouse mais complicado e tendencioso a erros. Para os demais padrões, a linguagem não facilita nem prejudica tanto sua implementação. Algumas peculiaridades da linguagem, porém tem um efeito negativo, segundo o autor. A ausência de construtores de objetos é um exemplo. Além disso, a falta de padronização na organização de pacotes e em algumas convenções de escrita da linguagem dificultam o entendimento de código de terceiros.
Chen et al. (2005) apresentam um estudo das tendências de utilização das linguagens de programação dos anos de 1983 até 2003, com o objetivo de prever a utilização das mesmas linguagens nos anos seguintes. Os autores definem fatores instrínsecos (confiabilidade, implementação, portabilidade, etc.) e extrínsecos (suporte institucional, tecológico, industrial, etc.) que contribuíram para o sucesso das linguagens estudadas. O estudo, porém, foca apenas num grupo de linguagens, não incluindo linguagens de scripting, como Python ou PHP.