Haskell Seminário de Linguagens de Programação GUILHERME GOMES NEVES DE OLIVEIRA RENZO AUGUSTO LAPELLIGRINI PETRI
ROTEIRO <ul><li>Programação Funcional </li></ul><ul><li>Histórico </li></ul><ul><li>Definição </li></ul><ul><li>Arquitetur...
O que é Haskell ? <ul><li>Haskell  é uma linguagem de programação funcional </li></ul>
Paradigma Funcional <ul><li>É um paradigma de programação que trata a computação como uma avaliação de funções matemáticas...
Programação Funcional <ul><li>Um programa funcional é uma função que resolve um problema; </li></ul><ul><li>Programação fu...
Funcional X Imperativo <ul><li>Alto nível de abstração; </li></ul><ul><li>Programas mais simples; </li></ul><ul><li>Maior ...
Histórico 1930: Alonzo Church desenvolveu  o cálculo de  lambda , um simples, mas poderoso teorema de funções.
Histórico 1950: John McCarthy desenvolveu  Lisp , a primeira linguagem funcional, com influência da  teoria de lambda  mas...
Histórico 1970: Robin Milner e outros desenvolveram a   ML , a primeira linguagem funcional moderna, com introdução de inf...
Histórico 1987:
Histórico <ul><li>Em um encontro internacional, um comitê de pesquisadores iniciaram o  desenvolvimento de   uma linguagem...
<ul><li>O nome  Haskell  é uma homenagem ao pesquisador Haskell Brooks Curry, sendo o responsável pelo desenvolvimento da ...
Histórico
2003: O comitê publicou  Haskell 98 , definindo uma versão estável da linguagem. Histórico
Influência Haskell  foi fortemente influenciada por  ML Algol 60 Algol 68 ML Modula Pascal Haskell Lisp
Atualmente
Nova vida ? Usuários 1,000,000 1 100 10,000 1990 1995 2000 2005 2010
Definindo <ul><li>Haskell  é uma linguagem de programação funcional; </li></ul><ul><li>É um produto de código aberto com m...
Classificação <ul><li>Nível </li></ul><ul><ul><li>Alto Nível; </li></ul></ul><ul><li>Geração </li></ul><ul><ul><li>3ª Gera...
Arquitetura IDE Haskell (Kernel) Haskell Service (Modules) Interface Link Direto GHC (Compilador)
Kernel Haskell <ul><li>Haskell  adotou a possibilidade de inserções e retiradas das estruturas sintáticas e semânticas do ...
<ul><li>Estrutura sintática e semântica abstrata de Haskell, bem como a forma como se relaciona pode ser dividida em:  </l...
Estrutura do Programa Análise <ul><li>Legenda: </li></ul><ul><ul><li>Declarações; </li></ul></ul><ul><ul><li>Programa; </l...
Expressão <ul><li>Uma expressão é avaliada como um  valor  e tem um  tipo estático ; </li></ul><ul><li>Valores  e  tipos  ...
Namespaces <ul><li>Existem seis tipos de nomes em  Haskell : </li></ul><ul><ul><li>Os de  variáveis  e  construtores  deno...
Características Gerais <ul><li>Concisa: </li></ul><ul><ul><li>Programas escritos em linguagem funcionais tendem a ser mais...
Características Gerais <ul><li>Abstração poderosa: </li></ul><ul><ul><li>As funções de ordem elevada são um mecanismo de a...
Características <ul><li>Os programas escritos em  Haskel l são geralmente chamados de scripts, por isso a extensão normalm...
Características <ul><li>Resumindo as características de um programa em Haskell são: </li></ul><ul><li>Breves e legíveis; <...
Características <ul><li>Interpretada e/ou Compilada; </li></ul><ul><li>Alta portabilidade  </li></ul><ul><ul><li>Possui ve...
Por que Haskell ? <ul><li>Haskell oferece: </li></ul><ul><li>Simplificação de tarefas; </li></ul><ul><li>Menos erros e mai...
<ul><li>  É particularmente adequada para programas que precisam ser altamente modificáveis e de fácil manutenção; </li></...
Aplicações <ul><li>Computação simbólica; </li></ul><ul><li>Processamento de listas; </li></ul><ul><li>Aplicações Científic...
Softwares <ul><li>Fran (animation); </li></ul><ul><li>A Wiki page; </li></ul><ul><li>Haskore(music); </li></ul><ul><li>CGI...
Quem usa ? Microprocessor verification
Estrutura Léxica e Sintática
Module
Export
Definitions
Declaration Functions
Decls
Expression
Expr
Patroon
Type Typ
Context Classe
Literal Char
Var e outros
Simbols
Árvore de derivação <ul><li>O  parser  é o programa responsável pela análise da estrutura sintática; </li></ul><ul><li>Hug...
Sintaxe
Sintaxe <ul><li>Trabalha-se somente com funções, seus parâmetros e seus retornos; </li></ul><ul><li>É case-sensitive; </li...
Equivalência Matematicamente Haskell f(x) f(x,y) f(g(x)) f(x,g(y)) f(x)g(y) f x f x y f (g x) f x (g y) f x * g y
<ul><li>As regras de escopo em  Haskell  ditam que se uma expressão está na forma apresentada abaixo, o escopo do identifi...
<ul><li>Haskell permite á omissão de “{ }&quot; e &quot;;“  usando regra layout; </li></ul><ul><li>A regra de Layout entra...
Regras de Layout a = 10 b = 20 c = 30 a = 10 b = 20 c = 30 a = 10 b = 20 c = 30
a = b + c where b = 1 c = 2 d = a * 2 a = b + c where {b = 1; c = 2} d = a * 2 Implícito Explícito Regras de Layout =
O que é um TIPO? Um tipo é um nome para uma  coleção  de valores relacionados (propriedades em comum) Por exemplo, em  Has...
Tipos em Haskell e :: t <ul><li>Cada expressão bem formado tem um tipo, que é calculada automaticamente em tempo de compil...
Tipos Básicos Bool   True, False Char   'a', 'x', '�34', '
'  String   “oi”, “Sim” Int  0, 94, -45  Float   3.0, 0.54422  ...
Operadores Básicos > maior >= maior ou igual == igual /= diferente < menor <= menor  ou igual +  Soma -  Subtração *  Mult...
Tipo Lista Em geral: Uma  lista  é uma sequência de valores do mesmo tipo : [t]  é um tipo de litsta com elementos do tipo...
Operação com Listas <ul><li>Funções de operações de listas: </li></ul><ul><li>head [] </li></ul><ul><li>ghci> head [5,4,3,...
Operação com Listas length ghci> length [5,4,3,2,1]   5     reverse ghci> reverse [5,4,3,2,1]   [1,2,3,4,5]      elem ghci...
Operação com Listas ghci> [1..20]   [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]    ghci> ['a'..'z']   &quot;abcde...
Tuplas <ul><li>Tuplas  são usadas quando se sabe exatamente quantos elementos desejamos combinar, independente do seu tipo...
Funções ” x” é o nome da função. Os tipos dos 4 argumentos da função. O último tipo especificado identifica o tipo de dado...
Funções Guards é uma característica na definição de funções, que exploram a capacidade de se inserir condições que são uti...
Criando Funções É possivel criar suas próprias funções: Salvando a função como nome.hs é possível executá-la posteriorment...
Criando Funções É possível também chamar funções dentro de funções.   doubleUs y = x *2 + y *2 ghci> doubleUs 4 9   26   g...
Polimorfismo Há polimorfismo universal, a função possui um tipo genérico e a mesma definição é usada para vários tipos.  A...
Classes <ul><li>A definição de uma classe consiste em: </li></ul><ul><ul><li>  class <nome_da_classe> <tipo_de_entrada> wh...
Verificação de Tipos Tanto os compiladores quanto os interpretadores Haskell implementam o mecanismo de  checagem forte de...
Verificação de Tipos- Monomórficos <ul><li>f : : s -> t, onde a função f deve ser aplicada sobre um argumento de tipo s e ...
Verificação de Tipos- Monomórficos <ul><li>A verificação das expressões naturalmente acaba assumindo uma característica re...
Verificação de Tipos-  Polimórficos Para realizar a verificação de tipos em funções polimórficas, o Haskell lança mão do c...
Verificação de Tipos-  Polimórficos <ul><li>A função soma recebe dois argumentos que podem ser de tipos quaisquer, temos n...
Exemplos
Main
Declaração Os símbolos “—” “{-  -}” comentários. Declara uma nova função, especificando seu tipo. O símbolo :: pode ser li...
Condição Equação condicional, Os símbolo “|” , “=“ são utilizados para emular o comando de seleção. O valor à direita de “...
Cálculos <ul><li>Como cálculos são efetuados em Haskell? </li></ul>A comparação é feita com os valores de a e b, depois b ...
<ul><li>Exemplo envolvendo equação condicional: </li></ul>Cálculos maxx m n | m >= n  = m |  otherwise  = n maxx 7 4 = 7 >...
Quick Sort  em Haskell Se a lista é vazia, não há nada a ordenar . s é o 1 o  elemento da lista que é utilizado com pivo. ...
Interação Para escrever programas interativos que leem dados a partir do teclado e escrevem na tela, são necessários:  IO ...
HUGS <ul><li>HUGS </li></ul><ul><ul><li>Interpretador; </li></ul></ul><ul><ul><li>Escrito em C; </li></ul></ul><ul><ul><li...
GHC <ul><li>GHC </li></ul><ul><ul><li>Interpretador e Compilador; </li></ul></ul><ul><ul><li>Escrito em Haskell; </li></ul...
O Compilador: GHC <ul><li>O compilador em si é escrito inteiramente em Haskell. </li></ul><ul><li>Estrutura Geral </li></u...
O Compilador: GHC <ul><li>HscMain: </li></ul><ul><ul><li>Lida com a compilação de um único módulo; </li></ul></ul><ul><li>...
O GHC API <ul><li>Coordenam a compilação de vários módulos; </li></ul><ul><li>API GHC  suporta apenas um cliente que é na ...
Sequência <ul><li>Tags </li></ul><ul><ul><li>As  tags  especificam a localização da fonte de arquivos ou módulos no topo d...
Tipos de dados-chave <ul><li>A chave para a compreensão do GHC é compreender os seus tipos de dados-chave. </li></ul>
GHC : O Code Generator <ul><li>Storage Manager; </li></ul><ul><li>Generated Cmm Naming Convention; </li></ul><ul><li>Modul...
GHC : Storage Manager
GHC: A disposição dos objetos Heap <ul><li>Todos os objetos têm uma pilha de layout básico; </li></ul><ul><li>  O diagrama...
Tabelas Info <ul><li>A  tabela info  contém todas as informações do estado atual no tempo de execução: </li></ul>
Tabelas Info <ul><li>closure type </li></ul><ul><ul><li>É uma constante que descreve o tipo de fechamento (de função, de c...
Tabelas Info <ul><li>Alguns tipos de objeto adicionam mais campos ao final da tabela de informações, nome das funções, end...
Objetos Dinâmicos X Estáticos <ul><li>Objetos caem em duas categorias: </li></ul><ul><li>Dinâmica  : </li></ul><ul><ul><li...
Layout da pilha <ul><li>Cada objeto  TSO  contém uma pilha; </li></ul><ul><li>A pilha de um  TSO  cresce para baixo;  </li...
Layout da pilha O  SRT   = Campo de ponteiro para a tabela de referência estático (SRT);
Garbage Collection <ul><li>O  GC  é projetado para ser flexível, suportando muitas maneiras de ajustar o seu comportamento...
Alocador de Blocos <ul><li>O  alocador de blocos  é o responsável por prover a flexibilidade do GC; </li></ul><ul><li>É o ...
Alocador de Blocos <ul><li>Estrutura de blocos </li></ul><ul><li>Cada bloco possui um:  bloco descritor , que contém infor...
Garbage Collection <ul><li>A política de coleta de pilha é runtime-ajustável: </li></ul><ul><ul><li>Você pode selecionar o...
Garbage Collection - Estruturas <ul><li>Blocos e blocos Mega </li></ul><ul><li>O GC aloca memória do sistema operacional e...
Garbage Collection - Estruturas <ul><li>Passos </li></ul><ul><li>Gerações GHC são divididos em etapas; </li></ul><ul><li>A...
Garbage Collection - Estruturas
Garbage Collection - Estruturas
Espaço das Classes Normal Overlap Closed Local Normal Global Implicit Parameters Haskell GHC Methods Dependência local
 
Fluxograma Coerção
<ul><li>Escrito em C; </li></ul>YHC
verification : bytecode :: typechecking : source code YHC
YHC
DICAS <ul><li>Ao definir uma nova função em Haskell, é útil começar por escrever o seu tipo; </li></ul><ul><li>Dentro de u...
Avaliação <ul><li>Alta Flexibilidade : De acordo com a Tese de Church, todo e qualquer  problema resolvido imperativamente...
Haskell X Outras Linguagens <ul><li>Haskell separa a definição de um tipo a partir da definição dos métodos associados a e...
Haskell X Outras Linguagens <ul><li>C++ e Java anexam as informações de identificação (como um vtable) para a representaçã...
Comparação
Curiosidades <ul><li>Vídeos: </li></ul><ul><ul><li>http://www.youtube.com/watch?v=X4-212uMgy8 </li></ul></ul><ul><ul><li>h...
Curiosidades <ul><li>GHC 6.10.4  </li></ul><ul><ul><li>Compilador de Haskell; </li></ul></ul><ul><li>GHCi 6.10.4  </li></u...
Curiosidades <ul><li>Tratamento para Computação paralela: </li></ul>
Curiosidades
Vantagens <ul><li>Suporte à  simultaneidade  e  paralelismo ; </li></ul><ul><li>Apoiado por uma grande biblioteca de módul...
Vantagens <ul><li>Fortemente Tipada e Estática; </li></ul><ul><li>Avaliação Lazy; </li></ul><ul><li>Polimorfismo Universal...
Desvantagens <ul><li>Requer muita memória; </li></ul><ul><li>Execução lenta; </li></ul>
Conclusão <ul><li>Neste seminário tivemos a oportunidade de explanar os principais aspectos de implementação da linguagem ...
Bibliografia <ul><li>The Haskell Home Page: </li></ul><ul><ul><li>www.haskell.org </li></ul></ul><ul><li>Haskell Reference...
Dúvidas
Upcoming SlideShare
Loading in …5
×

Seminario haskell

8,740 views

Published on

Apresentação sobre a Linguagem de Programação Funcional Haskell.

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,740
On SlideShare
0
From Embeds
0
Number of Embeds
127
Actions
Shares
0
Downloads
0
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Seminario haskell

  1. 1. Haskell Seminário de Linguagens de Programação GUILHERME GOMES NEVES DE OLIVEIRA RENZO AUGUSTO LAPELLIGRINI PETRI
  2. 2. ROTEIRO <ul><li>Programação Funcional </li></ul><ul><li>Histórico </li></ul><ul><li>Definição </li></ul><ul><li>Arquitetura </li></ul><ul><li>Características </li></ul><ul><li>Aplicações </li></ul><ul><li>Estrutura Léxica e Sintática </li></ul><ul><li>Sintaxe </li></ul><ul><li>HUGS </li></ul><ul><li>GHC </li></ul><ul><li>YHC </li></ul><ul><li>Comparação </li></ul><ul><li>Curiosidades </li></ul><ul><li>Conclusão </li></ul><ul><li>Bibliografia </li></ul>
  3. 3. O que é Haskell ? <ul><li>Haskell é uma linguagem de programação funcional </li></ul>
  4. 4. Paradigma Funcional <ul><li>É um paradigma de programação que trata a computação como uma avaliação de funções matemáticas; </li></ul><ul><li>Mapeamento dos valores de entrada nos valores de retorno, através de funções; </li></ul><ul><li>Um programa funcional é uma única expressão, que é executado através da avaliação da expressão; </li></ul>inputs output  12 34 46
  5. 5. Programação Funcional <ul><li>Um programa funcional é uma função que resolve um problema; </li></ul><ul><li>Programação funcional é um “estilo” de programação, onde a idéia básica é computar argumentos por meio de funções; </li></ul><ul><li>Uma linguagem funcional é aquela que suporta a abstração dos problemas em funções; </li></ul><ul><li>Essa função pode envolver funções de várias variáveis e é descrito em uma anotação que obedece a princípios matemáticos; </li></ul><ul><li>O resultado da função é a solução do problema e está separado da entrada para a função; </li></ul>
  6. 6. Funcional X Imperativo <ul><li>Alto nível de abstração; </li></ul><ul><li>Programas mais simples; </li></ul><ul><li>Maior raciocínio sobre programas; </li></ul>sum =0; for(int i = 1; i < 11; i++ ) sum = sum + i; sum [1..10] O método de computação é por: variable assignment; ESTADO O método de computação é: function application VALORES
  7. 7. Histórico 1930: Alonzo Church desenvolveu o cálculo de lambda , um simples, mas poderoso teorema de funções.
  8. 8. Histórico 1950: John McCarthy desenvolveu Lisp , a primeira linguagem funcional, com influência da teoria de lambda mas aceitando atribuições de variáveis.
  9. 9. Histórico 1970: Robin Milner e outros desenvolveram a ML , a primeira linguagem funcional moderna, com introdução de inferência de tipos e tipos polimórficos.
  10. 10. Histórico 1987:
  11. 11. Histórico <ul><li>Em um encontro internacional, um comitê de pesquisadores iniciaram o desenvolvimento de uma linguagem puramente funcional; </li></ul><ul><li>Houve um forte consenso nessa reunião que o uso mais generalizado dessa classe de linguagens funcionais estava sendo prejudicado pela falta de uma linguagem comum; </li></ul><ul><li>O início do seu desenvolvimento remonta o ano de 1987, quando, numa conferência realizada em Amsterdã, a comunidade de programação funcional decidiu implementar uma linguagem puramente funcional. Para isso, foi designado um comitê responsável pela implementação do projeto; </li></ul>
  12. 12. <ul><li>O nome Haskell é uma homenagem ao pesquisador Haskell Brooks Curry, sendo o responsável pelo desenvolvimento da lógica matemática em que a linguagem se baseia. </li></ul>Histórico
  13. 13. Histórico
  14. 14. 2003: O comitê publicou Haskell 98 , definindo uma versão estável da linguagem. Histórico
  15. 15. Influência Haskell foi fortemente influenciada por ML Algol 60 Algol 68 ML Modula Pascal Haskell Lisp
  16. 16. Atualmente
  17. 17. Nova vida ? Usuários 1,000,000 1 100 10,000 1990 1995 2000 2005 2010
  18. 18. Definindo <ul><li>Haskell é uma linguagem de programação funcional; </li></ul><ul><li>É um produto de código aberto com mais de vinte anos de pesquisa de ponta, permitindo o desenvolvimento rápido de software; </li></ul><ul><li>Com um forte apoio para a integração com outras linguagens, construídos em simultaneidade e paralelismo , possuindo: </li></ul><ul><ul><li>Depuradores , “ profilers” ,  bibliotecas ricas e uma comunidade ativa; </li></ul></ul><ul><li>Haskell torna mais fácil de produzir software de alta qualidade flexível de manutenção; </li></ul><ul><li>Haskell é baseada no cálculo lambda , portanto, o símbolo, λ, é utilizado como parte do logotipo Haskell; </li></ul>
  19. 19. Classificação <ul><li>Nível </li></ul><ul><ul><li>Alto Nível; </li></ul></ul><ul><li>Geração </li></ul><ul><ul><li>3ª Geração; </li></ul></ul><ul><li>Paradigma </li></ul><ul><ul><li>Funcional; </li></ul></ul>
  20. 20. Arquitetura IDE Haskell (Kernel) Haskell Service (Modules) Interface Link Direto GHC (Compilador)
  21. 21. Kernel Haskell <ul><li>Haskell adotou a possibilidade de inserções e retiradas das estruturas sintáticas e semânticas do seu núcleo, podendo assim adaptá-la, pois realiza a simples tradução para/dessas construções. Se essas traduções são aplicadas de forma exaustiva, o resultado é um programa escrito em um pequeno subgrupo de Haskell que chamamos de Haskell  kernel ; </li></ul><ul><li>O kernel não é formalmente especificado, ele é essencialmente uma variante do cálculo lambda com uma semântica denotacional simples. A tradução de cada estrutura sintática é introduzido como a sintaxe do kernel; </li></ul><ul><li>Este projeto modular facilita o raciocínio sobre programas Haskell e fornece orientações úteis para os desenvolvedores da linguagem; </li></ul>
  22. 22. <ul><li>Estrutura sintática e semântica abstrata de Haskell, bem como a forma como se relaciona pode ser dividida em: </li></ul><ul><li>Nível 1 - Conjunto de  módulos : </li></ul><ul><ul><ul><li>Os módulos oferecem uma maneira para controlar namespaces ; </li></ul></ul></ul><ul><li>Nível 2 - Um módulo é composto de: </li></ul><ul><ul><ul><li>Uma coleção de  declarações(definições de tipos de dados, classes e tipo de informação; </li></ul></ul></ul><ul><li>Nível 3 - E xpressões : </li></ul><ul><ul><ul><li>Uma expressão denota um  valor  e tem um  tipo estático ; </li></ul></ul></ul><ul><ul><ul><li>Haskell é composto de expressões ; </li></ul></ul></ul><ul><li>Nível 4 - No nível mais baixo é a  estrutura léxica: </li></ul><ul><ul><ul><li>A estrutura lexica capta a representação concreta dos programas Haskell em arquivos de texto; </li></ul></ul></ul>Estrutura do Programa
  23. 23. Estrutura do Programa Análise <ul><li>Legenda: </li></ul><ul><ul><li>Declarações; </li></ul></ul><ul><ul><li>Programa; </li></ul></ul><ul><ul><li>Módulos; </li></ul></ul><ul><ul><li>Léxico; </li></ul></ul>
  24. 24. Expressão <ul><li>Uma expressão é avaliada como um  valor  e tem um tipo estático ; </li></ul><ul><li>Valores e tipos NÃO são misturados em Haskell; </li></ul><ul><li>No entanto, HASKELL permite: </li></ul><ul><ul><li>Definir tipos de dados pelo usuário; </li></ul></ul><ul><ul><li>Polimorfismo paramétrico; </li></ul></ul><ul><ul><li>Sobrecarga  (usando  tipo classes ); </li></ul></ul><ul><li>Erros em Haskell: </li></ul><ul><ul><li>Tratados por exceções; </li></ul></ul><ul><ul><li>Tecnicamente, eles não são distinguíveis nontermination ; </li></ul></ul><ul><li>No entanto, o compilador(GHC) provavelmente vai tentar fornecer informações úteis sobre os erros; </li></ul>TIPO VALOR
  25. 25. Namespaces <ul><li>Existem seis tipos de nomes em Haskell : </li></ul><ul><ul><li>Os de  variáveis  e  construtores  denotam valores; </li></ul></ul><ul><ul><li>Tipo de Variáveis ,  Tipo de construtores e  Tipo de classes referem-se a entidades ligadas ao sistema de tipos; </li></ul></ul><ul><ul><li>Nomes de módulos  referem-se a módulos; </li></ul></ul><ul><li>Existem duas restrições à nomeação : </li></ul><ul><ul><li>Os nomes de variáveis e variáveis de tipo são identificadores que começam com letras minúsculas ou sublinhado; </li></ul></ul><ul><ul><li>Os outros quatro tipos de nomes são identificadores que começam com letras maiúsculas; </li></ul></ul><ul><li>Um identificador não deve ser usado como o nome de um construtor de tipo e uma classe no mesmo escopo; </li></ul>
  26. 26. Características Gerais <ul><li>Concisa: </li></ul><ul><ul><li>Programas escritos em linguagem funcionais tendem a ser mais concisos do que os seus equivalentes em linguagens imperativas. De uma forma geral a redução em linhas de código pode variar numa razão de 2 a 10; </li></ul></ul><ul><li>Fácil compreensão; </li></ul><ul><li>Forte sistema de tipo: </li></ul><ul><ul><li>Haskell é fortemente tipada , eliminando uma grande quantidade de erros comuns durante a compilação. De uma forma geral, um sistema de tipo permite que o programador indique à piori como devem ser tratados os dados, associado-os a um tipo. Com um forte sistema de tipos não existe, por exemplo, a possibilidade de tratar um inteiro como um apontador ou seguir um apontador nulo. </li></ul></ul><ul><li>Avaliação lazy : </li></ul><ul><ul><li>Muitas linguagens funcionais só avaliam as partes do programa que são necessárias para o cálculo que é efetuado. Designa-se a este tipo de avaliação por lazy . As estruturas de dados, como as listas, são avaliadas só até onde for necessário podendo haver partes delas que nem são avaliadas. </li></ul></ul>
  27. 27. Características Gerais <ul><li>Abstração poderosa: </li></ul><ul><ul><li>As funções de ordem elevada são um mecanismo de abstração que é oferecido pelas linguagens funcionais. Consiste em poder usar funções como argumentos, parâmetros de saída, armazenamento em estruturas de dados e qualquer outra operação que possa ser efetuada com valores de qualquer tipo de dados. A principal vantagem é que a utilização de funções de ordem elevada pode aumentar bastante a estrutura e modularidade de muitos programas. </li></ul></ul><ul><li>Gestão automática de memória: </li></ul><ul><ul><li>Muitos programas precisam alocar memória dinamicamente na heap . Em C utilizam-se funções específicas (malloc) para alocar o espaço e inicializá-lo. O programador é também responsável por liberar a área alocada, caso contrário está sujeito à ocorrência de apontadores vazios. As linguagens funcionais libertam o programador destas tarefas e semelhante ao Java possuem mecanismos de garbage collector que se encarregam de assumir toda a gestão de memória de forma automática. </li></ul></ul>
  28. 28. Características <ul><li>Os programas escritos em Haskel l são geralmente chamados de scripts, por isso a extensão normalmente é “hs” (haskell scripts); </li></ul><ul><li>Haskell prioriza o tempo do programador em relação ao da CPU; </li></ul><ul><li>Módulos permitem um crescimento linear dos projetos com Haskell; </li></ul><ul><li>Avaliação lazy </li></ul><ul><ul><li>Avaliação com necessidade; </li></ul></ul>
  29. 29. Características <ul><li>Resumindo as características de um programa em Haskell são: </li></ul><ul><li>Breves e legíveis; </li></ul><ul><li>Baseiam-se no cálculo lambda; </li></ul><ul><li>Sem dump de memória ; </li></ul><ul><li>Grande reusabilidade de código; </li></ul><ul><li>Poderosas abstrações; </li></ul>
  30. 30. Características <ul><li>Interpretada e/ou Compilada; </li></ul><ul><li>Alta portabilidade </li></ul><ul><ul><li>Possui versões pra todos os sistemas operacionais mais usados atualmente; </li></ul></ul><ul><li>GHC: É o compilador mais usado. É o mais rápido e suporta compilação incremental; </li></ul><ul><li>HUGS : É o interpretador mais usado. </li></ul><ul><li>Outras ferramentas: YHC , nhc98, HBI, HBC, Helium, dentre outras; </li></ul>
  31. 31. Por que Haskell ? <ul><li>Haskell oferece: </li></ul><ul><li>Simplificação de tarefas; </li></ul><ul><li>Menos erros e maior confiabilidade; </li></ul><ul><li>Um menor &quot;gap semântico &quot; entre o programador e a linguagem; </li></ul><ul><li>Haskell é uma linguagem de amplo espectro, apropriado para uma variedade de aplicações. </li></ul>
  32. 32. <ul><li>  É particularmente adequada para programas que precisam ser altamente modificáveis e de fácil manutenção; </li></ul><ul><li>Grande parte da vida do produto de software é gasto em  especificação ,  projeto  e  manutenção , e não em  programação ; </li></ul><ul><li>Linguagens funcionais são excelentes para escrever especificações que podem realmente ser executadas (e, portanto testado e depurado); </li></ul><ul><ul><li>Essa especificação então  é  o primeiro protótipo do programa final; </li></ul></ul><ul><li>Existe um controle rigoroso de efeitos colaterais eliminando uma enorme classe de interações imprevisíveis; </li></ul>Por que Haskell ?
  33. 33. Aplicações <ul><li>Computação simbólica; </li></ul><ul><li>Processamento de listas; </li></ul><ul><li>Aplicações Científicas; </li></ul><ul><li>Aplicações de IA: </li></ul><ul><ul><li>Sistemas Especialistas; </li></ul></ul><ul><ul><li>Representação de conhecimento; </li></ul></ul><ul><ul><li>Processamento de linguagem natural; </li></ul></ul><ul><li>Fins acadêmicos; </li></ul><ul><li>Jogos; </li></ul><ul><li>Compiladores; </li></ul>
  34. 34. Softwares <ul><li>Fran (animation); </li></ul><ul><li>A Wiki page; </li></ul><ul><li>Haskore(music); </li></ul><ul><li>CGI programming in Haskell; </li></ul><ul><li>Happy </li></ul><ul><ul><li>(Parse Generator); </li></ul></ul><ul><li>Derive </li></ul><ul><ul><li>(Automatic derivation of classes from data declarations); </li></ul></ul><ul><li>Tk Gofer </li></ul><ul><ul><li>(The Tk GUI library ported to Go Gofer, linguagem similar ao Haskell); </li></ul></ul>
  35. 35. Quem usa ? Microprocessor verification
  36. 36. Estrutura Léxica e Sintática
  37. 37. Module
  38. 38. Export
  39. 39. Definitions
  40. 40. Declaration Functions
  41. 41. Decls
  42. 42. Expression
  43. 43. Expr
  44. 44. Patroon
  45. 45. Type Typ
  46. 46. Context Classe
  47. 47. Literal Char
  48. 48. Var e outros
  49. 49. Simbols
  50. 50. Árvore de derivação <ul><li>O parser é o programa responsável pela análise da estrutura sintática; </li></ul><ul><li>Hugs é o parser para Haskell; </li></ul>2  3+4 = 4 + 2  3 2
  51. 51. Sintaxe
  52. 52. Sintaxe <ul><li>Trabalha-se somente com funções, seus parâmetros e seus retornos; </li></ul><ul><li>É case-sensitive; </li></ul><ul><li>Não possui comandos de repetição como While e For; </li></ul><ul><li>Sem limites para identificadores; </li></ul>
  53. 53. Equivalência Matematicamente Haskell f(x) f(x,y) f(g(x)) f(x,g(y)) f(x)g(y) f x f x y f (g x) f x (g y) f x * g y
  54. 54. <ul><li>As regras de escopo em Haskell ditam que se uma expressão está na forma apresentada abaixo, o escopo do identificador vi é o mesmo de e, assim como todos do lado direito de todas as definições de let . </li></ul>Regra de Escopo let v1 = e1 v2 = e2 ... vi = ei ... in e Escopo de vi: Parte do programa onde vi possui valor = ei
  55. 55. <ul><li>Haskell permite á omissão de “{ }&quot; e &quot;;“ usando regra layout; </li></ul><ul><li>A regra de Layout entra em vigor quando existe a omissão de chaves antes de : </li></ul><ul><ul><li>“ where”, </li></ul></ul><ul><ul><li>“ let” </li></ul></ul><ul><ul><li>“ do” </li></ul></ul><ul><ul><li>“ of”. </li></ul></ul>Regras de Layout
  56. 56. Regras de Layout a = 10 b = 20 c = 30 a = 10 b = 20 c = 30 a = 10 b = 20 c = 30
  57. 57. a = b + c where b = 1 c = 2 d = a * 2 a = b + c where {b = 1; c = 2} d = a * 2 Implícito Explícito Regras de Layout =
  58. 58. O que é um TIPO? Um tipo é um nome para uma coleção de valores relacionados (propriedades em comum) Por exemplo, em Haskell , um tipo básico é: True Bool False
  59. 59. Tipos em Haskell e :: t <ul><li>Cada expressão bem formado tem um tipo, que é calculada automaticamente em tempo de compilação usando um processo chamado inferência de tipos . </li></ul>Usamos a notação: e :: T para indicar que a avaliação da expressão produz um valor do tipo T .
  60. 60. Tipos Básicos Bool True, False Char 'a', 'x', '34', ' ' String “oi”, “Sim” Int 0, 94, -45 Float 3.0, 0.54422 Double 3.1415 Bool - Valores Lógicos Char - Caracteres simples Integer - Inteiros de precisão arbitrária Float - Números de ponto flutuante String - String de caracteres Int - Inteiros de precisão fixa
  61. 61. Operadores Básicos > maior >= maior ou igual == igual /= diferente < menor <= menor ou igual + Soma - Subtração * Multiplicação ^ Potência div Divisão inteira mod resto da divisão abs valor absoluto de um inteiro negate troca o sinal do valor && e | | ou not negação
  62. 62. Tipo Lista Em geral: Uma lista é uma sequência de valores do mesmo tipo : [t] é um tipo de litsta com elementos do tipo t . [1,2,3,4] :: [Int] [False,True,False] :: [Bool] [‘a’,’b’,’e’] :: [Char]
  63. 63. Operação com Listas <ul><li>Funções de operações de listas: </li></ul><ul><li>head [] </li></ul><ul><li>ghci> head [5,4,3,2,1]   </li></ul><ul><li>5   </li></ul><ul><li>tail </li></ul><ul><li>ghci> tail [5,4,3,2,1]   </li></ul><ul><li>[4,3,2,1]    </li></ul><ul><li>  </li></ul><ul><li>last </li></ul><ul><li>ghci> last [5,4,3,2,1]   </li></ul><ul><li>1  </li></ul><ul><li>init </li></ul><ul><li>ghci> init [5,4,3,2,1]   </li></ul><ul><li>[5,4,3,2]    </li></ul><ul><li>  </li></ul><ul><li>  </li></ul><ul><li>  </li></ul>Retorna o primeiro elemento da lista. Retorna a calda da lista, ou, não exibe o primeiro elemento. Retorna o último elemento da lista. Retorna todos os elementos da lista menos o último.
  64. 64. Operação com Listas length ghci> length [5,4,3,2,1]   5     reverse ghci> reverse [5,4,3,2,1]   [1,2,3,4,5]      elem ghci> 4 `elem` [3,4,5,6]   True   ghci> 10 `elem` [3,4,5,6]   False          Retorna o comprimento da lista. Inverte os elementos da lista. Verifica se um elemento está presente na lista.  
  65. 65. Operação com Listas ghci> [1..20]   [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]    ghci> ['a'..'z']   &quot;abcdefghijklmnopqrstuvwxyz“    ghci> ['K'..'Z']   &quot;KLMNOPQRSTUVWXYZ&quot;               Selecionando intervalo de elementos em listas.  
  66. 66. Tuplas <ul><li>Tuplas são usadas quando se sabe exatamente quantos elementos desejamos combinar, independente do seu tipo. </li></ul><ul><li>first </li></ul><ul><li>ghci> fst (8,11)   </li></ul><ul><li>8   </li></ul><ul><li>ghci> fst (&quot;Wow&quot;, False)   </li></ul><ul><li>&quot;Wow&quot; </li></ul><ul><li>zip </li></ul><ul><li>ghci> zip [1,2,3,4,5] [5,5,5,5,5]   </li></ul><ul><li>[(1,5),(2,5),(3,5),(4,5),(5,5)]   </li></ul><ul><li>ghci> zip [1 .. 5] [&quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;four&quot;, &quot;five&quot;]   </li></ul><ul><li>[(1,&quot;one&quot;),(2,&quot;two&quot;),(3,&quot;three&quot;),(4,&quot;four&quot;),(5,&quot;five&quot;)] </li></ul>Recebe um par e retorna o primeiro elemento.   Podem conter combinação de vários tipos .   Utilizado para combinar os elementos de duas listas.
  67. 67. Funções ” x” é o nome da função. Os tipos dos 4 argumentos da função. O último tipo especificado identifica o tipo de dado a ser retornado. <ul><li>As definições de funções em Haskell podem ser feitas por meio de uma sequência de equações. </li></ul><ul><li><nome da função ><corpo> </li></ul><ul><li>x : : Int -> Int -> Float -> Bool -> Int </li></ul>add :: Int -> Int -> int add x y = x + y
  68. 68. Funções Guards é uma característica na definição de funções, que exploram a capacidade de se inserir condições que são utilizadas como alternativas para a função. guard. <ul><li>A função max retorna o maior valor entre dois números. </li></ul><ul><li>max : : Int -> Int -> Int </li></ul><ul><li>max x y </li></ul><ul><li>| x >= y = x se x >= y então retorne x </li></ul><ul><li>| otherwise = y caso contrário, retorne y </li></ul>
  69. 69. Criando Funções É possivel criar suas próprias funções: Salvando a função como nome.hs é possível executá-la posteriormente. <ul><li>Função que recebe um número e multiplica ele por dois: </li></ul><ul><li>doubleMe x = x + x </li></ul>ghci> nome:   [1  de  1] Compilando principal              (nome.hs, interpretado)   Ok, módulos carregados: Main.   ghci> doubleMe 9   18   ghci> doubleMe 8,3   16,6  A mesma pode ser utilizada com números de qualquer tipo.
  70. 70. Criando Funções É possível também chamar funções dentro de funções. doubleUs y = x *2 + y *2 ghci> doubleUs 4 9   26   ghci> doubleUs 2,3 34,2   73,0   ghci> doubleUs 28 88 + doubleMe 123   478   Sendo assim é possível redefinir uma função. doubleUs x y = doubleMe x + y doubleMe  
  71. 71. Polimorfismo Há polimorfismo universal, a função possui um tipo genérico e a mesma definição é usada para vários tipos. A função length pode retornar tanto o tamanho de uma String, quanto de uma Lista. <ul><li>Basta declarar e definir as funções com o mesmo nome, porém com os argumentos próprios para cada objetivo: </li></ul><ul><li>length : : String -> Int </li></ul><ul><li>length : : [a] -> Int </li></ul>
  72. 72. Classes <ul><li>A definição de uma classe consiste em: </li></ul><ul><ul><li> class <nome_da_classe> <tipo_de_entrada> where </li></ul></ul><ul><ul><li> <assinatura da classe> </li></ul></ul><ul><li>Exemplo: </li></ul><ul><li>Class V a where </li></ul><ul><li>toString a : : a -> String </li></ul><ul><li>size a : : a -> Int </li></ul>Haskell permite que o usuário, programador, crie alguns outros tipos denominados Classes, que funcionam como tipos de dados abstratos. O usuário tem total liberdade para definir inúmeros tipos de classes diferentes. A assinatura da classe define as funções que poderão ser aplicadas aquela classe. ” a” é uma variável que representa qualquer tipo de dado. “ V” é o nome da classe.
  73. 73. Verificação de Tipos Tanto os compiladores quanto os interpretadores Haskell implementam o mecanismo de checagem forte de tipos de dados , devido a tamanha variedade de tipos. Monomórfico Polimórfico
  74. 74. Verificação de Tipos- Monomórficos <ul><li>f : : s -> t, onde a função f deve ser aplicada sobre um argumento de tipo s e resultar numa expressão do tipo t. </li></ul>A checagem de tipos monomórficos, isto é, sem polimorfismo. ” e” é uma expressão que pode ser um literal, uma variável ou constante, ou pode ser construído aplicando uma função sobre seus argumentos, que são cada um também expressões.
  75. 75. Verificação de Tipos- Monomórficos <ul><li>A verificação das expressões naturalmente acaba assumindo uma característica recursiva; </li></ul><ul><li>O analisador de expressões do compilador/interpretador deve descobrir o que pode ser uma expressão em Haskell e expandir numa árvore até que se obtenha a mais simples declaração dos tipos. </li></ul><ul><li>Com esta informação, basta aplicar as regras que estão descritas na definição da própria função e compará-las com os tipos de dados informados na expressão raiz. </li></ul><ul><li>Deve-se considerar os quesitos: </li></ul><ul><li>- o valor ei retornado deve ser do tipo t; </li></ul><ul><li>- p padrão de argumentos pj deve ser consistente com os tipos ti indicados na assinatura da função; </li></ul>
  76. 76. Verificação de Tipos- Polimórficos Para realizar a verificação de tipos em funções polimórficas, o Haskell lança mão do conceito de unificação . Assim como em linguagens lógicas, uma unificação ocorre quando o analisador de expressões do compilador/interpretador consegue determinar quais variáveis assumirão um determinado argumento genérico, e também de qual tipo dedado será este argumento.
  77. 77. Verificação de Tipos- Polimórficos <ul><li>A função soma recebe dois argumentos que podem ser de tipos quaisquer, temos nos exemplos a chamada da função com tipos de dados inteiros e também com tipos de ponto flutuante. </li></ul><ul><li>Realizar a unificação sobre esta função significa que, ao chamar soma, o primeiro argumento &quot;fecha&quot; com a, o segundo com b e o resultado com c. </li></ul><ul><li>Isto permite descobrir como posicionar os argumentos para uma função polimórfica. Agora vejamos um caso mais complexo. Considere a função f abaixo: </li></ul><ul><li>f : : (a -> b) -> [a] -> [b] </li></ul><ul><li>Ao chamar f com parâmetros Char -> Int, a unifica com Char e b com Int. Isto vale para toda a expressão, assim teremos: </li></ul><ul><li> f : : (Char -> Int) -> [Char] -> [Int] </li></ul><ul><li>Note como o Haskell avalia expressões polimórficas, e também o custo adicionado para realizar o processo de unificação. </li></ul>
  78. 78. Exemplos
  79. 79. Main
  80. 80. Declaração Os símbolos “—” “{- -}” comentários. Declara uma nova função, especificando seu tipo. O símbolo :: pode ser lido como “é do tipo...&quot; Determina que valor tem o valor 35. Determina que square é uma função de Int para Int . Equação que define a função. Define o resultado, x*x , da aplicação de square sobre x (argumento). Nomes de funções começam com letras minúsculas. Nomes de tipos começam com letras maiúsculas. 1 {----------------------------} 2 -- example.hs 3 ---------------------------- 4 valor :: Int 5 valor = 35 6 7 square :: Int -> Int 8 square x = x * x 9
  81. 81. Condição Equação condicional, Os símbolo “|” , “=“ são utilizados para emular o comando de seleção. O valor à direita de “=“ é retornado se a condição for verdadeira. Determina que mystery é um função que recebe 3 Objetos Int e retorna True ou False Determina que maxx é uma função que recebe 2 objetos Int e retorna Int . <ul><li>1 {---------------------------- </li></ul><ul><li>2 -- example.hs </li></ul><ul><li>----------------------------} </li></ul><ul><li>4 mystery :: Int -> Int -> Int -> Bool </li></ul><ul><li>5 mystery a b c = (a==b) && (b==c) </li></ul><ul><li>6 </li></ul><ul><li>7 maxx :: Int -> Int -> Int </li></ul><ul><li>8 maxx m n </li></ul><ul><li>9 | m >= n = m </li></ul><ul><li>10 | otherwise = n </li></ul>
  82. 82. Cálculos <ul><li>Como cálculos são efetuados em Haskell? </li></ul>A comparação é feita com os valores de a e b, depois b com c o resultado é a comparação da 1 ˚ sentença com a segunda. mystery a b c = (a == b) && (b == c) mystery 5 8 8 = (5==8) && (8==8) = False && True = False mystery 9 9 9 = (9==9) && (9 == 9) = True && True = True
  83. 83. <ul><li>Exemplo envolvendo equação condicional: </li></ul>Cálculos maxx m n | m >= n = m | otherwise = n maxx 7 4 = 7 >= 4 = True = 7 maxx 12 45 = 12 >= 45 = False = otherwise = True = 45
  84. 84. Quick Sort em Haskell Se a lista é vazia, não há nada a ordenar . s é o 1 o elemento da lista que é utilizado com pivo. xs representa o restante da lista. A lista restante é dividida em 2 partes: a primeira contém apenas os elementos de xs que são menores ou igual a s. A segunda, contém apenas os elementos de xs que são maiores. As duas listas são ordenadas recursivamente e o resultado é obtido concatenando a primeira lista (ordenada), com a lista que contém s e a segunda lista (ordenada.) qsort [] = [] qsort ( s : xs ) = qsort [ x | x <- xs , x < s] ++ [s] ++ qsort [ x|x <- xs, x >= s ]
  85. 85. Interação Para escrever programas interativos que leem dados a partir do teclado e escrevem na tela, são necessários: IO Programas interativos podem ser escritos em Haskell usando tipos que podem envolver efeitos colaterais - IO . interactive program inputs outputs keyboard screen
  86. 86. HUGS <ul><li>HUGS </li></ul><ul><ul><li>Interpretador; </li></ul></ul><ul><ul><li>Escrito em C; </li></ul></ul><ul><ul><li>Portável; </li></ul></ul><ul><ul><li>Leve; </li></ul></ul><ul><ul><li>Ideal para iniciantes; </li></ul></ul>
  87. 87. GHC <ul><li>GHC </li></ul><ul><ul><li>Interpretador e Compilador; </li></ul></ul><ul><ul><li>Escrito em Haskell; </li></ul></ul><ul><ul><li>Menos portável; </li></ul></ul><ul><ul><li>Mais lento; </li></ul></ul><ul><ul><li>Exige mais memória; </li></ul></ul><ul><ul><li>Produz programas mais rápidos; </li></ul></ul>
  88. 88. O Compilador: GHC <ul><li>O compilador em si é escrito inteiramente em Haskell. </li></ul><ul><li>Estrutura Geral </li></ul><ul><li>Diagrama de blocos da sua estrutura de alto nível </li></ul><ul><li>GHC é empacotado como um binário único; </li></ul><ul><li>GHC é compilado, sem o seu front-ends , como uma  biblioteca; </li></ul><ul><li>Pode ser importado por qualquer front-ends de programas Haskell. </li></ul>
  89. 89. O Compilador: GHC <ul><li>HscMain: </li></ul><ul><ul><li>Lida com a compilação de um único módulo; </li></ul></ul><ul><li>Gerente de compilação:   </li></ul><ul><ul><li>Gerencia a compilação de vários módulos; </li></ul></ul><ul><ul><li>Ela possui uma interface chamada de  API GHC ;  </li></ul></ul><ul><li>GHCi: </li></ul><ul><ul><li>Ambiente interativo, é implementado no  compilador / ghci / InteractiveUI.hs  ; </li></ul></ul><ul><li>Make: </li></ul><ul><ul><li>É um cliente da API do GHC, e é executada em  compilador / main / Main.hs ; </li></ul></ul><ul><li>M: </li></ul><ul><ul><li>Gerador de dependência Makefile , também é cliente da API do GHC, e é implementado no  compilador / main / DriverMkDepend.hs ; </li></ul></ul><ul><li>&quot;one-shot mode“ : </li></ul><ul><ul><li>Onde o GHC compila cada arquivo na linha de comando em separado (por exemplo , Foo.hs c GHC); </li></ul></ul><ul><ul><li>  Este modo ignora a API do GHC; </li></ul></ul>
  90. 90. O GHC API <ul><li>Coordenam a compilação de vários módulos; </li></ul><ul><li>API GHC suporta apenas um cliente que é na verdade a execução do código; </li></ul><ul><li>A sequência típica da API do GHC é algo como o seguinte: </li></ul><ul><ul><li>Criar uma nova sessão:  newSession; </li></ul></ul><ul><ul><li>Definir os flags:  getSessionDynFlags, setSessionDynFlags; </li></ul></ul><ul><ul><li>Adicione algumas  tags :  setTargets, addTarget, guessTarget; </li></ul></ul><ul><ul><li>Realizar  Análise de dependência :  depanal; </li></ul></ul><ul><ul><li>Load (compile) os arquivos de origem:  load ; </li></ul></ul>
  91. 91. Sequência <ul><li>Tags </li></ul><ul><ul><li>As tags especificam a localização da fonte de arquivos ou módulos no topo da árvore de dependência; </li></ul></ul><ul><li>Análise de dependência </li></ul><ul><ul><li>A fase de análise de dependência determina todos os arquivos fonte Haskell que vão ser compilados ou carregados na sessão atual, percorrendo as dependências transitivas das tags . </li></ul></ul><ul><ul><li>  Este processo é chamado de  downsweep  porque estamos atravessando a árvore de dependência das metas; </li></ul></ul><ul><li>Carregando (compilação) dos Módulos </li></ul><ul><ul><li>Quando a análise de dependência é completa, os módulos são carregados chamando load ; </li></ul></ul><ul><ul><li>Finalmente, todo os objetcs codes são carregados junto com os byte-code, todos juntos na memória;  </li></ul></ul><ul><ul><li>Chama-se o linker Link externo para gerar o código objeto em um binário; </li></ul></ul>
  92. 92. Tipos de dados-chave <ul><li>A chave para a compreensão do GHC é compreender os seus tipos de dados-chave. </li></ul>
  93. 93. GHC : O Code Generator <ul><li>Storage Manager; </li></ul><ul><li>Generated Cmm Naming Convention; </li></ul><ul><li>Modules; </li></ul><ul><li>Memory and Register Management; </li></ul><ul><li>Function Calls and Parameter Passing ; </li></ul><ul><li>Special runtime support ; </li></ul>
  94. 94. GHC : Storage Manager
  95. 95. GHC: A disposição dos objetos Heap <ul><li>Todos os objetos têm uma pilha de layout básico; </li></ul><ul><li>  O diagrama abaixo mostra o layout de um objeto de heap : </li></ul><ul><li>Um objeto de heap sempre começa com um  cabeçalho ; </li></ul><ul><li>O cabeçalho é o  ponteiro de informações , que aponta para a tabela de informação; </li></ul><ul><li>O compilador precisa saber o layout de objetos de heap, essa informação é passada para o compilador em tempo de execução </li></ul>
  96. 96. Tabelas Info <ul><li>A tabela info contém todas as informações do estado atual no tempo de execução: </li></ul>
  97. 97. Tabelas Info <ul><li>closure type </li></ul><ul><ul><li>É uma constante que descreve o tipo de fechamento (de função, de conversão, o construtor, etc.) ; </li></ul></ul><ul><li>SRT bitmap </li></ul><ul><ul><li>Campo é utilizado para apoiar o Garbage Collection ; </li></ul></ul><ul><li>Layout: </li></ul><ul><ul><li>Campo descreve o layout da carga para o Memory Manager ; </li></ul></ul>
  98. 98. Tabelas Info <ul><li>Alguns tipos de objeto adicionam mais campos ao final da tabela de informações, nome das funções, endereços de retorno; </li></ul><ul><li>Note que a tabela de informação é imediatamente seguido pelo código de entrada. Isto reduz o tamanho da tabela de informações e elimina uma ponteiro indireto para o código de entrada; </li></ul>
  99. 99. Objetos Dinâmicos X Estáticos <ul><li>Objetos caem em duas categorias: </li></ul><ul><li>Dinâmica  : </li></ul><ul><ul><li>Objetos residem no heap , e pode ser movido pelo coletor de lixo; </li></ul></ul><ul><ul><li>Objetos dinâmicos têm um tamanho mínimo, pois cada objeto deve ser grande o suficiente para ser substituído por um ponteiro de encaminhamento ( Forwarding pointers ) durante a GC; </li></ul></ul><ul><li>Estático: </li></ul><ul><ul><li>Objetos residem no código objeto compilado; </li></ul></ul><ul><ul><li>Eles nunca são movidos, porque os ponteiros para objetos estão espalhadas através do código objeto; </li></ul></ul><ul><ul><li>Objetos estáticos têm um campo adicional, chamado de  campo link estático . O campo de link estático é usado pela GC link para todos os objetos estáticos em uma lista, e assim que ele pode dizer se ela tem visitado um determinado objeto estático ou não; </li></ul></ul><ul><li>Para saber se um determinado objeto é estático ou dinâmico, usa-se a macro HEAP_ALLOCED ()  ; </li></ul>
  100. 100. Layout da pilha <ul><li>Cada objeto TSO  contém uma pilha; </li></ul><ul><li>A pilha de um TSO cresce para baixo; </li></ul><ul><li>A pilha consiste de uma sequência de  quadros de pilha  (às vezes também chamados  registros de ativação ), onde cada quadro tem o mesmo layout como um objeto de heap: </li></ul><ul><li>Objeto  TSO  é: </li></ul><ul><ul><li>uma Thread do estado do objeto; </li></ul></ul><ul><ul><li>  Ele representa o estado completo de um segmento, incluindo a sua stack; </li></ul></ul>
  101. 101. Layout da pilha O  SRT   = Campo de ponteiro para a tabela de referência estático (SRT);
  102. 102. Garbage Collection <ul><li>O GC é projetado para ser flexível, suportando muitas maneiras de ajustar o seu comportamento; </li></ul><ul><li>GC Geracional, com um número selecionável de gerações em tempo de execução: </li></ul><ul><ul><li>(G + RTS-<n>-RTS, onde n> = 1). </li></ul></ul><ul><ul><li>Atualmente ele é um colecionador de gerações tradicional, onde cada coleta recolhe uma determinada geração e as gerações mais jovens. </li></ul></ul><ul><li>A pilha cresce em armazenamento de um   alocador de blocos ; </li></ul>
  103. 103. Alocador de Blocos <ul><li>O alocador de blocos é o responsável por prover a flexibilidade do GC; </li></ul><ul><li>É o gestor de armazenamento; </li></ul><ul><li>Ao invés de manter a nossa pilha em uma única região contígua de memória, ou uma região contígua por geração, conseguimos listas ligadas de blocos de memória; </li></ul><ul><li>Gerenciar regiões contíguas é difícil, especialmente quando você quiser mudar o tamanho de algumas áreas. Um arranjo de armazenamento de bloco-estruturada tem várias vantagens: </li></ul><ul><ul><li>Redimensionamento áreas de memória é fácil: basta mais blocos para a lista; </li></ul></ul><ul><ul><li>Gerenciamento de objetos grandes, sem copiar é fácil: atribuir a cada uma um bloco completo, e usar o bloco de ligação para a cadeia juntos; </li></ul></ul><ul><ul><li>Memória livre pode ser reciclado mais rapidamente, porque é um bloco de um bloco; </li></ul></ul><ul><ul><li>O conceito baseia-se na propriedade que a maioria dos objetos de dados são significativamente menores que um bloco, e só raramente precisamos alocar objetos que se aproximam ou excedem o tamanho de um bloco. </li></ul></ul>
  104. 104. Alocador de Blocos <ul><li>Estrutura de blocos </li></ul><ul><li>Cada bloco possui um: bloco descritor , que contém informações sobre o bloco: o seu campo de ligação, que a geração a que pertence, e assim por diante. Isso é semelhante ao conhecido técnica &quot;BiBOP&quot; (Big Bag de paginação), onde os objetos com marcas semelhantes são reunidos em uma página de modo a evitar a necessidade de armazenar uma etiqueta individual com cada objeto. </li></ul><ul><li>Megablocks de 1Mb de tamanho (m = 20) com blocos de 4k de tamanho (k = 12) </li></ul>
  105. 105. Garbage Collection <ul><li>A política de coleta de pilha é runtime-ajustável: </li></ul><ul><ul><li>Você pode selecionar o tamanho de uma geração começa antes que ele seja coletado por meio doRTS + F-<n>-RTS opção, onde <n> é um fator de geração, o tamanho da última vez que foi coletada. O valor padrão é 2, que é uma geração é permitido dobrar de tamanho, antes de serem recolhidos; </li></ul></ul><ul><li>O GC é uma única thread: </li></ul><ul><ul><li>  Quando o RTS detecta a pressão de memória GC para todos os tópicos Haskell e um segmento que faz a coleta de lixo e, em seguida, reinicia todos os outros segmentos suspenso; </li></ul></ul><ul><li>Gerações </li></ul><ul><li>O GC GHC é um colecionador de gerações. O número de gerações é definido como 2 por padrão e que são referidos como gen 0 e gen 1. gen 0 tem novos objetos, objetos que sobrevivem a coletas de Gen 0 são promovidos a um gen. Objetos antigos residir no gen 1. </li></ul>
  106. 106. Garbage Collection - Estruturas <ul><li>Blocos e blocos Mega </li></ul><ul><li>O GC aloca memória do sistema operacional em pedaços 1 Mb de tamanho, megablocos, que então se divide em. Cada página 4k é chamado de bloco e está associada a um bloco descripter(BD) . O BD mantém informações sobre um bloco; </li></ul>
  107. 107. Garbage Collection - Estruturas <ul><li>Passos </li></ul><ul><li>Gerações GHC são divididos em etapas; </li></ul><ul><li>A última geração, o mais velho tem apenas um passo; </li></ul><ul><li>A coleta de lixo acontece ao nível das gerações; </li></ul><ul><li>Então, quando você diz que está coletando gen 0, que é recolher todas as etapas de geração 0. Se você está coletando gen 4, então você está coletando todas as etapas de geração de 0 a gen 4.  </li></ul><ul><li>Objetos que sobrevivem a uma coleta são promovidos ao escalão imediatamente superior; </li></ul>
  108. 108. Garbage Collection - Estruturas
  109. 109. Garbage Collection - Estruturas
  110. 110. Espaço das Classes Normal Overlap Closed Local Normal Global Implicit Parameters Haskell GHC Methods Dependência local
  111. 112. Fluxograma Coerção
  112. 113. <ul><li>Escrito em C; </li></ul>YHC
  113. 114. verification : bytecode :: typechecking : source code YHC
  114. 115. YHC
  115. 116. DICAS <ul><li>Ao definir uma nova função em Haskell, é útil começar por escrever o seu tipo; </li></ul><ul><li>Dentro de um script, é boa prática para indicar o tipo de cada nova função definida; </li></ul><ul><li>Ao afirmar os tipos de funções polimórficas que usam números, como a igualdade ou ordenações, tome o cuidado ao incluir as restrições de classe; </li></ul>
  116. 117. Avaliação <ul><li>Alta Flexibilidade : De acordo com a Tese de Church, todo e qualquer problema resolvido imperativamente possui uma resolução indutiva; </li></ul><ul><li>Tipagem : Haskell é extremamente tipada , sendo conhecido como calculadora funcional.Expressões são reduzidas tendo por base o cálculo lambda. </li></ul><ul><li>Portabilidade : Interpretadores ou compiladores trabalham em diversos tipos de arquitetura e sistemas operacionais. </li></ul>
  117. 118. Haskell X Outras Linguagens <ul><li>Haskell separa a definição de um tipo a partir da definição dos métodos associados a esse tipo; </li></ul><ul><li>Uma classe em C++ ou Java normalmente definem a estrutura de dados (variáveis, membro) e as funções associadas com a estrutura (os métodos). Em Haskell, essas definições são separados; </li></ul><ul><li>As classe definidas por Haskell correspondem às funções virtuais em uma classe C++ e similares a uma interface Java; </li></ul><ul><li>Cada instância de uma classe fornece a sua própria definição de cada método, os padrões de classe correspondem às definições padrão para uma função virtual na classe base; </li></ul><ul><li>Como uma declaração de interface, uma declaração de classe Haskell define um protocolo para a utilização de um objeto em vez de definir um objeto em si; </li></ul>
  118. 119. Haskell X Outras Linguagens <ul><li>C++ e Java anexam as informações de identificação (como um vtable) para a representação de tempo de execução de um objeto. Em Haskell, essa informação está ligado, logicamente, em vez de física para valores, através do tipo de sistema; </li></ul><ul><li>Não há controle de acesso (tais como público ou privado, de classe componentes) incorporados ao sistema de classe Haskell. Em vez disso, o módulo do sistema deve ser usado para esconder ou revelar os componentes de uma classe. </li></ul>
  119. 120. Comparação
  120. 121. Curiosidades <ul><li>Vídeos: </li></ul><ul><ul><li>http://www.youtube.com/watch?v=X4-212uMgy8 </li></ul></ul><ul><ul><li>http://www.youtube.com/watch?v=A1wtQ_mYHHo&feature=related </li></ul></ul>
  121. 122. Curiosidades <ul><li>GHC 6.10.4 </li></ul><ul><ul><li>Compilador de Haskell; </li></ul></ul><ul><li>GHCi 6.10.4 </li></ul><ul><ul><li>O interpretador de bytecode e um ambiente interativo para Haskell; </li></ul></ul><ul><ul><li>Um depurador interativo para Haskell; </li></ul></ul>
  122. 123. Curiosidades <ul><li>Tratamento para Computação paralela: </li></ul>
  123. 124. Curiosidades
  124. 125. Vantagens <ul><li>Suporte à simultaneidade e paralelismo ; </li></ul><ul><li>Apoiado por uma grande biblioteca de módulos de pacotes; </li></ul><ul><li>Fornecido com depuradores e profilers ; </li></ul><ul><li>Livremente disponível </li></ul><ul><ul><li>(código-fonte aberto, pacote de desenvolvimento completo); </li></ul></ul>
  125. 126. Vantagens <ul><li>Fortemente Tipada e Estática; </li></ul><ul><li>Avaliação Lazy; </li></ul><ul><li>Polimorfismo Universal Paramétrico; </li></ul><ul><li>Função (superior e parcial); </li></ul><ul><li>Ausência de desvios incondicionais; </li></ul>
  126. 127. Desvantagens <ul><li>Requer muita memória; </li></ul><ul><li>Execução lenta; </li></ul>
  127. 128. Conclusão <ul><li>Neste seminário tivemos a oportunidade de explanar os principais aspectos de implementação da linguagem funcional Haskell. </li></ul><ul><li>Além disso também foi discutido aspectos de programação do ponto de vista do usuário da linguagem. </li></ul><ul><li>Em geral as linguagens funcionais assumem um papel extremamente específico em projetos de desenvolvimento de software, na maioria dos casos, aplicações com fins especiais conseguem tirar proveito do poder do paradigma funcional. </li></ul><ul><li>O Haskell é funcional mas futuramente estenderá a aplicação suportando vários paradigmas na mesma linguagem, podendo-se programar de forma funcional, imperativa ou orientada a objetos. </li></ul><ul><li>Naturalmente este suporte sempre possui uma base funcional e através dela se obtém uma abstração de outros paradigmas, porém é fácil notar toda a força do Haskell que dá ao programador uma série de recursos de forma extremamente simples e principalmente didática, </li></ul><ul><li>Possibilita que a linguagem seja facilmente utilizada tanto no âmbito do ensino de programação em linguagens funcionais, como na criação de grandes projetos de aplicativos comerciais mais complexos. </li></ul><ul><li>Haskell nos dá todo o poder do paradigma funcional com a facilidade de implementação e clareza de código. </li></ul>
  128. 129. Bibliografia <ul><li>The Haskell Home Page: </li></ul><ul><ul><li>www.haskell.org </li></ul></ul><ul><li>Haskell Reference: </li></ul><ul><ul><li>www.zvon.org/other/haskell/Outputglobal </li></ul></ul><ul><li>Haskell GHC: </li></ul><ul><ul><li>http://hackage.haskell.org/trac/ghc/wiki/ </li></ul></ul>
  129. 130. Dúvidas

×