A máquina SECD. Pedro Vasconcelos. 20 de Fevereiro de 2014

Documentos relacionados
Estruturas de dados. Pedro Vasconcelos. 3 de Março de 2014

Redução de grafos. Pedro Vasconcelos. 4 de Março de 2014

Implementação de Linguagens

Implementação de Linguagens

AULA 05: LINGUAGEM DE MONTAGEM: SUPORTE A PROCEDIMENTOS

Arquitecturas Alternativas. Java Virtual Machine

Compiladores II. Fabio Mascarenhas

Compiladores Ambiente de Execução

Introdução à Programação

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Introdução. Geovane Griesang

Procedimentos. Sistemas de Computação

Programação: Compiladores x Interpretadores PROF. CARLOS SARMANHO JR

Compiladores Geração de Código

O estudo da arquitectura de computadores efectua-se com recurso à Abstracção

Linguagens de Programação Classificação

Linguagens de Programação. Nomes, Escopos e Vinculações (Bindings) Carlos Bazilio

Compiladores. Geração de Código Objeto

Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES. Síntese. Prof. Geovane Griesang

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 25. Instituto de C

16. Compilação no Linux

PARTE II - CONJUNTO DE INSTRUÇÕES ARQUITETURA DE COMPUTADORES ANTONIO RAMOS DE CARVALHO JÚNIOR

Compiladores e Computabilidade

Compiladores Ambiente de Execução

Introdução aos computadores, à Internet e à World Wide Web. Prof. Marcelo Roberto Zorzan

Linguagens de Programação

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

Introdução à Programação Funcional

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

MIPS ISA (Instruction Set Architecture)

Introdução aos Compiladores

Linguagens de Programação

Infra- Estrutura de Hardware

Projeto de Compiladores

Análise Semântica e Representação Intermédia

Prof. Antonio Almeida de Barros Jr. Prof. Antonio Almeida de Barros Junior

Projeto de Compiladores

Linguagem de Montagem do NeanderX

Fundamentos de Programação

JAVA. Professor: Bruno Toledo

Arquitectura e Organização de Computadores

Algoritmos e Programação

COMPILAÇÃO. Ricardo José Cabeça de Souza

Cálculo Lambda Sem Tipos

ARQUITETURA E ORGANIZAÇÃO DE COMPUTADORES A UNIDADE LÓGICA ARITMÉTICA E AS INSTRUÇÕES EM LINGUAGEM DE MÁQUINA

Organização e Arquitetura de Computadores I

Conceitos de Linguagem de Programação - 2

Análise Semântica e Representação Intermédia

III.2 - Princípios de Arquitetura

Algoritmos e Programação

Autómatos determísticos de k-pilhas

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 32. Instituto de C

Arquitectura e Organização de Computadores

PCS3616. Programação de Sistemas (Sistemas de Programação) Semana 6, Aula 10. Introdução Programação em linguagem de Montagem

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Linguagens de Programação Aula 11

Linguagens de Programação Funcional

Implementando subprogramas

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.

Linguagem C. Brian W. Kernighan, Dennis Ritchie (K&R) Slides adaptados, inspirados, muitos copiados dos slides do professor Pedro Pereira

Análise Semântica e Representação Intermédia

Prof. Adriano Maranhão COMPILADORES

MAB TINY na LVM. Wednesday, November 30, 11

ARQUITECTURA DE COMPUTADORES

Instituto Superior de Engenharia de Lisboa

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Linguagens de Programação

Aula teórica 7. Preparado por eng.tatiana Kovalenko

Programação em Sistemas Computacionais

Introdução à Geração de Código

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

Um Exemplo de Nível ISA: o IJVM. Pilhas. Pilhas. O Modelo de Memória da IJVM. Pilhas de Operandos. Nível ISA

Introdução à Programação Aula 16. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

SIMULAÇÃO DE MÁQUINA DE REGISTRADORES COM MÁQUINA DE TURING MULTIFITA

a) Calcule o valor médio de CPI apresentado na execução deste programa P, utilizando-se C1 sem e com otimização.

Ferramenta para Desenvolvimentode Sistemas EmbarcadosUtilizando Linguagem de Alto Nível p.1/25

Notas de Aula Guilherme Sipahi Arquitetura de Computadores

Pragmática das Linguagens de

Introdução à plataforma Java

Aula 14 Funcionamento de Processadores (Visão específica)

ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES I

Processadores para computação de alto desempenho

AJProença, Sistemas de Computação, UMinho, 2017/18 1. Componentes (físicos) a analisar: a unidade de processamento / o processador:

Compiladores. Conceitos Básicos

PCS3616. Programação de Sistemas (Sistemas de Programação) Semana 8, Aula 14. Editores de Ligação e Relocadores Programação em linguagem de montagem

Working 03 : Conceitos Básicos I

Linguagens de Programação

Conjunto de Instruções MIPS Parte III

O que é uma variável?

SSC0611 Arquitetura de Computadores

Sistemas de Computação. Instruções de Linguagem de Máquina

Existem três categorias principais de linguagem de programação: linguagem de máquina, linguagens assembly e linguagens de alto nível.

CAP. VII GERAÇÃO DE CÓDIGO

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.

Programação Funcional - Introdução a Cálculo Lambda

Exercícios resolvidos (aula de 4 de Maio) Resolução:

PROGRAMAÇÃO OBJECTIVOS DA CADEIRA

SSC0114 Arquitetura de Computadores

Conjunto de Instruções. Prof. Leonardo Barreto Campos 1

Transcrição:

A máquina SECD Pedro Vasconcelos 20 de Fevereiro de 2014

O que é a máquina SECD? Um interpretador da linguagem funcional ISWIM (Landin, 1964) Máquina virtual para compilação LISP/Scheme (Henderson, 1980) Utilizada em implementações reais (LispMe no Palm Pilot) Desenhada para linguagens call-by-value Pode ser modificada para lazy evaluation (embora existam alternativas mais eficientes)

Máquina abstracta ou virtual? A SECD original interpreta directamente termos de sintaxe abstracta (máquina abstracta) Vamos apresentar uma máquina que interpreta pseudo-instruções (máquina virtual) Omitimos: 1 estruturas de dados (listas, tuplos, etc.); 2 escolha de representações concretas em memória; 3 tradução das pseudo-instruções para código-máquina real; 4 ambiente necessário para execução: alocação de memória, garbage collection, I/O...

Bibliografia 1 Capítulo 6 de Functional Programming: Application and Implementation, Henderson, 1980, Prentice-Hall International. 2 Capítulo 7 de The Architecture of Symbolic Computers, Kogge, 1991, McGraw-Hill International.

SECD: Stack, Environment, Control & Dump A configuração da máquina é um quinteto s, e, c, d, m s pilha de valores temporários (stack); e pilha de valores das variáveis livres (environment); c sequência de instruções (control); d pilha de continuações (dump); m memória (closures).

Resolução de nomes Durante compilação vamos associar nomes de variáveis a índices no ambiente. Interpretador termo: x + y ambiente: [x 23, y 42] Compilador termo: x + y tabela de símbolos: [x 0, y 1] código gerado: [LD 0, LD 1, ADD] ambiente: [23, 42] } compilação } execução

Notação de De Bruijn Identifica as variáveis pela profundidade do ligador λ: λx. (λy. y x) x λ (λ 1 2) 1 Os ambiente passam a ser apenas listas de valores: [v 1, v 2,..., v i,..., v n ] Cada variável é associada a um índice i.

Closures Valores funcionais são representados por closures, e.g. (λy. x + y, [x 2] ) }{{}}{{} λ-termo ambiente Na máquina SECD os λ-termos são traduzido para código compilado: Closure = (Code, Env)

Closures Representamos a memória como uma função parcial que associa endereços a closures: Store = Addr Closure A função next dá o próximo endereço livre: next :: Store Addr

Pilha de temporários Os operandos e resultado de instruções são passados na pilha de temporários. A pilha é uma lista de valores: Stack = [Value] v : vs [ ] pilha vazia v topo da pilha, vs resto da pilha Os valores são inteiros ou endereços de closures: v Value = n Int a Addr

Pilha de continuações A pilha de continuações é uma lista de trios (s, e, c): Dump = [(Stack, Env, Code)] Guarda temporariamente os registos da máquina durante a chamada de funções.

Conjunto de pseudo-instruções LD n load variable LDC n load constant LDF c load function LDRF c load recursive function AP apply RTN return SEL c c select zero/non-zero JOIN join main control ADD add SUB subtract MUL multiply HALT halt execution Nota: a SECD descrita no livro de Henderson tem mais instruções.

Exemplos de compilação 1 + (2 3) [LDC 1, LDC 2, LDC 3, MUL, ADD] λx. x + 1 λx. ifzero x 1 0 [LDF [LD 0, LDC 1, ADD, RTN]] [LDF [LD 0, SEL [LDC 1, JOIN] [LDC 0, JOIN], RTN]]

Compilação e execução de instruções O compilador é uma função compile :: Term Symtable Code A tabela de símbolos é uma lista; cada identificador é associado ao seu índice na lista. Symtable = [Ident] Cada instrução é definida por uma transição de estado: s, e, c, d, m }{{} configuração actual s, e, c, d, m }{{} configuração seguinte

Variáveis, constantes e operações aritméticas compile n sym = [LDC n] compile x sym = [LD i] onde i = elemindex x sym compile (e 1 + e 2 ) sym = compile e 1 sym ++ compile e 2 sym ++ [ADD] compile (e 1 e 2 ) sym = compile e 1 sym ++ compile e 2 sym ++ [SUB]. etc.

Execução s, e, (LD i) : c, d, m v i : s, e, c, d, m, onde e = [v 0, v 1,..., v i,...] s, e, (LDC n) : c, d, m n : s, e, c, d, m v 2 : v 1 : s, e, ADD : c, d, m (v 1 + v 2 ) : s, e, c, d, m v 2 : v 1 : s, e, SUB : c, d, m (v 1 v 2 ) : s, e, c, d, m v 2 : v 1 : s, e, MUL : c, d, m (v 1 v 2 ) : s, e, c, d, m

Abstração e aplicação λx. e 1 Constrói uma nova closure; 2 Deixa o endereço do resultado na pilha. (e 1 e 2 ) 1 Avalia e 1 (obtém uma closure); 2 Avalia e 2 (obtém o valor do argumento); 3 Guarda o contexto de execução na dump; 4 Executa o código da closure; 5 Recupera o contexto de execução.

Compilação compile (λx. e) sym = [LDF (compile e sym ++ [RTN])] onde sym = extend sym x compile (e 1 e 2 ) sym = compile e 1 sym ++ compile e 2 sym ++ [AP]

Execução s, e, (LDF c ) : c, d, m a : s, e, c, d, m[a (c, e)] onde a = next m v : a : s, e, AP : c, d, m [ ], v : e, c, (s, e, c) : d, m se m(a) = (c, e ) v : s, e, RTN : c, (s, e, c ) : d, m v : s, e, c, d, m

Condicional ifzero e 0 e 1 e 2 1 Avalia e 0 (resultado deve ser um inteiro); 2 Guarda o contexto de execução na dump 3 Se topo da pilha é 0 avalia e 1 ; caso contrário, avalia e 2 ; 4 Recupera o contexto de execução guardado.

Compilação compile (if e 0 e 1 e 2 ) sym = compile e 0 sym ++ [SEL c 1 c 2 ] onde c 1 = compile e 1 sym ++ [JOIN] c 2 = compile e 2 sym ++ [JOIN]

Execução 0 : s, e, (SEL c 1 c 2 ) : c, d, m s, e, c 1, ([], [], c) : d, m v : s, e, (SEL c 1 c 2 ) : c, d, m s, e, c 2, ([], [], c) : d, m se v Int v 0 s, e, JOIN : c, (_, _, c ) : d, m s, e, c, d, m

Definições locais Solução simples: traduzir como uma aplicação. compile (let x = e 1 in e 2 ) sym = compile ((λx. e 2 ) e 1 ) sym Alternativa com optimização: ver os livros do Henderson e Kogge.

Compilação do operador ponto-fixo compile (fix λf. λx. e) sym = [LDRF (compile e sym ++ [RTN])] onde sym = extend (extend sym f ) x

Execução Constrói uma closure cíclica: s, e, (LDRF c ) : c, d, m a : s, e, c, d, m onde a = next(m) m = m[a (c, a : e)] Nota: a SECD apresentado no livro de Henderson usa duas instruções (DUM/RAP) para construir closures cíclicas.

Mais informações Muita informação e implementações na web... Wikipedia SECD mania: http//skelet.ludost.net/sec A Rational Deconstruction of Landin s SECD Machine, Olivier Danvy, BRICS research report

Exercícios (1) Compilar para a máquina SECD e executar no interpretador: let x = 42 in 2 x (1) λx. λy. ifzero (x y) 1 else 0 (2) let fib = fix λf. λn. ifzero (n 1) 1 (ifzero (n 2) 1 (f (n 1) + f (n 2))) in fib 3 (3)

Exercícios (2) Modificar o interpretador da SECD para reportar o tamanho máximos da pilha.