SlideShare uma empresa Scribd logo
1 de 22
Baixar para ler offline
1/22
Construção de Compiladores
Capítulo 1
Introdução
José Romildo Malaquias
Departamento de Computação
Universidade Federal de Ouro Preto
2014.2
2/22
1 Linguagens de programação
2 Compilação
3/22
Tópicos
1 Linguagens de programação
2 Compilação
4/22
Linguagens de programação
Os programadores escrevem instruções em várias linguagens de
programação:
algumas são diretamente compreensíveis por computadores,
outras requerem passos intermediários de tradução.
Três tipos gerais de linguagem:
Linguagens de máquina
Linguagens assembly (ou de montagem)
Linguagens de alto nível
5/22
Linguagens de máquina
Qualquer computador pode entender diretamente apenas sua própria
linguagem de máquina.
Essa é a linguagem natural do computador, definida pelo projeto de
hardware.
Em geral, as linguagens de máquina consistem em strings de números
(em última instância reduzidas a 1s e 0s) que instruem os computadores
a realizar suas operações mais elementares uma de cada vez.
Dependentes de máquina: uma linguagem de máquina é específica e
só pode ser utilizada em um tipo de computador.
Exemplo: somar o salário base às horas extras para calcular o salário
bruto:
+1300042774
+1400593419
+1200274027
6/22
Linguagens assembly
Abreviações em inglês que representam operações elementares formam
a base das linguagens assembly.
Programas tradutores chamados assemblers convertem programas em
linguagem assembly para a linguagem de máquina.
Exemplo: somar o salário base às horas extras para calcular o salário
bruto:
load salarioBase
add salarioExtra
store salarioBruto
7/22
Linguagens de alto nível
Instruções simples realizam tarefas substanciais.
Compiladores convertem programas em linguagem de alto nível para a
linguagem de máquina.
Permitem aos programadores escrever instruções parecidas com o
inglês cotidiano e contêm notações matemáticas comumente utilizadas.
C, C++, Java, linguagens .NET da Microsoft (por exemplo, Visual Basic,
Visual C++ e C#) estão entre as linguagens de programação de alto nível
mais amplamente utilizadas.
Exemplo: somar o salário base às horas extras para calcular o salário
bruto:
salarioBruto = salarioBase + salarioExtra
8/22
Tópicos
1 Linguagens de programação
2 Compilação
9/22
Compilação
Um compilador traduz (compila) um programa escrito em uma
linguagem de programação de alto nível que é adequada para
programadores humanos para a linguagem de máquina que é requerida
pelo computador.
Impacto do uso de uma linguagem de alto nível para programação no
desenvolvimento:
notação mais próxima da maneira como humanos pensam sobre problemas
o compilador pode detectar alguns erros de programação óbvios
programas tendem a ser menores
O processo de compilação de um programa de linguagem de alto nível
em linguagem de máquina pode consumir uma quantidade considerável
de tempo do computador.
Interpretadores executam linguagem de alto nível diretamente, embora
sejam mais lentos que programas compilados.
O Java utiliza uma combinação inteligente de compilação e interpretação
para executar programas.
10/22
Processores de linguagem: compiladores
Definition 1 (Compilador)
Um compilador é um programa de computador (ou um grupo de programas)
que, a partir de um código fonte escrito em uma linguagem compilada, cria
um programa semanticamente equivalente, porém escrito em outra
linguagem, código objeto.
compilador
programa fonte
programa objeto
linguagem fonte
linguagem objeto
11/22
Processadores de linguagem: execução
Quando o programa objeto é um programa em linguagem de máquina
executável, ele poderá ser chamado pelo usuário para processar entradas e
produzir saídas.
programa objeto
entrada saída
12/22
Processadores de linguagem: interpretador
Definition 2 (Interpretador)
Interpretador é um processador de linguagem que recebe como entrada um
programa em uma linguagem de programação e executa diretamente as
operações especificadas no programa sobre as entradas fornecidas pelo
usuário.
interpretador
entrada saída
programa fonte
13/22
Processadores de linguagem: compilação +
interpretação
Um programa fonte pode ser primeiramente compilado para uma linguagem
intermediária, e o codigo intermediário gerado é então interpretado por uma
máquina virtual.
compilador
programa fonte
programa objeto
linguagem fonte
linguagem objeto
interpretador
entrada saída
14/22
Comparação de compilação e interpretação
As etapas de análise são comuns a interpretadores compiladores.
Ao invés de gerar código a partir da árvore abstrata, um interpretador
processa diretamente a árvore abstrata para avaliar expressões e
executar comandos.
Um interpretador pode precisar processar o mesmo trecho de código
várias vezes (em um loop, por exemplo), tipicamente fazendo com que a
interpretação seja menos eficiente do que a execução de um programa
compilado.
Escrever um interpretador frequentemente é mais simples do que
escrever um compilador.
Um interpretor pode ser mais facilmente transferido de uma plataforma
para outra.
Assim interpretadores são frequentemente usados para aplicações onde
velocidade não é essencial.
15/22
Porque estudar compiladores?
Construir um grande e ambicioso sistema de software.
Ver a aplicação da teoria na prática.
Aprender a projetar linguagens de programação.
Aprender como os processadores de linguagens funcionam.
16/22
Breve histórico de compiladores
Inicialmente não havia nada.
Então, criou-se linguagens de máquinas.
Então, criou-se linguagens de montagem (assembly).
Então, criou-se linguagens de alto nível.
17/22
Estrutura de um compilador moderno
Front-end:
Análise léxica: identifca símbolos que compõem o programa.
Análise sintática: identica como estes símbolos se relacionam entre si.
Análise semântica: identifica o significado destas relações.
Geração de código intermediário: produz a estrutura na representação
intermediária.
Back-end:
Otimização do código intermediário: simplifica as estruturas
intermediárias geradas.
Geração de código objeto: produz a estrutura na linguagem objeto.
Otimização de código objeto: melhora a estrutura produzida.
18/22
Estrutura de um compilador moderno (cont.)
analisador léxico
analisador sintático
analisador semântico
gerador de código intermediário
otimizador de código intermediário
gerador de código objeto
otimizador de código objeto
código fonte
código objeto
19/22
Estrutura de um compilador moderno (cont.)
do {
int x = a + b;
y += x;
} while (y < z);
T_Do
T_OpenBrace
T_Int
T_Identifier x
T_Assign
T_Identifier a
T_Plus
T_Identifier b
T_Semicolon
T_Identifier y
T_PlusAssign
T_Identifier x
T_Semicolon
T_CloseBrace
T_While
T_LeftParen
T_Identifier y
T_Less
T_Identifier z
T_RightParen
T_Semicolon
Do
<
z
y
Sequence
=
+
x
y
y
=
+
b
a
x
análise
léxica
análise
sintática
análise
semântica
20/22
Estrutura de um compilador moderno (cont.)
Do void
< bool
z int
y int
Sequence void
= int
+ int
x int
y int
y int
= int
+ int
b int
a int
x int
análise
semântica
geração de
código
intermediário
21/22
Estrutura de um compilador moderno (cont.)
loop: x = a + b
y = x + y
_t1 = y < z
if _t1 goto loop
x = a + b
loop: y = x + y
_t1 = y < z
if _t1 goto loop
add $1m $2m $3
loop: add $4, $1, $4
slt $6, $1, $5
beq $6, loop
add $1m $2m $3
loop: add $4, $1, $4
blt $1, $5, loop
geração de código intermediário
otimização do código intermediário
geração de código objeto
otimização do código objeto
22/22
Fim

Mais conteúdo relacionado

Semelhante a Construção de compiladores - introducao Compilador.pdf

Conceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoConceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoJorge Cardoso
 
Linguágens de programação
Linguágens de programaçãoLinguágens de programação
Linguágens de programaçãoAlbertoVach
 
Algoritmia para o site do 10gi marcelo e ricardo
Algoritmia para o site do 10gi marcelo e ricardoAlgoritmia para o site do 10gi marcelo e ricardo
Algoritmia para o site do 10gi marcelo e ricardozedaesquina98
 
Plataforma net pdf
Plataforma net pdfPlataforma net pdf
Plataforma net pdfAPlima
 
Aula 03 isc -softwares-hardwares-arquiteturas
Aula 03   isc -softwares-hardwares-arquiteturasAula 03   isc -softwares-hardwares-arquiteturas
Aula 03 isc -softwares-hardwares-arquiteturasFábio Andrade
 
Programando em python introducao
Programando em python   introducaoProgramando em python   introducao
Programando em python introducaosamuelthiago
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para LinuxChris x-MS
 
Jogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpJogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpMarcio Chiaveli
 
Jogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpJogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpPedro Vuvu Alvaro
 
Programação de Microprocessadores
Programação de MicroprocessadoresProgramação de Microprocessadores
Programação de MicroprocessadoresDiogo Silva
 
LIA - Linguagem Interpretada de Algoritmos
LIA - Linguagem Interpretada de AlgoritmosLIA - Linguagem Interpretada de Algoritmos
LIA - Linguagem Interpretada de AlgoritmosRafael Martins
 
Aula 03 - Interpretador [mr_@@@@@].pdf
Aula 03 - Interpretador [mr_@@@@@].pdfAula 03 - Interpretador [mr_@@@@@].pdf
Aula 03 - Interpretador [mr_@@@@@].pdfmouzinhoconcursos
 

Semelhante a Construção de compiladores - introducao Compilador.pdf (20)

Apostila c
Apostila cApostila c
Apostila c
 
Software
SoftwareSoftware
Software
 
Conceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoConceitos Fundamentais de Programacao
Conceitos Fundamentais de Programacao
 
Linguagem da programação
Linguagem da programaçãoLinguagem da programação
Linguagem da programação
 
Linguagem da programação
Linguagem da programaçãoLinguagem da programação
Linguagem da programação
 
Apostila de C# & Asp.Net
Apostila de C# & Asp.NetApostila de C# & Asp.Net
Apostila de C# & Asp.Net
 
Linguágens de programação
Linguágens de programaçãoLinguágens de programação
Linguágens de programação
 
Algoritmia para o site do 10gi marcelo e ricardo
Algoritmia para o site do 10gi marcelo e ricardoAlgoritmia para o site do 10gi marcelo e ricardo
Algoritmia para o site do 10gi marcelo e ricardo
 
Apostila complementar
Apostila complementarApostila complementar
Apostila complementar
 
Plataforma net pdf
Plataforma net pdfPlataforma net pdf
Plataforma net pdf
 
Aula 03 isc -softwares-hardwares-arquiteturas
Aula 03   isc -softwares-hardwares-arquiteturasAula 03   isc -softwares-hardwares-arquiteturas
Aula 03 isc -softwares-hardwares-arquiteturas
 
Programando em python introducao
Programando em python   introducaoProgramando em python   introducao
Programando em python introducao
 
Aula de C para Linux
Aula de C para LinuxAula de C para Linux
Aula de C para Linux
 
Jogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpJogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharp
 
Jogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharpJogos pe logica_aplicada_apostila_c_sharp
Jogos pe logica_aplicada_apostila_c_sharp
 
Programação de Microprocessadores
Programação de MicroprocessadoresProgramação de Microprocessadores
Programação de Microprocessadores
 
LIA - Linguagem Interpretada de Algoritmos
LIA - Linguagem Interpretada de AlgoritmosLIA - Linguagem Interpretada de Algoritmos
LIA - Linguagem Interpretada de Algoritmos
 
Aula01 - Analise e Programação
Aula01 - Analise e ProgramaçãoAula01 - Analise e Programação
Aula01 - Analise e Programação
 
Aula 03 - Interpretador [mr_@@@@@].pdf
Aula 03 - Interpretador [mr_@@@@@].pdfAula 03 - Interpretador [mr_@@@@@].pdf
Aula 03 - Interpretador [mr_@@@@@].pdf
 
Hardware
HardwareHardware
Hardware
 

Construção de compiladores - introducao Compilador.pdf

  • 1. 1/22 Construção de Compiladores Capítulo 1 Introdução José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2014.2
  • 2. 2/22 1 Linguagens de programação 2 Compilação
  • 3. 3/22 Tópicos 1 Linguagens de programação 2 Compilação
  • 4. 4/22 Linguagens de programação Os programadores escrevem instruções em várias linguagens de programação: algumas são diretamente compreensíveis por computadores, outras requerem passos intermediários de tradução. Três tipos gerais de linguagem: Linguagens de máquina Linguagens assembly (ou de montagem) Linguagens de alto nível
  • 5. 5/22 Linguagens de máquina Qualquer computador pode entender diretamente apenas sua própria linguagem de máquina. Essa é a linguagem natural do computador, definida pelo projeto de hardware. Em geral, as linguagens de máquina consistem em strings de números (em última instância reduzidas a 1s e 0s) que instruem os computadores a realizar suas operações mais elementares uma de cada vez. Dependentes de máquina: uma linguagem de máquina é específica e só pode ser utilizada em um tipo de computador. Exemplo: somar o salário base às horas extras para calcular o salário bruto: +1300042774 +1400593419 +1200274027
  • 6. 6/22 Linguagens assembly Abreviações em inglês que representam operações elementares formam a base das linguagens assembly. Programas tradutores chamados assemblers convertem programas em linguagem assembly para a linguagem de máquina. Exemplo: somar o salário base às horas extras para calcular o salário bruto: load salarioBase add salarioExtra store salarioBruto
  • 7. 7/22 Linguagens de alto nível Instruções simples realizam tarefas substanciais. Compiladores convertem programas em linguagem de alto nível para a linguagem de máquina. Permitem aos programadores escrever instruções parecidas com o inglês cotidiano e contêm notações matemáticas comumente utilizadas. C, C++, Java, linguagens .NET da Microsoft (por exemplo, Visual Basic, Visual C++ e C#) estão entre as linguagens de programação de alto nível mais amplamente utilizadas. Exemplo: somar o salário base às horas extras para calcular o salário bruto: salarioBruto = salarioBase + salarioExtra
  • 8. 8/22 Tópicos 1 Linguagens de programação 2 Compilação
  • 9. 9/22 Compilação Um compilador traduz (compila) um programa escrito em uma linguagem de programação de alto nível que é adequada para programadores humanos para a linguagem de máquina que é requerida pelo computador. Impacto do uso de uma linguagem de alto nível para programação no desenvolvimento: notação mais próxima da maneira como humanos pensam sobre problemas o compilador pode detectar alguns erros de programação óbvios programas tendem a ser menores O processo de compilação de um programa de linguagem de alto nível em linguagem de máquina pode consumir uma quantidade considerável de tempo do computador. Interpretadores executam linguagem de alto nível diretamente, embora sejam mais lentos que programas compilados. O Java utiliza uma combinação inteligente de compilação e interpretação para executar programas.
  • 10. 10/22 Processores de linguagem: compiladores Definition 1 (Compilador) Um compilador é um programa de computador (ou um grupo de programas) que, a partir de um código fonte escrito em uma linguagem compilada, cria um programa semanticamente equivalente, porém escrito em outra linguagem, código objeto. compilador programa fonte programa objeto linguagem fonte linguagem objeto
  • 11. 11/22 Processadores de linguagem: execução Quando o programa objeto é um programa em linguagem de máquina executável, ele poderá ser chamado pelo usuário para processar entradas e produzir saídas. programa objeto entrada saída
  • 12. 12/22 Processadores de linguagem: interpretador Definition 2 (Interpretador) Interpretador é um processador de linguagem que recebe como entrada um programa em uma linguagem de programação e executa diretamente as operações especificadas no programa sobre as entradas fornecidas pelo usuário. interpretador entrada saída programa fonte
  • 13. 13/22 Processadores de linguagem: compilação + interpretação Um programa fonte pode ser primeiramente compilado para uma linguagem intermediária, e o codigo intermediário gerado é então interpretado por uma máquina virtual. compilador programa fonte programa objeto linguagem fonte linguagem objeto interpretador entrada saída
  • 14. 14/22 Comparação de compilação e interpretação As etapas de análise são comuns a interpretadores compiladores. Ao invés de gerar código a partir da árvore abstrata, um interpretador processa diretamente a árvore abstrata para avaliar expressões e executar comandos. Um interpretador pode precisar processar o mesmo trecho de código várias vezes (em um loop, por exemplo), tipicamente fazendo com que a interpretação seja menos eficiente do que a execução de um programa compilado. Escrever um interpretador frequentemente é mais simples do que escrever um compilador. Um interpretor pode ser mais facilmente transferido de uma plataforma para outra. Assim interpretadores são frequentemente usados para aplicações onde velocidade não é essencial.
  • 15. 15/22 Porque estudar compiladores? Construir um grande e ambicioso sistema de software. Ver a aplicação da teoria na prática. Aprender a projetar linguagens de programação. Aprender como os processadores de linguagens funcionam.
  • 16. 16/22 Breve histórico de compiladores Inicialmente não havia nada. Então, criou-se linguagens de máquinas. Então, criou-se linguagens de montagem (assembly). Então, criou-se linguagens de alto nível.
  • 17. 17/22 Estrutura de um compilador moderno Front-end: Análise léxica: identifca símbolos que compõem o programa. Análise sintática: identica como estes símbolos se relacionam entre si. Análise semântica: identifica o significado destas relações. Geração de código intermediário: produz a estrutura na representação intermediária. Back-end: Otimização do código intermediário: simplifica as estruturas intermediárias geradas. Geração de código objeto: produz a estrutura na linguagem objeto. Otimização de código objeto: melhora a estrutura produzida.
  • 18. 18/22 Estrutura de um compilador moderno (cont.) analisador léxico analisador sintático analisador semântico gerador de código intermediário otimizador de código intermediário gerador de código objeto otimizador de código objeto código fonte código objeto
  • 19. 19/22 Estrutura de um compilador moderno (cont.) do { int x = a + b; y += x; } while (y < z); T_Do T_OpenBrace T_Int T_Identifier x T_Assign T_Identifier a T_Plus T_Identifier b T_Semicolon T_Identifier y T_PlusAssign T_Identifier x T_Semicolon T_CloseBrace T_While T_LeftParen T_Identifier y T_Less T_Identifier z T_RightParen T_Semicolon Do < z y Sequence = + x y y = + b a x análise léxica análise sintática análise semântica
  • 20. 20/22 Estrutura de um compilador moderno (cont.) Do void < bool z int y int Sequence void = int + int x int y int y int = int + int b int a int x int análise semântica geração de código intermediário
  • 21. 21/22 Estrutura de um compilador moderno (cont.) loop: x = a + b y = x + y _t1 = y < z if _t1 goto loop x = a + b loop: y = x + y _t1 = y < z if _t1 goto loop add $1m $2m $3 loop: add $4, $1, $4 slt $6, $1, $5 beq $6, loop add $1m $2m $3 loop: add $4, $1, $4 blt $1, $5, loop geração de código intermediário otimização do código intermediário geração de código objeto otimização do código objeto