52
O Tipo e o Tempo Andrei de A. Formiga Universidade Federal da Paraíba

O Tipo e o Tempo

Embed Size (px)

DESCRIPTION

Palestra sobre sistemas de tipos e sistemas híbridos entre tipagem estática e dinâmica apresentada no QConSP 2012.

Citation preview

Page 1: O Tipo e o Tempo

O Tipo e o TempoAndrei de A. Formiga

Universidade Federal da Paraíba

Page 2: O Tipo e o Tempo

Tipagem Estática vs. Dinâmica

Page 3: O Tipo e o Tempo

Sobre

Page 4: O Tipo e o Tempo

Sobre (2)

• Vale Tudo: Tipagem Estática vs. Dinâmica

• Um caminho do meio

Page 5: O Tipo e o Tempo

Palestrante

• Graduação em Eng. Elétrica

• Experiência Profissionalo SGBD

o Jogos

o Monitoramento e Controle

Page 6: O Tipo e o Tempo

Palestrante (2)• Mestrado e Doutorado

o Linguagens de Programação

o Proc. de Documentos, Rec. de Padrões

• Pesquisao Linguagens

o Comp. Paralela

o Aprendizado de Máquina

Page 7: O Tipo e o Tempo

Tipologia Básica

Page 8: O Tipo e o Tempo

Tipos: o que são?

• Tipo é um conjunto de valores

• Valores pertencem a um ou mais tipos

• Variável V tem Tipo T: V só pode assumir valores do conjunto T

Page 9: O Tipo e o Tempo

Fun calculus!

• Expressões:o fun x = Eo F E

• Regraso (fun x = E1) E2 E1[x=E2]

Page 10: O Tipo e o Tempo

Fun Calculus: Constantes

• Booleanos: true, false

• Inteiros: 0, 1, …

• Operações: +, -, *, /, …

Page 11: O Tipo e o Tempo

Fun Calculus: Exemplos

• quad fun x = x * x

• quad 5

• quad 5 (fun x = x * x) 5 5 * 5

Page 12: O Tipo e o Tempo

Fun Calculus: Problemas

• quad true

• 5 + true

• 3 / 0

?

Page 13: O Tipo e o Tempo

Tipos Simples• Expressões

o fun x: T = Eo F E

• Regras de Tiposo E: T2, (fun x: T1 = E): T1T2o F: T1T2, E:T1, (F E): T2

• Regra de Avaliação (igual)

Page 14: O Tipo e o Tempo

Exemplos

• quad fun x: Int = x * x

• quad: IntInt

• true: Bool

• quad true: ? Erro de tipo!

Page 15: O Tipo e o Tempo

-Cálculo com tipos simples

Page 16: O Tipo e o Tempo

Mais Detalhes

• Types and Programming Languages

• Benjamin Pierce

Page 17: O Tipo e o Tempo

Garantias

• Corretudeo Type safety/soundnesso “Well-typed programs can’t go wrong”

• Completude

Page 18: O Tipo e o Tempo

Estático ou Dinâmico?

• Duas etapas de avaliação

• Tende p/ verificação estática

• Cálculo não prescreve momento de verificar

Page 19: O Tipo e o Tempo

Estático e Dinâmico

Page 20: O Tipo e o Tempo

Interpretação

Interpretador

Entrada

Programa

Saída

Page 21: O Tipo e o Tempo

Compilação

Programa Compilado

Entrada

Programa

Saída

Compilador

Verificação estática

Page 22: O Tipo e o Tempo

Compilação como Otimização

• Fazer parte da avaliação antes

• Incluindo verificações estáticas

• Avaliação Parcial (partial evaluation)

Page 23: O Tipo e o Tempo

Confiabilidade

• Efeito colateral da compilação

• Tipos vs. testes:o Unit testing isn’t enough, you need static

typingo http://bit.ly/RlqUzJ

Page 24: O Tipo e o Tempo

Mais Estágios?

• Macros

• Aspectos

• Multi-Stage Programming

Page 25: O Tipo e o Tempo

Verificação vs. Declaração

• Declarar os tipos ou não? o (declaração opcional)

• Verificar os tipos estatica ou dinamicamente?

Page 26: O Tipo e o Tempo

Declaração/Estática

• C, C++, Java, etc.

• Visão geral da tipagem estática

Page 27: O Tipo e o Tempo

Sem Declaração/Dinâmica

• Python, Ruby, JavaScript, etc

• Visão geral da tipagem dinâmica

Page 28: O Tipo e o Tempo

Decl. Opcional/Estática

• ML, Haskell

• Variáveis locais: C#, Scala, etc

Page 29: O Tipo e o Tempo

Decl. Opcional/Dinâmica

• Common Lisp, Julia, Dart

• Possibilidade de Verificação Estática

Page 30: O Tipo e o Tempo

Sistemas de TiposMais e mais features

Page 31: O Tipo e o Tempo

Limitações dos Tipos Simples

• Tipos compostos

• Containers

• Hierarquias de tipos

Page 32: O Tipo e o Tempo

Registros / Classes

• Possibilidade de criar novos tipos

• type Point = { x: Int; y: Int }

Page 33: O Tipo e o Tempo

Registros / Classes

Page 34: O Tipo e o Tempo

Polimorfismo Paramétrico

• Containers

• Ex.: pontos inteiros ou float

• type PointI = { x: Int; y: Int }

• type PointF = { x: Float; y: Float }

Page 35: O Tipo e o Tempo

Polimorfismo Paramétrico

• Construtor com parâmetro de tipo

• type Point[T] = { x: T; y: T }

Page 36: O Tipo e o Tempo

Tipos Recursivos

• Definir tipos em função deles mesmos

• Uma árvore é:o Uma árvore vazia; ouo Um nó com dois filhos que são árvores

Page 37: O Tipo e o Tempo

Subtipos

• Relações hierárquicas entre tipos

• Geral/Específico

• Relaciondo à herança em OO

• A <: B

Page 38: O Tipo e o Tempo

Subtipos

Page 39: O Tipo e o Tempo

Mais• Phantom Types

• GADTs

• Higher-kinded Types

• Bounded quantification

• Tipos existenciais

Page 40: O Tipo e o Tempo

Linguagens Atuais

• Haskell (+extensões)o Polimorfismo paramétricoo Phantom Typeso GADTso Higher-Kinded Types

• OCamlo Polimorfismo paramétricoo Phantom Typeso GADTs

Page 41: O Tipo e o Tempo

Linguagens Atuais

• Javao Polimorfismo paramétricoo Tipos existenciais (wildcards)

• Scalao Polimorfismo paramétricoo Higher-kinded typeso Anotações de variânciao GADTso etc…

Page 42: O Tipo e o Tempo

Muito Complexo?• Benjamin Pierce, “Types Considered Harmful”

• Luca Cardelli: “I was not the only one to suspect that I was getting lost in type theory”

• Erik Meijer, “Static Typing Where Possible, Dynamic Typing When Needed”

Page 43: O Tipo e o Tempo

Tipos e Proposições

• Verificador de tipos é um provador de teoremas

• Tipagem 100% estática exige provar tipos em todo o código

• Tipagem 100% dinâmica joga fora informação útil

Page 44: O Tipo e o Tempo

Sistemas Híbridos e Exemplos

Page 45: O Tipo e o Tempo

Sistemas Híbridos

• Gradual Typing

• Blame calculus

Page 46: O Tipo e o Tempo

Common Lisp

• Declaração opcional de tipos

• Objetivo: otimização

• Possível fazer verificações estáticas

Page 47: O Tipo e o Tempo

Common Lisp

(iter (for el in number-list) (count (oddp el))))

(iter (for el in number-list) (declare (fixnum el)) (count (oddp el))))

Page 48: O Tipo e o Tempo

Typed Racket

• Declaração opcional de tipos

• Verificação estática quando possível

• Verificação dinâmica quando necessário

Page 49: O Tipo e o Tempo

Typed Racket

#lang typed/racket(: sum-list ((Listof Number) -> Number))(define (sum-list l) (cond [(null? l) 0] [else (+ (car l) (sum-list (cdr l)))]))

Page 50: O Tipo e o Tempo

Dart

• Declaração opcional de tipos (Dynamic)

• Objetivo: Documentação e verificações

• Tipagem dinâmica com verificações estáticas

Page 51: O Tipo e o Tempo

Julia

• Declaração opcional + verif. Dinâmica

• Objetivo principal: Desempenho

• Possível para verificação estática

Page 52: O Tipo e o Tempo

Perguntas?

• Twitter: @andreiformiga

• Blog: http://andreiformiga.com/blog