Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Linguagens Funcionais O que é linguagem funcional Fundamentos Características Modelo computacional Como programar funcionalmente Porque as linguagens funcionais são importantes Vantagens e desvantagens Historia das linguagens funcionais Eficiencia Calculo Lambda Lisp Haskell Scala Scheme Fsharp Uso pratico das linguagens funcionais Comparações entre LF e LI Curiosidades O que é uma linguagem Funcional? É um paradigma de programação Linguagens baseadas em funções matemáticas No paradigma funcional, um programa é um conjunto de definições de funções que aplicamos a valores Linguagens funcionais suportam melhor o paradigma funcional - São caracterizadas por 3 conceitos: - Variáveis - Atribuição - Repetição Notação Lambda de Church Comparação função matemática x cálculo lambda - cubo(x) = x * x * x - λx. x* x * x Linguagem Funcional Fundamentos Difere das linguagens Imperativas; Não existe o conceito de variáveis ou atribuição Efeitos colaterais; Alterações devem ser construídas com recursão; Estrutura de controle de fluxo diferenciadas; Alto poder de expressividade: - Funções de alta ordem - Mapeamento, filtragem e redução Características Sua sintaxe encoraja uma visão totalmente modular do fluxo do programa; Reutilização do código previamente escrito (funções) para construir programas cada vez mais complexos; Geralmente não há um identificador (por exemplo a função main( ) de C e Java) para indicar o ponto onde a execução do programa inicia. Características Modelo Computacional Entrada Programa Saída Ausência de estados e comandos, não existe conceito de memória. Como programar Funcionalmente? Um programador funcional utiliza: Comandos de seleção; Recursão / Indução; Estruturas de dados complexas; Novos conceitos de programação Propostos para compensar a “deficiência” da LF; Polimorfismo, Funções de alta ordem, Avaliação tardia, Monads, entre outros. Porque linguagens funcionais são importantes Dos 3 principais paradigmas de programação (funcional, imperativo e orientado a objetos), o funcional é o mais antigo. A primeira linguagem de programação funcional foi criada em 1955 (IPL) e a mais popular LISP foi criada em 1958. Apesar de surgirem um pouco depois (Fortran e COBOL foram criadas respectivamentes em 1956 e 1959), as linguagens imperativas tiveram maior popularidade. Mesmo sem ter alcançado o mainstream, o paradigma funcional continou recebendo investimentos ano após ano até meados dos anos 90, quando a turma das linguagens imperativas se fundiu definitivamente com o pessoal de orientação a objetos (C++ e principalmente Java são exemplos) enterrando as linguagens funcionais no lixo da história. Acabaram as esperanças desse paradigma se tornar parte do mainstream. Será? O tempo passou e nos últimos anos alguns sinais começaram a aparecer. Erlang (linguagem funcional proprietária criada pela Ericsson) que foi banida e distribuida de forma open-source em 98, volta a ser utilizada pela Ericsson (e por muitos outros) em 2004. A Microsoft lança o F# (linguagem funcional para a plataforma .NET). O pessoal do Twitter reescreve seu back-end em Scala (linguagem funcional e OO para a plataforma Java). C# incorpora conceitos funcionais na sua linguagem para dar suporte ao LINQ. A Google publica artigos mostrando como utiliza o paradigma funcional para armazenar e recuperar dados. Porque esse interesse no paradigma funcional foi renovado? Qual o pulo do gato? Devido a proximidade de limites técnicos e preocupação com consumo de energia, o pessoal de hardware está focando no desenvolvimento de novos processadores em soluções de múltiplos cores. Em breve teremos processadores com centenas de cores. Para se beneficiar deste panorama, temos que escrever softwares que executem de forma paralela. A boa notícia é que é muito mais fácil escrever código concorrente em liguagens funcionais do que em linguagens imperativas. Não existe um único paradigma que seja indicado para resolver todos os tipos de problemas. Precisamos aprender (ou reaprender) o paradigma funcional, que foi abandonado por muito tempo. Precisamos de linguagens que incluam de forma coerente vários paradigmas, para que a gente possa escolher a melhor forma de resolver um determinado problema. Por fim, precisamos aprender Scala, que me parece a mais promissora nas novas linguagens multi-paradigma. Vantagens da programação funcional Nível mais alto: - Programas mais conciso - Próximos duma especificação matemática Mais modularidades: - Polimorfismo, ordem superior. - Permitem decompor problemas em componentes reutilizáveis. Garantias de correção: - Demonstrações de correção usando provas matemáticas - Maior facilidade em efetuar testes Concorrência/Paralelismo: - A ordem de execução não afeta os resultados Desvantagens da programação funcional Maior distancia do Hardware - Compiladores/interpretadores mais complexos; - Difícil prever os custos de execução(tempo/espaço); - Alguns algoritmo são mais eficientes quando implementados de forma imperativa. Bibliotecas com recursos limitados Incompatibilidade com outras tecnologias Instalação de compiladores e interpretadores complicada Pouco difundidas Não podem ser utilizadas em sistemas onde a performance é crítica Linguagens Puras x linguagens Não puras. Linguagem Funcional “pura”: Não possui memória como base da linguagem; Exemplo: Haskell; Linguagens Funcionais não puras: Possuem conceitos de memória; Exemplos: Lisp. Outras Linguagens Scala Scheme F# O`Caml História das Linguagens Funcionais Primeira linguagem de programação funcional: Lambda Calculus Não foi projetada para ser executada por um computador Desenvolvida por Alonzo Church na década de 30 LISP Desenvolvida por John McCarthy no MIT na década de 50 SCHEME Tentativa de simplificar LISP ML Desenvolvida na década de 70 na Universidade de Edimburgo por Robin Milner LAMBDA (λ) – Fundamentos teóricos O calculo Lambda é uma coleção de diversos sistemas formais baseados em uma notação para funções inventada por alonzo Church em 1936 com o intuito de capturar os aspectos mais básicos da maneira pela qual operadores ou funções podem ser combinados para formar operadores. O cálculo Lambda serve como uma ponte entre linguagens funcionais de alto nível e suas implementáveis de baixo nível. Raízes para a apresentação do calculo lambda como uma linhagem intermediaria: uma linguagem extremamente simples, consistindo de somente algumas poucas construções sintáticas e de uma semântica simples. Uma implementação do calculo lambda necessita somente suportar algumas construções simples. A sua semântica simples nos permite analisar facilmente a correção de sua implementação. Trata-se de uma linguagem expressiva, a qual é suficiente poderosa para expressar todos os programas funcionais e por conseguinte todas as funções computáveis. Isso significa que, se uma boa implementação do cálculo lambda é dispensável, pode-se implementar qualquer linguagem funcional através da implementação de um compilador desta para o calculo lambda. A sintaxe do cálculo lambda A linguagem do calculo lambda usa um alfabeto S constituído de: - Um conjunto de variáveis: v0, v1, v2, ... , vn... - Abstrator 1 (lambda) - Agrupadores (,) Exemplo: Um exemplo simples de uma expressão em calculo lambda é: (+ 45) Lisp A linguagem de programação LISP (do inglês LISt Processing), a primeira linguagem funcional, foi criada pelo americano John McCarthy em 1958 durante um projeto de pesquisa em Inteligência Artificial, é uma família de linguagem que possui uma grande história. A motivação de McCarthy surgiu da ideia de desenvolver uma linguagem algébrica para processamento de listas para trabalho em Inteligência Artificial. John McCarthy John McCarthy (Boston, 4 de setembro de 1927 — Stanford, Califórnia, 23 de outubro de 20112 ) foi um cientista da computação estadunidense. Conhecido pelos estudos no campo da inteligência artificial e por ser o criador da linguagem de programação Lisp. Recebeu o Prêmio Turing de 1972 e a Medalha Nacional de Ciências dos Estados Unidos de 1991. Origem: Wikipédia, a enciclopédia livre Lisp A linguagem de programação LISP é caracterizado pelas seguintes idéias: a) Computação com expressões simbólicas em vez de números; b) Representação de informações em uma mídia externa em sua maioria por listas de vários níveis; 4 c) Composição de funções como uma ferramenta para a formação de funções mais complexas; d) Uso recursivo de expressões condicionais como uma ferramenta suficiente para a construção de funções computáveis; e) Interpretação da expressão condicional conectivos booleanos; f) Coleta de lixo, como forma de lidar com o problema de apagamento Cammon Lisp Common Lisp Foi criado para combinar características de diversos dialetos de Lisp É uma linguagem grande e complexa (oposto do Scheme) Características Permite escopo estático e dinâmico Muito tipos de dados e estruturas Sistema poderoso de entrada e saída Pacotes (para modularização) Common Lisp foi criado para ser uma linguagem comercial Scheme é mais usado para o ensino Haskell Homenagem ao matemático Haskell Brooks Curry Inicio do projeto em 1987 Em 1997 estava em sua 4ª versão, entitulada de Haskell 98. Linguagem Funcional Pura Tipos de dados bem definidos Uma linguagem funcional pura de uso genérico Concebida para ensino e também para o desenvolvimento de aplicações reais Resultado de mais de vinte anos de investigação por uma comunidade de base académica muito activa Implementações abertas e livremente disponíveis Aplicações Os pontos fortes da linguagem Haskell têm sido bem aplicados em alguns projetos. É cada vez mais utilizada em aplicações comerciais. O compilador e interpretador Pugs criado por Audrey Tang é uma versão completa da linguagem Perl 6. Darcs é um sistema de controle de versões baseado em mudanças (change-based) com várias características inovadoras. A Linspire GNU / Linux escolheu Haskell para desenvolvimento das ferramentas do sistema . Xmonad é um gerenciador de janelas "tile-based" para o X Window System escrito inteiramente em Haskell. Bluespec SystemVerilog é uma linguagem feita como uma extensão do Haskell. Exemplo - Haskell Recursão, Pattern Matching, Listas contains :: Char->[Char]->Bool contains c [] = False contains c (h:t) = if (c==h) then True else (contains c t) Scala Linguagem que mistura os paradigmas funcional e orientado a objetos. Ganhou notoriedade recente por ter sido adotada pelo twiter em detrimento da linguagem Ruby. Exemplo - Scala def loopWhile(def cond: => Boolean)(def body: => Unit): Unit = { if (cond) { body; loopWhile(cond)(body); } } var i = 10; loopWhile (i > 0) { Console.println(i); i = i - 1 } ------ Define método loopWhile ------- Sintaxe comum !!! Scheme Originaria da linguagem LISP, que é precursora da maioria das linguagens funcionais Expressões nesta linguagem são escritas de forma parentizada e pré-fixada (fnç arg1 arg2 .... arg n) Principal distribuição : DrScheme Exemplo - Scheme (Define fatorial (lambda (n) (if (= n 0) 1 (* n (fatorial (-n 1)))))) FSharp Combinação da eficiência, scripting, sistema de tipos forte e produtividade de ML com a estabilidade, bibliotecas, compatibilidade (cross-language) e ferramentas de .NET Multi-paradigma Funcional Orientada a objetos Fsharp - Objetivos Resolver os 7 grandes problemas que levam ao de uso de linguagens funcionais Bibliotecas: Acesso às bibliotecas .Net sem necessidade de wrappers Portabilidade: Através de .NET Disponibilidade Pacotes: Assemblies de .NET provêm mecanismo de pacotes Ferramentas: Integração com o Visual Studio Treinamento Popularidade Projeto similar ao OCaml Fsharp - Objetivos Programação orientada à Matemática Desenvolvimento de aplicações científicas e de engenharia Implementação de análises simbólicas sofisticadas Verificação de hardware Verificação de software Otimização Aprendizagem de máquina Desenvolvimento de compiladores Comparativo: USO PRÁTICO DE LINGUAGENS FUNCIONAIS Haskell Ferramentas para manipulação de programas PHP. Erlang Parte do serviço de chat de facebook. Scala (linguagem híbrida) Serviços de filas de mensagens no twitter. Scheme e LISP Ensino de programação em várias universidades. ML Verificação de hardware e software na Microsoft e Intel. Comparação Entre as Linguagens Funcionais e Imperativas Linguagens imperativas Execução eficiente (nem sempre) Semântica complexa Sintaxe complexa Concorrência é projetada pelo programador Linguagens funcionais Execução ineficiente (nem sempre) Semântica simples Sintaxe simples Os programas podem automaticamente serem feitos concorrentes Curiosidades Dos 3 paradigmas de programação, Paradigma Funcional é o mais antigo. 1ª linguagem foi IPL de 1955 Mais popular foi a LISP de 1958 Investiu-se nela até meados da década de 90, e depois disso? Novos processadores de múltiplos núcleos, até centenas de core estão para ser desenvolvidos. A boa noticia é que para obter benefícios desse panorama é necessário escrever software que executem de forma paralela Mais fácil escrever código concorrente em Linguagens funcionais .
Compartilhar