PROGRAMAÇÃO FUNCIONAL
Tipo de documento:TCC
Área de estudo:Tecnologia da informação
Linguagens imperativas declaram explicitamente a ordem e o fluxo de controle do programa, enquanto na programação funcional, o programa inteiro é definido por funções matemáticas. Para demonstrar estes dois paradigmas, serão apresentados os resultados dos testes de uma aplicação usando as linguagens de programação funcional e imperativa, Elixir e C respectivamente. A tese se concentra em mostrar todas as características dos dois paradigmas e como o funcional lida com concorrência em relação a programação orientada a objetos, demonstrando como a programação funcional auxilia o desenvolvedor, sendo mais eficaz se comparado a programação imperativa. A linguagem Elixir permite maior produtividade na máquina virtual Erlang, como o gerenciamento de pacotes, ferramentas, meta-programação, manipulação unicode e frameworks web, que em Erlang não são tão diretos quanto na linguagem C e outras.
Palavras-Chaves: Paradigmas de Programação; Funcional; Imperativo; Concorrência. Resultado Esperado 10 1. Método de Pesquisa 10 1. Organização do Texto 11 2. Revisão Bibliográfica 13 2. Fundamentação Teórica 13 2. FERREIRA et al (2014) 36 2. GARZÃO et al (2014) 37 2. LODER (2016) 37 3. RESULTADOS E DISCUSSÕES 39 3. Testes 46 4. De acordo Tucker e Noonam (2010, p. algumas linguagens possuem características semelhantes, por esta razão, são ditas pertencerem a um mesmo paradigma: um modelo, padrão ou estilo de programação. Conforme Cravo e Martins (2011, p. a classificação das linguagens em paradigmas facilitam decisões em projeto que impactam diretamente a forma de uma aplicação real ser modelada do ponto de vista computacional. Figura 1: Paradigmas Fonte: Elaborado pelos autores, 2018. Para a pesquisa foram revisados conteúdos disponíveis em livros e em fontes de dados eletrônicos entre 2010 e 2018.
A escolha dos trabalhos nas fontes de dados teve como critério a confiabilidade das fontes de informações e que tivessem a disponibilidade gratuita eletronicamente. Desta forma foram criados os dispositivos de seleção para iniciar com critério de qualidade as 03 (três) bases de dados: Biblioteca Digital Brasileira de Computação – BDBComp; Google Acadêmico e Scientific Eletronic Library Online – Scielo. Inicialmente foram identificados os trabalhos em cujos títulos e/ou resumos fossem encontradas as seguintes palavras-chave: programação funcional, programação imperativa, paradigmas de programação e programação funcional e imperativa. Para atingir o objetivo proposto, alguns temas serão apresentados neste trabalho: Pesquisa Bibliográfica: Pesquisa de trabalhos relacionados e referências. Na seção 3, é apresentado o desenvolvimento das aplicações, onde serão explicitados os detalhes da elaboração da solução do problema.
Na seção 4, são apresentados os testes e os detalhes dos testes realizados. Na seção 5, são apresentados os resultados e discussão, seguido da seção 6, com a conclusão, onde são apresentados os objetivos atingidos, as dificuldades encontradas e as recomendações para continuidade desse trabalho. Revisão Bibliográfica Neste capítulo serão abordados os assuntos relativos aos paradigmas de programação funcional e imperativo e os estudos cerca do tema. Fundamentação Teórica Conforme Malaquias (2017 p. a recursividade pode ser definida como uma rotina, procedimento ou função, que chama a si mesma, de forma direta ou indireta. De acordo com Cravo e Martins (2011, p. em termos matemáticos, a recursividade é definida como a notação através da qual uma função pode ser definida em seus próprios termos.
Para Lorde (2016, p. sob a perspectiva funcional, a recursão é um dos maiores recursos disponíveis para implementar processos cíclicos que não permanecem em "loops" infinitos, mas, sob uma certa lógica e sempre de acordo com as necessidades algorítmicas, fim retornar com êxito os resultados necessários como um produto do processo iterativo. Figura 2: Figura ilustrativa do modelo computacional dos dois paradigmas. Fonte: Elaborado pelos autores, 2018. Paradigma funcional A programação funcional é um paradigma na qual é usado em um estilo puro de funções matemáticas. Conforme acordo Cravo e Martins (2011, p. é um tipo declarativo de estilo de programação usado em cálculos matemáticos. Alan Turing era um estudante da Alonzo Church que criou a máquina de Turing, que lançou as bases do estilo de programação imperativo.
Conforme Loder (2016, p. as linguagens de programação que suportam a programação funcional: Haskell, JavaScript, Scala, Erlang, Lisp, ML, Clojure, OCaml, Common Lisp, Racket e os tipos de programação funcional são: funções puras, recursão, transparência referencial, funções de primeira classe ou de ordem superior e variáveis são imutáveis. A abordagem de transformação funcional é ideal para consultar e manipular dados estruturados, portanto se encaixa bem com as tecnologias LINQ - Language INtegrated Query, ou consulta integrada à linguagem e por isso pode ser considerado um mecanismo para facilitar consultas à dados organizados. As funções puras têm duas propriedades principais, sendo que na primeira que elas sempre produzem a mesma saída para os mesmos argumentos, independentemente de qualquer outra coisa e em segundo lugar, modificam qualquer argumento, variáveis globais ou produzem um resultado.
Programas funcionais não possuem instruções de atribuição. Se tiver que armazenar algum valor, deve ser definido novas variáveis. Isso elimina todas as chances de falhas, pois qualquer variável pode ser substituída por seu valor real em qualquer ponto de execução. O estado de qualquer variável é constante em qualquer instante. Exemplo: x = x + 1 // esta função altera o valor atribuído à variável x. Vale ressaltar que a recursão de cauda pode ser implementada em linguagens imperativas. O principal motivo para implementação de programas utilizando o paradigma funcional se deve em função da sua independência e porque não alteram estado. Essas características trazem vários benefícios, porém existem algumas desvantagens. Quadro 1: Vantagens e Desvantagens - Programação Funcional.
Vantagens Desvantagens Não alteram estado e dependem apenas da entrada dada a elas e qualquer saída que eles produzam é o valor de retorno que eles dão. Desenvolvimento reiterativo. Funções que dependem apenas de suas entradas para fornecer sua saída (e para a mesma saída de entrada permaneceria o mesmo), sendo possível compreendê-las isoladamente, o que torna mais fácil a refatoração. Há uma enorme quantidade de desinformação sobre a programação funcional. Trabalhar com linguagens funcionais fornece uma escrita de código rápida e precisa, facilita o teste e a depuração. Não há vocabulário eficiente para linguagens funcionais. Conforme Tucker e Noonam (2010, p. para tornar os programas mais simples para um ser humano ler e escrever, as instruções imperativas podem ser agrupadas em seções conhecidas como blocos de código.
Ferreira et al. p. informa que nos anos 50, a ideia de agrupar o código de um programa em blocos foi implementada pela primeira vez na linguagem de programação ALGOL e eram originalmente chamados de "instruções compostas", mas hoje esses blocos de código são conhecidos como procedimentos. Conforme Cravo e Martins (2011, p. o mais proeminente para a programação imperativa é o fluxo seqüencial de instruções e ramificações. var a = 5; var b = calcula(a); if (b > 10) { print ("Número maior que 10"); return; } As linhas de código são executadas uma de cada vez, de cima para baixo. Um valor de 5 é armazenado na variável a. O valor de a é então assumido pela calculafunção. int b = 5; int * a = & b; // a == 5 * a = 6; // b == 6 Esses exemplos podem parecer simples, mas são aspectos significativos desse paradigma.
A programação imperativa tem um conceito direto de memória. É obtido uma tela na qual é possível ler e escrever valores à vontade. Isso requer que entendimentos de valores e ponteiros. Muitas linguagens vão tão longe quanto nos permitem reinterpretar a memória como tipos arbitrários. Programas imperativos sempre estarão vulneráveis porque contêm variáveis mutáveis. As limitações dependem da linguagem específica e de seu tempo de execução. Linguagens como C e C ++ que permitem assembler embutido são essencialmente ilimitadas, na medida em que podem ser usadas para implementar qualquer coisa que a máquina possa fazer. Os idiomas que são executados em uma MV – Máquina Virtual, são mais restritos e têm maior probabilidade de se limitar a um subconjunto de operações que são comuns em muitas plataformas e arquiteturas.
Quadro 2: Vantagens e Desvantagens - Programação Imperativa. Não suporta Reusabilidade total. Componentes imperativos são ligados a cada um através de funções e variáveis. Os programas são criados pelo sequenciamento de chamadas para várias bibliotecas e pela alteração de um estado global, na memória, no disco ou em uma rede. Tudo o que acontece é explicitamente escrito e ordenado no código. Não é totalmente modulado. Sendo um número, o ponteiro pode ser manipulado como um número e qualquer programado que tenha habilidade com o C sabe sobre manipulação de buffer. Nos paradigmas imperativos modernos, não é possível acessar a memória diretamente com ponteiros sem torná-lo explícito com palavras-chaves, compiladores ou implementações de biblioteca padrão.
Além disso, a memória não precisa ser alocada ou liberada no programa; uma limpeza no programa já faz parte dos sistemas de tempo de execução e fazendo isso automaticamente usando algoritmos sofisticados. Programação Concorrente vs Paralela Um sistema é considerado concorrente se puder suportar duas ou mais ações em andamento ao mesmo tempo e pode ocorrer dentro do paradigma imperativo, orientado a objeto, funcional ou lógico. Um sistema é considerado paralelo se puder suportar duas ou mais ações em execução simultaneamente. Figura 3: Figura ilustrativa do modelo computacional dos dois paradigmas Concorrente Paralelo Fonte: PUC RIO1, 2018. Nos sistemas concorrente, a modularidade, capacidade de resposta e manutenibilidade são importantes. Na programação paralela, várias ações são executadas estritamente ao mesmo tempo para melhorar a eficiência.
Por outro lado, várias ações não são necessariamente executadas simultaneamente na programação simultânea, devido à capacidade de gerenciamento do lado do usuário. A concorrência preocupa-se com além da eficiência e a principal preocupação está em quando uma execução pode começar, como a troca de informações pode ocorrer e como o código gerencia o acesso a recursos compartilhados. O navegador da Web é um cliente HTTP, enviando solicitações para máquinas servidoras. Quando o usuário do navegador digita as solicitações de arquivos "abrindo" um arquivo na web, digitando uma URL ou clicando em um link de hipertexto, o navegador cria uma solicitação e a envia ao endereço IP - Internet Protocol address, que é o endereço de Protocolo da Internet, indicado pela URL.
O daemon HTTP na máquina do servidor de destino recebe a solicitação e envia de volta o arquivo solicitado ou os arquivos associados à solicitação. Uma página da Web geralmente consiste em mais de um arquivo. Existem três recursos básicos que tornam o HTTP um protocolo simples, mas poderoso: • O HTTP é sem conexão: O cliente HTTP, ou seja, um navegador inicia uma solicitação HTTP e depois que uma solicitação é realizada, o cliente se desconecta do servidor e aguarda uma resposta. Quadro 3: Métodos básicos HTTP. Método Descrição GET O método GET é usado para recuperar informações do servidor fornecido usando um determinado URI. Solicitações usando GET só devem recuperar dados e não devem ter outro efeito sobre os dados.
HEAD O mesmo que GET, mas transfere apenas a linha de status e a seção de cabeçalho. POST Uma solicitação POST é usada para enviar dados para o servidor, por exemplo, informações do cliente, upload de arquivos, etc. XML é usado para codificar todas as comunicações para um serviço da web, ou seja, se um cliente chama um serviço da web enviando uma mensagem XML, ele aguarda uma resposta XML correspondente. Como toda comunicação está em XML, os serviços da web não estão vinculados a nenhum sistema operacional ou linguagem de programação. São sistemas de troca de informações baseados em XML que usam a Internet para interação direta entre aplicativos. Esses sistemas podem incluir programas, objetos, mensagens ou documentos.
Os serviços da web são aplicativos dinâmicos, modulares, distribuídos e independentes que podem ser descritos, publicados, localizados ou chamados pela rede para criar produtos, processos e cadeias de suprimento. utilizadas. Reutilização de código Pode ser utilizado por várias plataformas com diferentes objetivos de negócio, seu código é realizado uma vez, podendo ser reutilizado por diferentes aplicações. Redução do tempo de desenvolvimento Os sistemas não são totalmente construídos a partir do zero e facilmente são incluídas novas funcionalidades. O tempo de implementação de sistemas utilizando web services é reduzido, sendo uma boa opção no desenvolvimento de software. Segurança Evita a comunicação direta com a base de dados. Dentro dela, são executados milhares de processos que podem se comunicar entre si.
Quadro 5: Exemplo do estilo de programação funcional. ovos Argumentos 2 xícaras (chá) de açúcar. xícaras (chá) de fubá. colheres (sopa) de farinha de trigo. Duas características do paradigma funcional são exatamente o oposto de programação imperativa: programação funcional evita efeitos colaterais e dados mutáveis. Varáveis mutáveis são aquelas que possibilitam alterações de valores ao longo da execução de um programa. Os argumentos de uma função são todos avaliados antes do processamento da função começar e a única saída é definido na função. No exemplo do bolo, foi possível observar a natureza declarativa da abordagem como paradigma funcional, mas não há uma relação permanente. Há muitas discussões sobre o assunto e, dependendo da definição de declarativo, as respostas podem ser diferentes.
As fronteiras nem sempre são claras, e os desenvolvedores que programam em uma das linguagens imperativas mais mainstream têm usado o paradigma funcional, muitas vezes sem saber ou perceber. E existem ainda as linguagens que foram projetadas especificamente para programação concorrente. A linguagem Erlang é muito utilizada atualmente. A principal vantagem de Erlang é suporte a concorrência. Tem um pequeno, mas poderoso, conjunto de funções primitivas para criar processos e fazer com que eles se comuniquem. O isolamento permite que os processos sejam coletados de forma independente, reduzindo as pausas no sistema e usando todos os recursos da máquina da maneira mais eficiente possível (dimensionamento vertical). Para lidar com falhas, o Elixir fornece supervisores que descrevem como reiniciar partes de seu sistema quando as coisas dão errado, voltando a um estado inicial conhecido com a garantia de funcionar.
JAVA Java é uma linguagem de programação e plataforma de computação lançada pela Sun Microsystems em 1995. Há muitos aplicativos e sites que não funcionarão a menos que ele seja instalado. Java é um JRE (General Runtime Environment, ambiente de tempo de execução), que consiste na JVM, que é a base da plataforma Java. Vantagens Desvantagens Simples, foi projetado para ser fácil de usar e, portanto, é fácil de escrever, compilar, depurar e aprender do que outras linguagens de programação. Desempenho: o Java é mais lento e consome mais memória do que as linguagens nativamente compiladas, como C ou C ++. Orientado a Objetos: é orientado a objetos, centrada na criação de objetos, na manipulação de objetos e na criação de objetos em conjunto. Isso permite que você crie programas modulares e código reutilizável A aparência padrão dos aplicativos de GUI escritos em Java usando o kit de ferramentas Swing é muito diferente dos aplicativos nativos.
É possível especificar uma aparência diferente através do sistema de aparência e toque plugáveis do Swing. Java é seguro, uma das primeiras linguagens de programação a considerar a segurança como parte de seu design. Java é Multithreaded, que é a capacidade de um programa executar várias tarefas simultaneamente dentro de um programa. Em Java, a programação multiencadeada foi suavemente integrada a ele, enquanto em outras linguagens, os procedimentos específicos do sistema operacional precisam ser chamados para ativar o multithreading, que é uma necessidade em programação visual e de rede. Fonte: Elaborado pelos autores, 2018. A essência da programação imperativa é fornecer declarações para dizer a alguém como fazer algo. Iniciando com conceitos e noções básicas, as quais foram utilizadas para algumas afirmações neste trabalho, discutindo comparativamente diversos paradigmas de programação, incluindo a programação funcional, a programação imperativa e a programação por objetos.
O conteúdo serve inclusive para quem não conhece a linguagem de programação Scheme, que é baseada em é um escopo estatístico e recursivo do Lisp. Scheme foi uma das primeiras linguagens de programação a incorporar procedimentos de primeira classe como no cálculo lambda, comprovando assim a utilidade de regras de escopo estático e estrutura de blocos em uma linguagem tipada dinamicamente. Scheme introduziu o conceito de números exatos e inexatos. Scheme também é a primeira linguagem de programação a suportar macros limpas, que permitem que a sintaxe de uma linguagem estruturada em bloco seja estendida de forma confiável. A BenchmarkEngine define com clareza os valores dos operadores de crossover e de seleção, critério de parada, e vários parâmetros, como por exemplo, quantidade de pontos, número de gerações, tamanho da população inicial e quantidade de indivíduos selecionados para reprodução.
Graças a essa classe, vários testes puderam ser realizados e comparados com bastante clareza. Foi identificado que é muito difícil que uma solução ótima seja alcançada, mas é possível chegar nela. Na conclusão, apresentaram, separadamente, seus desafios e frustrações durante o trabalho. Porém, os dois concordam que o mais difícil foi pesquisar e estudar sobre Algoritmos Genéticos, pois não tinham conhecimento prévio suficiente para realizar o trabalho Esse trabalho proporcionou uma noção maior das limitações dos Algoritmos Genéticos, pois foram efetuados diferentes testes que nem sempre mostraram os melhores resultados 2. A inclusão de contextos privados com memória persistente facilitaria o uso de trilhas, o que possibilitaria o registro do histórico das atividades realizadas por entidades em contextos, sendo possível então utilizar esses dados para o aperfeiçoamento da adaptação ao contexto.
LODER (2016) O trabalho de Loder (2016) fala sobre conceitos de paradigmas, mostra historicamente algumas linguagens de programação, desde Fortran 77, Cobol-85, Common Lisp e escreve sobre a história de Erlang e Elixir, mostrando ir da programação imperativa para programação funcional e declarativa. mostrando que a nova geração de desenvolvedores não tem que lidar com as restrições que prevaleciam na década de 80 e início de 90: velocidade de computação e gerenciamento de memória. Loder informa em seu libro que a partir de 2016, estamos olhando para os limites do design de CPU física e de fato o software tornou-se o gargalo. Com CPUs poderosas com muita memória e vários núcleos que podem calcular em paralelo, mas os paradigmas de desenvolvimento de software que usamos para criar a maioria das aplicações empresariais não estão acompanhando este avanço.
Então, a sequência é: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 e assim por diante. A equação matemática que a descreve é X n + 2 = X n + 1 + X n. Foi utilizado o IDEONE4, que é um editor on-line gratuito para a linguagem Elixir, C, entre outros. A essência da programação funcional é que cada função é entendida apenas em termos de suas entradas e saídas. Não há estado externo, apenas os argumentos e o retorno, como o exemplo demonstrado na figura 6. Muitas vezes, no Elixir, existe a necessidade de compartilhar ou armazenar o estado que deve ser acessado de diferentes processos ou pelo mesmo processo em diferentes pontos no tempo. O Agent fornece uma implementação básica do servidor que permite que o estado seja recuperado e atualizado por meio de uma API simples.
Figura 7: Sequencia Fibonacci com Elixir usando Agent module. Fonte: Elaborado pelos autores, 2018. No paradigma imperativo, a lógica se concentra em como (iteração, estado) ao invés daquilo que se quer alcançar. Fonte: Elaborado pelos autores, 2018. A figura 11 mostra o diagrama de sequência da série Fibonacci. Figura 11: Diagrama de classe Fibonacci. Fonte: Elaborado pelos autores, 2018. Testes Os testes de APIs - Applications Programming Interface, são tipos de testes de softwares focados em determinar à funcionalidade, confiabilidade, performance e segurança da aplicação. Conclusão A programação Elixir é ideal para aplicativos que têm muitos usuários ou estão aumentando seu público ativamente. O Elixir pode facilmente lidar com muito tráfego sem custos extras para servidores adicionais. Java "objetos" são uma unidade básica de computação do programador Java.
Ou seja, um objeto é a principal ferramenta com a qual o mundo é modelado. Objetos possuem data {X, Y, Z} e executam funções {A (), B (), C ()} sobre ele e pode se comunicar com outros objetos, chamando funções / métodos definidos como parte de sua interface pública. Vários encadeamentos em Java indicam vários contextos de execução e são um tópico muito complexo, porque a atividade de impacto em diferentes contextos de temporização tem um sobre o outro (e o sistema como um todo: programação defensiva, esquemas de exceção, etc. Dizendo "multi-threaded" em Java significa algo diferente do que em Erlang, na verdade isso nunca é dito em Erlang porque é sempre o caso base. Observe aqui que os encadeamentos Java implicam segregação como pertencente ao tempo, não à memória ou a referências visíveis - a visibilidade em Java é controlada manualmente, escolhendo o que é privado e o que é público.
Os elementos acessíveis universalmente de um sistema devem ser projetados para serem "seguros em linha" e reentrantes, sequenciados por meio de mecanismos de enfileiramento ou empregar mecanismos de bloqueio. Em suma: o agendamento é um problema gerenciado manualmente em programas Java com threads / concorrentes. Referências Bibliográficas COSTA, A. Conceitos Básicos sobre Sistemas Web: Arquitetura e Serviços. páginas. Faculdade dos Guararapes. Laureate International Universities. FELLEISEN, M. et al. How to design programs (2ª Ed). Boston. MIT Press FERREIRA, T. Passo Fundo, v. n. JAVA. Web Terminology: HTTP (Hyper Text Transfer Protocol). Disponível em: https://www. SEBESTA, R. W. Conceitos de Linguagens de Programação. ed. Porto Alegre: BOOKMAN, 2018. Linguagens de Programação: Princípios e paradigmas. ed. Porto Alegre: AMGH, 2010. XAVIER, Robson Duarte. Paradigmas de desenvolvimento de software: comparação entre abordagens orientada a eventos e orientada a notificações.
devmedia. com. br/como-funcionam-as-aplicacoes-web/25888. Acesso em 07 nov. IDEONE. PUC RIO. Disponível em: http://www. inf. puc-rio. br/~inf1621/concorrencia.
3011 R$ para obter acesso e baixar trabalho pronto
Apenas no StudyBank
Modelo original
Para download
Documentos semelhantes