Buscar

Linguagens-Funcionais1

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 .

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando