Tópicos em LP. Fabio Mascarenhas

Documentos relacionados
Linguagens de Programação

Linguagens de Programação

Compiladores Análise Semântica

Compiladores Análise Semântica

Sistemas de Tipos. Cristiano Damiani Vasconcellos.

Linguagens de Programação

Compiladores - Gramáticas

Compiladores Análise Semântica

Compiladores - Gramáticas

Tópicos em LP. Fabio Mascarenhas

Linguagens de Domínio Específico

Compiladores - Análise Léxica

Compiladores Análise de Tipos

Compiladores II. Fabio Mascarenhas

Conceitos de Linguagem de Programação - 2

Linguagens de Programação

Compiladores - Análise Recursiva

Linguagens de Programação

Linguagens de Programação

Compiladores - Autômatos

Compiladores - Análise Recursiva

ao paradigma imperativo

Linguagens de Domínio Específico

Introdução à Computação II Unesp Rio Claro 2012Prof. Rafael Oliveira

a) Defina uma função para obter o máximo entre dois números

Compiladores - Análise Léxica

Linguagens de Programação

Instituto Superior Politécnico de VISEU. Escola Superior de Tecnologia

Informática para Ciências e Engenharias 2014/15. Teórica 7

Informática II Cap. 4-4

Programação de Computadores

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Linguagens de Programação Funcional

Compiladores Ambiente de Execução

Compiladores Análise de Tipos

Linguagem e Técnicas em Programação. Gilson de Souza Carvalho

Informática para Ciências e Engenharias 2013/14. Teórica 7

Linguagens de Domínio Específico

Linguagens de Programação

Processamento da Informação Estruturas de seleção simples e composta

Linguagens de Programação

Compiladores - Gramáticas

JavaScript IFRN INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIAS E TECNOLOGIAS DO RIO GRANDE DO NORTE

Compiladores - Especificando Sintaxe

Lógica de Programação I

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Estruturas de Controle - Seleção. Prof. César Melo

Sistemas de Tipos. Cristiano Damiani Vasconcellos.

Compilador de LP3 para C3E e P3

Desafios de Programação

Linguagens de Programação

Introdução à Programação C

Listas, conjuntos e dicionários

Escola Politécnica da Universidade de São Paulo Departamento de Engenharia de Computação e Sistemas Digitais. PCS 0014: Linguagens de Programação

ALGORITMOS. O que é Algoritmo? Algoritmo é um dos processo para criação

Um sistema de numeração posicional utiliza um conjunto de símbolos. O valor que cada

Compiladores Análise de Tipos

Algoritmos e estrutura de dados

Linguagens de Programação

Funções. Disciplina: Tópicos Especiais em TI PHP

Linguagens de Programação

Compiladores Ambiente de Execução

Introdução à Programação C

MATRIZES - PARTE Mais exemplos Multiplicação de duas matrizes AULA 26

Dados compostos. Paradigma de Programação Funcional. Marco A L Barbosa

Programação Estruturada

A Linguagem Lua Lua Puc-Rio

Linguagens de Domínio Específico

Computação II (MAB 225)

Linguagens de Domínio Específico

Programação Funcional. Capítulo 21. Parsers. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2018.

Introdução à Programação. Expressões Booleanas e Comandos Condicionais

Construção de SitesAula5

Programação Estruturada e Orientada a Objetos

Processamento da Informação

Expressões Condicionais

Aula 4 Objetivos if/else while

Teoria da Computação e Algoritmos. Introdução à Linguagem Pascal. ALGORITMO <Nome do algoritmo>; <definições>; INÍCIO <Comandos>; FIM.

MODULARIZAÇÃO - PARTE 1

INF1005: Programação 1. Vetores. 02/05/10 (c) Paula Rodrigues 1

Compiladores Geração de Código

Uma gramática é ambígua se existe alguma cadeia para qual ela tem mais de uma árvore sintática

Processamento da Informação

Algoritmos e Estruturas de Dados I Linguagem C

Mini apostila de Python - Oficina de Vestibulandos. PET Computação - UFPR September 2016

Tipos de Dados Dinâmicos

Intuição da sintaxe de L2 (35)

Compiladores II. Fabio Mascarenhas

Linguagens de Programação

Lógica de Programação I

Algoritmos de pesquisa

Programação em MATLAB

Computação II (MAB 225)

Vamos estudar o que se entende por «programação», que é uma linguagem de programação e ver algumas terminologias própria de programação e como

Informática para Ciências e Engenharias 2014/15. Teórica 4

Programação de Computadores II

Compiladores. Análise Léxica

Lógica e Linguagem de Programação Convertendo um algoritmo em pseudocódigo para a linguagem C Professor: Danilo Giacobo

Introdução à Programação C

Interpretação e Compilação de Linguagens de Programação Sistemas de tipos

Transcrição:

Tópicos em LP Fabio Mascarenhas 2018.1 http://www.dcc.ufrj.br/~fabiom/comp2

Sequências Para o sistema de tipos de SmallLua ficar interessante, vamos acrescentar um tipo estruturado: sequências Um tipo { t } é uma sequência de itens de tipo t tseq <- # "{" type "}" -> ntseq Construímos sequências com os operadores seq_new(...), que recebe os elementos da sequência como argumentos, e.., que concatena duas sequências Decompomos sequências com os operadores seq_byte(s, i), que retorna o i-ésimo elemento da sequência, e seq_sub(s, i, j), que retorna a subsequência entre os elementos i e j (inclusive)

Regras de dedução - sequências

Primitivas vs funções Classificamos seq_new, seq_byte e seq_sub como primitivas, ao invés de funções, por quê? Qual seria o tipo de seq_new() (uma sequência vazia)? Nosso sistema de tipos é monomórfico: cada termo do sistema pode ter apenas um tipo, e isso vale para as funções Logo, se seq_byte e seq_sub fossem funções só poderiam receber sequências de um tipo pré-determinado, e seq_new() sempre retornaria uma sequência do mesmo tipo Podemos resolver esses problemas com um sistema polimórfico

Parâmetros de tipos A ideia do polimorfismo paramétrico é poder ter parâmetros nos tipos, que são buracos onde podemos encaixar qualquer tipo Representamos esses parâmetros com parâmetros de tipos Um tipo polimórfico tem um ou mais parâmetros como parte dele (podemos usar o mesmo parâmetro mais de uma vez!)

Generalização Criamos um tipo polimórfico por um processo de generalização Devemos tomar cuidado para verificar se os parâmetros de tipos usados foram introduzidos local foo = function <a> (x: a): {number} local y = seq_new(x) return seq_new(1).. y end local bar = function <a> (x: a): number local z = function (y: a): a return x end return z(1) end

Especialização O inverso da generalização é a especialização, que precisamos fazer toda vez que queremos usar um valor de um tipo polimórfico: no nosso caso, chamar uma função polimórfica, ou passar uma função com tipos polimórficos como argumento Na especialização, substituimos os parâmetros livres por tipos concretos O problema é: quais? Uma alternativa é incluir uma sintaxe para especialização: local e = seq_new<string>() local s = seq_new<number>(1) local n = seq_byte<number>(s, 1)

Unificação Em uma chamada de função polimórfica, a ideia é usar os tipos dos argumentos para dizer quais devem ser os tipos que vamos usar na especialização Para fazer a atribuição de parâmetros a tipos usamos um algoritmo que mistura casamento de padrões com atribuição: a unificação

Unificação - Variáveis A unificação é um algoritmo fácil de definir quando trocamos nossos parâmetros de tipo por variáveis de tipo Uma variável inicialmente não está associada a nenhum tipo, mas pode vir a ficar durante o processo de unificação Uma vez associada, ela não pode mais mudar; efetivamente ela assume aquele tipo Duas (ou mais) variáveis não associadas podem se unir: quando uma for associada, a outra também fica associada ao mesmo tipo

Unificação - pseudocódigo function unify(t1, t2): t1 = prune(t1) t2 = prune(t2) case t1, t2: match var, _: if occurs(t1, t2): error("ciclo") else: t1.type = t2 match _, var: unify(t2, t1) match base, base: if t1.tag ~= t2.tag: error("incompatible") match func(params1, ret1), func(params2, ret2): if #params1 ~= #params2: error("arity") zip(unify, params1, params2) unify(ret1, ret2) match seq(elem1), seq(elem2): unify(elem1, elem2) otherwise: error("incompatible")