Upload
becky
View
38
Download
0
Embed Size (px)
DESCRIPTION
Introdução a Compiladores. Visão Macro Cláudio, Ibraim, Robson, Rafael. O PROBLEMA: IMPLEMENTAR linguagens de ALTO NÍVEL em um computador cuja linguagem de máquina é de NÍVEL MUITO MAIS BAIXO. A SOLUÇÃO: TRADUZIR essas LINGUAGENS usando a própria LINGUAGEM DE MÁQUINA DA CPU. TRADUTOR. - PowerPoint PPT Presentation
Citation preview
O PROBLEMA:
IMPLEMENTAR linguagens de ALTO NÍVEL em um computador cuja linguagem de
máquina é de NÍVEL MUITO MAIS BAIXO.
A SOLUÇÃO:TRADUZIR essas LINGUAGENS usando a
própria LINGUAGEM DE MÁQUINA DA CPU.
TRADUTOR
É um programa que traduz um programa fonte escrito em uma linguagem qualquer (linguagem fonte) para um programa objeto equivalente escrito em outra linguagem (linguagem objeto)
Linguagem Fonte
Tradutor Linguagem Objeto
COMPILADOR
É um TRADUTOR em que a LINGUAGEM FONTE é uma linguagem DE ALTO NÍVEL e a LINGUAGEM OBJETO é uma linguagem DE BAIXO NÍVEL (assembly ou máquina)
Linguagem Fonte
(Alto Nível)
Compilador
Linguagem Objeto
(assembly ou máquina)
Programa FonteCompilador
Análise
Síntese
Análise Léxica
Análise Sintática
Análise Semântica
Geração de Código Intermediário
Otimização de Código
Geração de Código
Programa Objeto
DESCOMPILADOR
É um programa que realiza a OPERAÇÃO INVERSA do COMPILADOR, ou seja, da LINGUAGEM OBJETO ele EXTRAI a LINGUAGEM FONTE.
Linguagem Fonte
(Alto Nível)
Descompilador
Linguagem Objeto
(assembly ou máquina)
INTERPRETADOR
• Processa o código fonte, analisando um comando a cada vez que esse deve ser executado.
• Processamento é feito junto os dados de entrada, em tempo de execução.
• Não produz um programa objeto.
1
Obter o próximo comando a ser
executado.
3
Executar a ação.Tratar o
resultado.
2
Determinar a ação a ser executada.
Buscar os dados necessários.
Vantagens Desvantagens
Compiladores Execução mais rápida Várias etapas de tradução
Permite a otimização do código fonte
Necessita de mais memória para a sua execução
Programa fonte não precisaser fornecido ao utilizador
Processo de correção de erros e depuração é mais demorado
Interpretadores Depuração do programa é mais simples
Execução do programa é mais lenta
Consome menos memória
Resultado imediato doprograma ou rotinadesenvolvida
Necessário fornecer o programa fonte ao utilizador
MONTADOR (assembler)
• É um tradutor que mapeia instruções em linguagem simbólica (assembly) para instruções de linguagem de máquina.
• Geralmente os comandos seguem a relação 1:1.
• Alguns compiladores produzem esse trabalho diretamente.
MONTADOR (assembler)
Linguagem simbólica
MontadorLinguagem de
máquina
Jasmin (Java Assembler Interface)
• Montador de assembly JVM para arquivos class.
• Recebe um arquivo texto como entrada.
Linguagem simbólica
Jasmin .class
DESMONTADOR (dissassembler)
• Um desmontador é um programa que converte código de máquina em código de montagem (assembly).
• Constantes simbólicas, comentários e rótulos de endereçamento não são recuperados.
MÁQUINA VIRTUAL
• Uma máquina virtual é um computador fictício criado por um programa de simulação. Estes programas podem simular um computador de arquitetura diferente.
• Um bom exemplo para maquina virtual no contexto de compiladores e a JVM
COMPILADOR HÍBRIDO
• Um compilador é um programa que, a partir de um código escrito em uma linguagem cria um programa semanticamente equivalente, porém escrito em outra linguagem.
• Um compilador hibrido tem o papel de converter o código fonte em um código chamado de bytecode, que é uma linguagem de baixo nível.
COMPILADOR HÍBRIDO
• O bytecode irá ser interpretado numa máquina virtual, que fará a execução. O
• bytecode é um estágio intermédio entre o código-fonte e a aplicação final.
CARREGADOR
• O carregador coleta os programas traduzidos separadamente e liga-os em um único módulo e depois carrega o modulo absoluto na memória principal, substituindo os endereços relativos ao módulo de carga por endereços reais de memória.
Editordisco
O programa é criado em um editor e armazenado no disco
Compiladordisco
Compilador gera os bytecodes e os armazena no disco
Carregador de classes
disco
O carregador de classes coloca os bytecodes na memória
______________________________
memória
Verificador de bytecodes
O verificador de bytecodes confirma se todos os bytecodes estão corretos e se não violam as restrições de segurança da linguagem Java
______________________________
memória
Interpretador O interpretador lê os bytecodes e executa o programa
______________________________
memória
Pro
cess
o de
Exe
cuçã
o
COMPILER-TO-COMPILER
• São softwares capaz de gerar através de outras linguagens de alto nível outros compiladores
• Exemplo o JavaCC, que passo o código fonte para Java e depois segue o fluxo normal de um programa na plataforma.
EXTENSÕES DE ARQUIVOS
• Arquivos .java– Arquivos utilizado na construção de programas na
linguagem java.
• Arquivos .class– Arquivos pré-compilados– Arquivos a serem interpretados pela JVM
• Arquivos .jj– Geração de novas linguagens.
• Arquivos .j– Similar a assembly.
Linguagem fonte, Intermediária e Destino.
• Fonte– Linguagem de fácil interpretação para um
programador.– Linguagem não compilada.
• Intermediária– Linguagem pré-compilada– Bytecode– Interpretada pela Máquina Virtual
• Linguagem destino– Geralmente linguagem de máquina.
Exemplos de arquivos 1/6
• Extensão .javapublic class Exemplo01 {
public static void main(String args[]) { double a,b; a = 40 + 30; b = a + 20; }}
Exemplos de arquivos 2/6• Extensão .jj
/* Analex.jj - Analisador Léxico */options { JDK_VERSION = "1.5"; DEBUG_PARSER = false; DEBUG_TOKEN_MANAGER = false;}PARSER_BEGIN(Analex)import java.io.*;public class Analex { public static void main(String args[]) throws ParseException { try { Analex x = new Analex(new FileInputStream(args[0])); x.S(); } catch(FileNotFoundException e) { System.out.println("Arquivo não encontrado"); } }}
Exemplos de arquivos 3/6PARSER_END(Analex) SKIP : { " " | "\t" | "\r" | "\n" } SKIP : { "/*" : comentario}<comentario> SKIP: { "*/" : DEFAULT | <~[]>} TOKEN [IGNORE_CASE] : { < BREAK: "break" >} TOKEN : { < IDENT: "_"(["a"-"z","A"-"Z","_","0"-"9"] )* > | < INT: (["0"-"9"])+("L"|"l")? > }
Exemplos de arquivos 4/6TOKEN: { < VOGAIS: (["a","e","i","o","u"]){3} > | < ARQ: "\"" ((~[".", ":", ";", "\\"]) {1,8} ( "." (~[".", ":", ";", "\\"]){1,3})?) "\"" >} JAVACODE void S(){ Token t; do { t = getNextToken(); System.out.println(tokenImage[t.kind]+"\t"+t.image); } while(t.kind != EOF); }
Exemplos de arquivos 5/6• Arquivo fonte:
a := XIX + IV + II; b := XXXVIII; soma := a + b; exibe soma;
• Arquivo '.j' .source prog_destino.java
.class public prog_destino .super java/lang/Object .method public <init>()V .limit stack 1 .limit locals 1 aload_0 invokespecial java/lang/Object/<init>()V return .end method
Exemplos de arquivos 6/6 .method public static main([Ljava/lang/String;)V .limit stack 4 .limit locals 100 ldc2_w 19.0 ldc2_w 4.0 dadd ldc2_w 2.0 dadd dstore 1 ldc2_w 38.0 dstore 3 dload 1 dload 3 dadd dstore 5 getstatic java/lang/System/out Ljava/io/PrintStream; dload 5 invokevirtual java/io/PrintStream/println(D)V return .end method
• Execução:63.0