• Nenhum resultado encontrado

Comparação entre as Linguagens de Programação Suportadas pelo Google App Engine

N/A
N/A
Protected

Academic year: 2021

Share "Comparação entre as Linguagens de Programação Suportadas pelo Google App Engine"

Copied!
57
0
0

Texto

(1)

          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     

(2)

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     

(3)

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

(4)

                                                                  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     

(5)

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. 

(6)

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 "pay­as­you­go"), 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ão­de­obra, 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ódigos­fonte        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. 

 

Palavras­chave: Computação na nuvem; Google App Engine; Linguagens de programação. 

(7)

ABSTRACT 

Cloud computing is a new computing model where third­party 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 ("pay­as­you­go"), 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. 

 

(8)

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ão­de­Obra ...  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 

(9)

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ão­de­obra ...  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           

(10)

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 pode­se 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 "      pay­as­you­go"), 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 e­mail 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 observando­se 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       

(11)

lucrativos, utiliza o Google App Engine (GAE) para hospedar seu site de vídeo­aulas 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       front­end  escrito com Ruby­on­Rails 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 percebe­se 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/case­studies/automobili­lamborghini/>,            <http://channel9.msdn.com/Blogs/Windows­Azure/Windows­Azure­Case­Study­Webzen/> e <https://cloud.g  oogle.com/files/KhanAcademy.pdf> respectivamente. 

 

(12)

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ódigos­fonte 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. 

(13)

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, torna­se 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 mostra­se 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       

(14)

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 classifica­se 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. 

(15)

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. 

(16)

2 REVISÃO BIBLIOGRÁFICA 

2.1 Linguagens de Programação 

2.1.1 História 

A evolução das linguagens de programação deu­se através da necessidade de se        produzir programas complexos mais facilmente e de melhor qualidade. Essa evolução        limitou­se 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. 

Percebeu­se 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       

(17)

(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ógico­matemá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       

(18)

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 

 

(19)

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        baseia­se 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        ponto­chave 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ódigo­fonte, 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       

(20)

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      open­source . 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 utilizando­se a incorporação (      embedding) ­, que tornam alguns padrões        de projeto mais fáceis ou mais difíceis de serem implementados (SCHMAGER, 2010). 

   

(21)

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ódigo­fonte 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 convencionou­se 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. 

   

(22)

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. 

(23)

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). Relaciona­se 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         

(24)

(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. 

(25)

"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       

(26)

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 

Percebe­se 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, faz­se 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.  

(27)

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, pode­se 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. Observa­se        que as plataformas de computação na nuvem seguem o modelo de cobrança       pay­as­you­go,  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. 

(28)

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. Chama­se 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       Software­as­a­Service, 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         Platform­as­a­Service, 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  Infrastructure­as­a­Service, 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. 

   

(29)

    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. 

(30)

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 e­mails, 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, pode­se programar tarefas para serem realizadas em horas certas ou intervalos        regulares de tempo através do Cron Service. 

(31)

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.       

(32)

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. 

(33)

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. 

   

(34)

 

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, tornou­se 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. 

Referências

Documentos relacionados

Este trabalho se refere ao instituto processual conhecido como fundamentação das decisões judiciais, que em razão da divergência doutrinária quanto a nomenclatura

No presente estudo, realizado com a população residente no Distrito de Itaiacoca atendida pelo projeto extensionista &#34;Avaliação laboratorial na assistência à saúde e

A amplitude da passada não se mostrou significativamente diferente nas duas corridas, já a freqüência da passada houve uma diminuição significativa dos 50 para os

En este sentido, el concepto de interés general, ahora abierto a la participación por exigencias de un Estado que se presenta como social y democrático de Derecho, presenta

da quem praticasse tais assaltos às igrejas e mosteiros ou outros bens da Igreja, 29 medida que foi igualmente ineficaz, como decorre das deliberações tomadas por D. João I, quan-

O presente estudo controlado randomizado comparando duas abordagens para reconstruir o osso vestibular em conjunto com implantes imediatos na presença de

A assistência da equipe de enfermagem para a pessoa portadora de Diabetes Mellitus deve ser desenvolvida para um processo de educação em saúde que contribua para que a

• A vazão de ar necessária em minas de carvão, para cada frente de trabalho, deve ser de, no mínimo, 6.0 m 3 /min (seis metros cúbicos por minuto) por pessoa. • A vazão de ar