Compiladores Ambiente de Execução

Documentos relacionados
Compiladores Análise Semântica

Compiladores. Fabio Mascarenhas

Linguagens de Programação Aula 11

Ambientes de Execução

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

Ambientes de Execução

Conceitos de Linguagens de Programação

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

INE5421 LINGUAGENS FORMAIS E COMPILADORES

Linguagens de Domínio Específico

Introdução à Programação

Situação. Geração de Código. Renato Ferreira. Encerramos a parte de Front- End. Back- End. Análise Léxica Análise SintáFca Análise SemânFca

Procedimentos. Sistemas de Computação

Compiladores - Análise Recursiva

Compiladores Análise de Tipos

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

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

Programação Imperativa. Lição n.º 16 A pilha de execução

Compiladores - Análise SLR

Linguagens de Programação Classificação

O que é uma variável?

Linguagens de Programação Aula 3

Como construir um compilador utilizando ferramentas Java

Projeto de Compiladores

Compiladores - Análise Preditiva

Compiladores - Gramáticas

Análise Semântica. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 40

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

Compiladores - Autômatos

Aula 23: Noções de Compilação, Montagem, Link-edição, e Interpretação

Linguagens de Programação Conceitos e Técnicas. Amarrações

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

PROGRAMAÇÃO I. Introdução

Compiladores - Análise Preditiva

FACULDADE LEÃO SAMPAIO

Sistemas Operacionais. Pilha de execução Volnys B. Bernal 1. Agenda. Pilha de execução. Os problemas. Os problemas.

Ambiente de tempo de Execução Cap. 7

INF 1005 Programação I

Compiladores. Gerência de Memória

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

Prof. Adriano Maranhão COMPILADORES

Compiladores Análise de Tipos

Compiladores Análise de Tipos

Programação de Computadores IV. Introdução a Linguagens de Programação Simone Martins SLIDES CEDIDOS POR BRUNO MARQUES 1

Introdução à Programação em C

Árvores B (Parte III)

Lembrando análise semântica. Compiladores. Implementação de esquemas de tradução L-atribuídos. Exemplo de implementação top-down (1)

SEMÂNTICA. Rogério Rocha. rode = program simples = var x : int := 3 in x := x + 5 end.

Figura 1: Esboço do programa Quicksort. a) Desenhe a árvore de ativação quando os números 9, 8, 7, 6, 5, 4, 3, 2, 1 são ordenados.

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Arquitetura de Computadores II

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

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

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Compiladores. Árvore de derivação anotada. Geração de TAC para as principais construções. tradução em código TAC de expressões

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

Recursividade. Prof. Jesus José de Oliveira Neto

Declarações. Variáveis e Classe de Memória

Linguagens Formais e Autômatos

Introdução à Programação C

Construção de Compiladores Aula 5 - Variáveis

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

Análise semântica (continuação)

Linguagem de Programação e Compiladores

Linguagens de Programação 2 Amarrações

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

CAP. VI ANÁLISE SEMÂNTICA

Algoritmos e Programação. Linguagem C Procedimentos e. Eliane Pozzebon

FERRAMENTA DE AUXÍLIO AO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE INTEGRANDO TECNOLOGIAS OTIMIZADORAS

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

Compiladores Aula 13. Celso Olivete Júnior.

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.

Conceitos de Linguagens de Programação

MAB Análise Semântica. Monday, October 10, 11

COMPUTADORES COM UM CONJUNTO REDUZIDO DE INSTRUÇÕES. Adão de Melo Neto

Compiladores - Gramáticas

Linguagens de Programação

Capítulo 6: Arquivos

Análise Semântica: Verificação de Tipos

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

Algoritmos. Prof. Jonatas Bastos Site:

Linguagens de Programação

Semântica de Linguagens de Programação

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

Linguagem C Princípios Básicos (parte 1)

CAP. VII GERAÇÃO DE CÓDIGO

Recursividade. Objetivos do módulo. O que é recursividade

Compiladores - JFlex. Fabio Mascarenhas

Aula 4 Introdução ao C

Conceitos de Linguagens de Programação

Compiladores - JFlex. Fabio Mascarenhas Monday, April 15, 13

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

04 Recursão SCC201/501 - Introdução à Ciência de Computação II

Programação de Computadores II. Cap. 5 Vetores

Compiladores I Prof. Ricardo Santos (cap 1)

Paradigmas de Programação

Sistemas Operacionais. Pilha de Execução Volnys B. Bernal 1. Agenda. Pilha de execução. Os problemas. Os problemas.

Compiladores Aula 1. Celso Olivete Júnior.

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Programação imperativa. 10. Pilha de execução

Transcrição:

Compiladores Ambiente de Execução Fabio Mascarenhas 2015.2 http://www.dcc.ufrj.br/~fabiom/comp

O Back-end Até agora vimos as fases do front-end do compilador: Análise Léxica Análise Sintática Análise Semântica O front-end verifica se o programa está bem formado, de acordo com as regras da linguagem, e o coloca em uma estrutura adequada para seu processamento O back-end cuida da transformação do programa para a linguagem destino, e de transformações feitas no programa para tornar o código final mais eficiente

Geração de Código Vamos ver a forma mais simples de back-end, que gera código diretamente a partir da AST do programa, sem se preocupar em melhorar o código resultante Mas mesmo um gerador de código ingênuo pode ter uma implementação complexa, a depender da distância entre a linguagem fonte e a linguagem destino Vamos ver a geração de código para uma versão simplificada da linguagem de máquina x86, para o compilador TINY

Organização da Memória Antes de tratar da geração de código em sim, precisamos entender como é a estrutura do programa quando ele está sendo executado Quais recursos o programa usa em sua execução, e como eles se espalham na memória Que construções em tempo de execução correspondem às construções que temos em tempo de compilação: variáveis globais, variáveis locais, procedimentos, parâmetros, métodos, classes, objetos... Todas essas construções precisam estar refletidas de alguma forma no código gerado!

Ativações e Alcance Uma chamada de um procedimento (ou função, ou método) p é uma ativação de p O alcance de uma ativação de p compreende todos os passos para executar p, incluindo todos os passos para executar procedimentos chamados por p O alcance de uma variável x é a porção da execução do programa na qual x está definida Em geral, está ligado ao escopo de x, mas nem sempre Alcance é dinâmico, enquanto escopo é estático

Alcance x Escopo No código em JavaScript abaixo, o escopo e o alcance do parâmetro n são bem diferentes: function cont(n) { return function () { n = n + 1; return n; } } var c1 = cont(1); console.log(c1()); console.log(c1()); var c2 = cont(1); console.log(c2()); console.log(c1()); console.log(n); 2 3 2 4 ReferenceError: n is not defined

Árvore de Ativações Quando um procedimento p chama um procedimento q, q sempre retorna antes do retorno de p O alcance das ativações sempre é corretamente aninhado Isso quer dizer que as ativações durante a execução de um programa formam uma árvore A execução corresponde a um caminho nessa árvore em profundidade

Árvore de Ativações - Exemplo Vamos desenhar a árvore de ativações para o programa TINY abaixo: procedure g() x := 1 procedure f() g() var x: int; g(); f(); write x

Árvore de Ativações - Exemplo Vamos desenhar a árvore de ativações para o programa TINY abaixo: procedure g() x := 1 procedure f() var n: int; n := x; if n < 2 then g() else x := n 1; f(); x := n * x end var x: int; x := 3; f(); write x

Árvore de Ativações - Exemplo Vamos desenhar a árvore de ativações para o programa TINY abaixo: procedure g() x := 1 procedure f() var n: int; n := x; if n < 2 then g() else x := n 1; f(); x := n * x end var x: int; read x; f(); write x

Árvores de Ativação A árvore de ativação depende da execução do programa, e pode ser diferente a depender da entrada para o programa Ou seja, a árvore de ativação do programa não pode ser determinada estaticamente! Mas como as ativações são sempre aninhadas, podemos manter nossa posição na árvore de ativação usando uma pilha Usando uma pilha podemos facilmente ter procedimentos com mais de uma ativação ao mesmo tempo (funções recursivas)

Pilha de Ativações - Exemplo Vamos desenhar a pilha de ativações para o programa TINY abaixo: procedure g() x := 1 procedure f() g() var x: int; g(); f(); write x

Registro de Ativação A informação armazenada na pilha para gerenciar uma ativação de um procedimento se chama registro de ativação (AR) ou quadro (frame) O registro de ativação de um procedimento g que foi chamado por um procedimento f terá informação para: Completar a execução de g Retomar a execução de f no ponto logo após a chamada de g

Registro de ativação x86 cdecl Argumentos, de trás para frente Endereço da instrução seguinte à chamada da função Ponteiro para o registro de ativação do chamador o frame pointer (EBP) aponta para cá Variáveis locais Espaço para valores temporários e para guardar registradores entre chamadas

Registro de Ativação exemplo Vamos desenhar o registro de ativação do programa C abaixo para a ativação da função g: static int g() { return 1; } static int f(int x) { if(x < 2) return g(); else return x * f(x-1); } int main() { return f(3); }