Noções de compilação

Documentos relacionados
Linguagens de Programação Aula 3

INE5421 LINGUAGENS FORMAIS E COMPILADORES

As fases de um compilador

Conceitos de Linguagens de Programação

As fases de um compilador

Compiladores I Prof. Ricardo Santos (cap 1)

Compiladores. Introdução à Compiladores

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

Projeto de Compiladores

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

Introdução à Programação

Conversões de Linguagens: Tradução, Montagem, Compilação, Ligação e Interpretação

Programação de Sistemas (Sistemas de Programação) Semana 10, Aula 17

PROGRAMAÇÃO I. Introdução

Introdução à Computação

Paradigmas de Programação

Capítulo 1. Aspectos Preliminares

Breve Histórico & Conceitos Básicos

FACULDADE LEÃO SAMPAIO

Compiladores. Conceitos Básicos

Autômatos e Linguagens

Métodos de implementação de linguagens. Kellen Pinagé

Revisão: linguagens de programação

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

Linguagens de Programação Classificação

INE5622 INTRODUÇÃO A COMPILADORES

Compiladores. Fabio Mascarenhas

Algoritmos e Programação

Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros. Prof. Thiago A. S.

3. Linguagem de Programação C

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.

Compiladores. Eduardo Ferreira dos Santos. Fevereiro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 38

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

Questões de Paradigmas de Programação Matéria: Prova 1 4ª EDIÇÃO

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

Informática I. Aula 9. Aula 9-17/05/2006 1

Fundamentos de Programação 1

Introdução a Ciência da Computação

Programação de Computadores:

Analisador Léxico parte II

Como construir um compilador utilizando ferramentas Java

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

Algoritmos e Programação

Introdução à Computação: Máquinas Multiníveis

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

Linguagens de Programação

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

Conteúdo. Introdução a compiladores Tradução x Interpretação Processo de Compilação

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

DESENVOLVIMENTO DO COMPILADOR PARA A LINGUAGEM SIMPLE

Compiladores. Geração de Código Objeto

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

Aspectos preliminares

1 Introdução à Programação O que é? Para que serve?... 1

Linguagens de Programação. Introdução. Carlos Bazilio

QUESTÃO 1 (0,6 ponto) Classifique os processadores de linguagens com relação aos tipos das linguagens-fonte e objeto.

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

Algoritmos Computacionais

IFSC/Florianópolis - Programação Orientada a Objetos com Java - prof. Herval Daminelli

Algoritmos. Prof. Jonatas Bastos Site:

AULA 03: FUNCIONAMENTO DE UM COMPUTADOR

CAP. VI ANÁLISE SEMÂNTICA

Linguagem de Programação e Compiladores

INE5317 Linguagens Formais e Compiladores. Ricardo Azambuja Silveira INE-CTC-UFSC URL:

Capítulo 1 Linguagens e processadores

Aula 1 Java Prof. Dr. Sylvio Barbon Junior

Introdução ao Python. Programa Computacional

Introdução. Tradutores de Linguagens de Programação

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

Arquitetura e Organização de computadores

Sistemas Operacionais

Introdução. (Aula 2) Organização Estruturada de Computadores

Linguagens de Programação

a) Computador b) Estrutura do sistema i. Hardware ii.software c) Linguagens de Programação i. Paradigmas e Programação 1.

Aula 2 - Programação de Computadores - CI208 1/21

Ferramentas Programação. UDESC - Prof. Juliano Maia 1

GFM015 Introdução à Computação

IV.2 Aspectos Léxicos Convencionais

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

Sistemas Operacionais

Mecanismos de Interrupção e de Exceção, Barramento, Redes e Sistemas Distribuídos. Sistemas Operacionais, Sistemas

Introdução as Máquinas de Autômatos

Análise de Dados em Oc. Física

Implementação de Linguagens

CP Introdução à Informática Prof. Msc. Carlos de Salles

Estrutura e funcionamento básico de um computador

CAP. VII GERAÇÃO DE CÓDIGO

Tecnólogo em Análise e Desenvolvimento de Sistemas. Sistemas Operacionais (SOP A2)

Prof. Adriano Maranhão COMPILADORES

Python - Variáveis e expressões

Curso Profissional de Gestão e Programação de Sistemas Informáticos. Programação e Sistemas de Informação. Módulo 1. 1ª Parte Prof. Sandra Pais Soares

UMA PROPOSTA DE FERRAMENTA PARA SIMPLIFICAR A DEPURAÇÃO DE CÓDIGOS EM C, POR ALUNOS INICIANTES

Introdução à Programação de Computadores Fabricação Mecânica

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

Implementação do Analisador Léxico

Procedimentos. Sistemas de Computação

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

Informática I. Aula 14. Aula 14-10/10/2007 1

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Transcrição:

Noções de compilação Compilador: o que é, para que serve e estrutura geral Parentes do compilador e programas correlatos Prof. Thiago A. S. Pardo 1 Compilação: por que estudar? (parte 1) Compiladores: uma das principais ferramentas do cientista/engenheiro da computação Técnicas de compilação se aplicam a projetos gerais de programas Editores de texto, sistemas de recuperação de informação, reconhecimento de padrões, processamento de línguas Composição tipográfica e desenho de figuras Teste de programas Utilização de conceitos e métodos de diversas disciplinas Algoritmos Linguagens de programação Teoria das linguagens Engenharia de software Arquitetura de computadores 2 1

Compilador: o que é e para que serve Definição: Programa que lê um programa em uma linguagemfonte e o traduz em um programa em uma linguagem-alvo (objeto) Linguagem-fonte: Pascal, C Linguagem-alvo: linguagem de montagem (assembly), código de máquina Durante o processo de tradução, relatam-se erros encontrados programa fonte compilador programa alvo mensagens de erro 3 Um pouco de história Inicialmente, programação em código de máquina Programação em linguagem de montagem Maior facilidade de programação Necessidade de um montador Não há mágica! Finalmente, linguagens de mais alto nível 4 2

Um pouco de história Primeiros compiladores começaram a surgir no início dos anos 50 Diversos experimentos e implementações realizados independentemente Trabalhos iniciais: tradução de fórmulas aritméticas em código de máquina Compiladores eram considerados programas muito difíceis de construir Primeiro compilador Fortran levou 18 homens-ano para ser construído 5 Um pouco de história Desde então, técnicas sistemáticas para construção de compiladores foram identificadas Reconhecimento de cadeias, gramáticas, geração de linguagem Desenvolvimento de boas linguagens e ambientes de programação C, C++, bibliotecas, linguagens visuais Desenvolvimento de programas para produção automática de compiladores lex, yacc Atualmente, um aluno de graduação pode construir um compilador rapidamente Ainda assim, programa bastante complexo Estimativa de código de 10.000 a 1.000.000 de linhas 6 3

Um pouco de história Antes um mistério, agora uma das áreas mais conhecidas 1957: Fortran primeiros compiladores para processamento de expressões aritméticas e fórmulas 1960: Algol primeira definição formal de linguagem, com gramática na forma normal de Backus, estruturas de blocos, recursão, etc. 1970: Pascal tipos definidos pelos usuários, máquina virtual (P- Code) 1985: C++ orientação a objetos, exceções 1995: Java compilação just-in-time (traduz bytecodes para código de máquina e executa), melhorando o tempo e execução do programa, portabilidade 7 Um pouco de história Há quem odeie C, C++, Java, etc. Muito detalhe, baixo nível Tendência para programação orientada a componentes, linguagens visuais, linguagens de altíssimo nível (por exemplo, Haskell), frameworks Versão computeira da discussão do carro com marcha vs. carro automático 8 4

Compilação Exigências atuais Gere código corretamente Seja capaz de tratar de programas de qualquer tamanho Velocidade da compilação não é a característica principal Tamanho do compilador já não é mais um problema User-friendliness se mede pela qualidade das mensagens de erros A importância da velocidade e tamanho do código gerado depende do propósito do compilador - velocidade vem em primeiro lugar 9 Compilação Em geral, somente linguagens imperativas são estudadas em cursos de Compilação Linguagens funcionais (LISP) e lógicas (Prolog) requerem técnicas diferentes Por quê? 10 5

Modelo de compilação Duas etapas Análise: interpreta o programa-fonte e cria uma representação intermediária do mesmo Síntese: a partir da representação intermediária, produz o programa-alvo análise interface de vanguarda front-end síntese interface de retaguarda back-end programa fonte compilador programa alvo mensagens de erro 11 Exemplo Quais os erros? 12 6

Exemplo Quais os tipos dos erros? 13 Exemplo Viola tamanho de memória: erro de geração de código de máquina Viola formação de identificador: erro léxico Viola o significado de i: erro semântico Viola identificadores conhecidos: erro contextual Viola formação de comando: erro sintático O que diferencia os tipos de erros? 14 7

Fases da compilação Lexical: palavras (tokens) do programa i, while, =, [, (, <, int Erro: j@ Sintática: combinação de tokens que formam o programa comando_while while ( expressão ) comandos Erro: while ( expressão comandos Semântica e contextual: adequação do uso Tipos semelhantes em comandos (atribuição, por exemplo), uso de identificadores declarados Erros: i= 1, k=i Geração de código: especificidades da máquina-alvo e sua linguagem Alocação de memória, uso de registradores Erro: a[1000000000] 15 Estrutura geral de um compilador programa-fonte analisador léxico Tabela de símbolos analisador sintático Tabela de palavras e símbolos reservados analisador semântico gerador de código intermediário otimizador de código Manipulação de erros gerador de código programa-alvo dados de entrada saída 16 8

Estruturas da compilação Como diferenciar palavras e símbolos reservados (while, int, :=) de identificadores definidos pelo usuário Tabela de palavras e símbolos reservados int while :=... 17 Estruturas da compilação Como saber durante a compilação de um programa o tipo e o valor dos identificadores, escopo das variáveis, número e tipo dos parâmetros de um procedimento, etc. Tabela de símbolos Identificador Classe Tipo Valor... i var integer 1... fat proc - -...... 18 9

Analisador lexical Reconhecimento e classificação dos tokens Expressões regulares, autômatos x:=x+y*2 <x,id 1 > <:=,:=> <x,id 1 > <+,op> <y,id 2 > <*,op> <2,num> 19 Analisador sintático Verificação da formação do programa Gramáticas livres de contexto <x,id 1 > <:=,:=> <x,id 1 > <+,op> <y,id 2 > <*,op> <2,num> comando_atribuição id 1 := id 1 op id 2 op num 20 10

Analisador semântico Verificação do uso adequado id 1 := id 1 op id 2 op num (id 1 ) int := (id 1 op id 2 op num) int busca_tabela_símbolos(id 1 )=TRUE busca_tabela_símbolos(id 2 )=TRUE 21 Gerador de código intermediário Geração de código intermediário/preliminar id 1 := id 1 op id 2 op num temp1 := id 2 * 2 temp2 := id 1 + temp1 id 1 := temp2 x:=x+y*2 22 11

Otimizador de código Otimização do código intermediário temp1 := id 2 * 2 temp2 := id 1 + temp1 id 1 := temp2 temp1 := id 2 * 2 id 1 := id 1 + temp1 x:=x+y*2 23 Gerador de código Geração do código para a máquina-alvo temp1 := id 2 * 2 id 1 := id 1 + temp1 MOV id 2 R1 MULT 2 R1 MOV id 1 R2 ADD R1 R2 MOV R2 id 1 24 12

Exemplo: compilação passo a passo program p1; var x: integer; begin read(x); x:=x*2; write(x); end. 25 Definição de linguagens de programação Definição de uma linguagem, ou manual de referência da linguagem Em geral, estruturas léxica e sintática são especificadas formalmente A semântica muitas vezes é descrita em língua natural Padrões internacionais ANSI American National Standards Institute ISO International Organization for Standardization 26 13

Passagens Passagem: leitura de um arquivo de entrada e escrita de um arquivo de saída Compiladores podem ter várias passagens Esquema anterior de compilação código-fonte código intermediário código-alvo Maior tempo de leitura e escrita Útil quando há pouca memória disponível, quando a linguagem é complexa ou quando se visa portabilidade Compilador de uma única passagem código-fonte código-alvo Todo processo de compilação em memória: dados de fases diferentes podem ser necessários para a compilação 27 Compilação em uma passagem Em geral, em compiladores de uma passagem, o analisador sintático é o chefe Gerencia todo o processo, ativando as etapas anteriores e posteriores Código é gerado na medida em que o programa é interpretado Processamento interleaved (vs. pipeline) 28 14

Sistemas correlatos Interpretadores: executam diretamente instrução por instrução do código-fonte Processadores de macros (por exemplo, defines em C) Montadores (assemblers): traduzem linguagem de montagem em linguagem de máquina Carregadores: alocação de instruções de programação e dados na memória Editores de ligação: criação de um único programa a partir de diversos programas compilados Pré-processadores: retiram comentários, podem processar macros, etc. Editores/IDE baseados em estrutura: indicam erros durante edição do programa, fazem code completion Depuradores Etc. 29 Interpretadores vs. compiladores Interpretadores Menores que os compiladores Mais adaptáveis a ambientes computacionais diversos Melhor diagnóstico de erro (interpretação linha a linha) Tempo de execução maior Instruções de um loop são analisadas e executadas N vezes! Javascript, Python, Perl Compiladores Compila-se uma única vez, executando-se quantas vezes se queira Tempo de execução menor C, Pascal Linguagens híbridas Java: compilada para um código intermediário/virtual (bytecodes), que, por sua vez, é interpretado (virtual machine).net: compilada para o código intermediário Microsoft Intermediate Language (MSIL), interpretado pela máquina virtual Common Language Runtime (CLR) 30 15

Classificação de compiladores Classificam-se compiladores em função de vários fatores Código que gera Para quem gera código Ambiente de execução Etc. 31 Classificação de compiladores Código que gera Linguagem de máquina pura Linguagem de máquina aumentada com rotinas do sistema operacional (acesso a BIOS, registradores, I/O) Abordagem mais comum Linguagem de montagem Linguagem de máquina virtual, em que as instruções são completamente virtuais e necessitam de posterior interpretação Exemplo? Código absoluto vs. relocável 32 16

Classificação de compiladores Para quem gera código Compilador auto-residente: executado na mesma máquina para a qual gerou código Traduz L para a máquina M, executando na máquina M Compilador cruzado: roda em uma máquina e produz código para outra Traduz L para a máquina M, mas executa na máquina R Compilador auto-compilável: compilador para uma linguagem X que é implementado na própria linguagem X Traduz L para a máquina M, e é implementado em L 33 Classificação de compiladores Diagramas-T Compilação de uma linguagem-fonte F para uma linguagem-alvo A, com um compilador implementado na linguagem L F L A 34 17

Classificação de compiladores Diagramas-T Úteis para esquematização dos compiladores X Y Y Z = X Z H H H A H = A H B B H H A B = A B H H H K K M 35 Ferramentas para compilação Compiler compilers Lex, Flex Yacc, Bison, JavaCC Muitos outros 36 18

Compilação: por que estudar? (parte 2) Várias aplicações e necessidades atuais Validação de arquiteturas diferenciadas de computadores Aceitação de novas linguagens de programação Otimização de código: celulares, sistemas embarcados, novas arquiteturas Teste de falhas/erros em software Busca for brechas/falhas de segurança em sistemas Efetividade de paralelismo (ambientes multicore) Melhor uso de memória (registradores, caches, memória RAM) Tradução entre sistemas diferentes, síntese de hardware (da especificação para o modelo) Interpretação de linguagens especiais: SQL, por exemplo Etc. 37 Exercício temas para pesquisar Para pesquisar em casa Quais as características de uma linguagem que determinam que ela deve ser compilada ou interpretada? O que é decompilação e quais seus passos básicos? 38 19