41
I NTRODUÇÃO À COMPILAÇÃO Compiladores na visão do usuário Ivan Ricarte 2008

Compiladores 1

Embed Size (px)

DESCRIPTION

Material de apoio do livro Introdução à Compilação

Citation preview

Page 1: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Compiladores na visão do usuário

Ivan Ricarte

2008

Page 2: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Sumário

Compiladores na programaçãoA linguagem dos processadoresLinguagens de alto nível

Compiladores no processamento da informaçãoProcessamento de arquivos XMLPáginas dinâmicas na Web

Atividades de um compiladorLeitura de arquivo de origemEscrita de arquivos de destinoInteração com arquivos padrão

Exemplos de compiladoresCompilador C++Exemplo de processamento XML

Sugestões de leitura

Page 3: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Para que compiladores?A programação antes dos compiladores

Programador

Computador Z

Programador

Computador X

Programador

Computador Y

SUM A,B,C

C = A + B!

Load A

Add B

Store C

add C,A,B

Page 4: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Para que compiladores?A programação com os compiladores

REAL A,B,C

C = A + B

genérico

Tradutor

Tradutor

Tradutor

Y

Z

X

Programador

Load A

Add B

Store C

C = A + B!

add C,A,B

SUM A,B,C

Page 5: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

A linguagem dos processadores

I Cada processador tem seu próprio jogo de instruçõesI Instruções refletem as características peculiares de cada

processador — sua arquiteturaI Para cada instrução, duas representações

Linguagem de máquina: seqüência de bits que codificainstrução no formato apropriado para ainterpretação pelos circuitos

Linguagem simbólica: representação mnemônica (textual)

Page 6: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

ExemploArquitetura de um processador hipotético

R0

R1

R2

R3

processadormemória

D0−D7

A0−A3

Page 7: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

ExemploInstruções desse processador

LOAD para transferir o conteúdo de uma posição dememória para um registrador.

STORE para transferir o conteúdo de um registrador parauma posição de memória.

ADD para adicionar o conteúdo de dois registradores earmazenar o resultado em outro registrador.

BZERO para mudar o conteúdo do contador de programaspara a posição de memória especificada se oconteúdo do registrador indicado for igual a zero.

Page 8: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

ExemploCaracterísticas do processador e impacto no formato da instrução de máquina

I Quatro instruções⇒ Código de operação de dois bits:

LOAD 00STORE 01

ADD 10BZERO 11

I Quatro registradores de dados (além de outros nãorepresentados)⇒ Endereços de registradores ocupam dois bits

I Capacidade de endereçar 16 posições de memória⇒ endereços de memória ocupam quatro bits

I Palavras de oito bits⇒ nenhum impacto

Page 9: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

ExemploUm programa desse processador

Linguagem simbólicaLOAD 10, R1LOAD 11, R2ADD R1, R2, R0STORE R0, 12

Linguagem demáquina00101001001011101001100001001100

Page 10: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Linguagens de alto nível

I Permitem expressar os comandos de forma independentedo processador

I Comandos em linguagem mais próxima da humanaI Variações nas linguagens de acordo com seu objetivo

FORTRAN Programação científicaC, C++ Programação de sistemasPascal Programação estruturada

lisp Processamento simbólico

Page 11: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Papel dos compiladores

CompiladorPrograma que realiza a tradução de um programa em umalinguagem para um programa equivalente em outra linguagem

I Tipicamente: linguagem de alto nível→ linguagem demáquina

I mas também: linguagem de alto nível→ linguagemintermediária

I ou: linguagem intermediária→ linguagem de máquinaI ou ainda: linguagem de script→ linguagem de alto nível

Page 12: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Compiladores no processamento da informação

I Compiladores traduzem descrições de uma linguagempara outra

I Mesmo tipo de processamento está presente emaplicações que processam arquivos com informações

I Processamento de arquivos XMLI Processamento de páginas dinâmicas para a Web

Page 13: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Processamento de arquivos XML

XMLeXtensible Markup Language

I Aplicações em troca de informações entre processosdistribuídos, em manutenção de arquivos de configuraçãoe em representação de textos

I Arquivo organizado em elementos definidos pormarcações e, eventualmente, conteúdos

I Existem regras básicas de formação para esses arquivosI Esquemas podem restringir como esses elementos podem

ser combinados

Page 14: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Exemplo de arquivo XML

<livro><titulo>Dom Casmurro</titulo><autor>Machado de Assis</autor><ano>1900</ano>

</livro>

Como se compara o processamento desse arquivo àcompilação de um programa em linguagem de alto nível?

Page 15: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Páginas dinâmicas na Web

I Página dinâmica é criada no momento do atendimento auma solicitação, a partir de uma descrição genérica quedeve ser processada

I Tipicamente, descrição contém diretivas em umalinguagem de script que geram os conteúdosapresentados

I O resultado desse processamento é um arquivo comconteúdo em HTML (Hypertext Markup Language)

Page 16: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Exemplo de especificação de página dinâmica

<csp><@ #include ... %><% // código C ... %><html>

Conteúdo em HTMLcom <%= código C %>

</html></csp>

Como se compara o processamento desse arquivo àcompilação de um programa em linguagem de alto nível?

Page 17: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Atividades de um compilador

Arquivo de

origem

Arquivo de

destino

Estruturas

internasGramáticas

SínteseAnálise

Page 18: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Análise

Análise léxicaIdentificação dos elementos básicos da linguagem a partir doscaracteres individuais do arquivo fonte

Análise sintáticaReconhecimento, a partir dos elementos básicos, da estruturade comandos básicos, de blocos de comandos, de funções, deprogramas

Page 19: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Síntese

Geração de códigoProdução do código equivalente ao programa original a partirda estrutura construída na análise sintática

OtimizaçãoReorganização do código gerado para eliminar redundâncias emelhorar desempenho

Page 20: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Geração do código executável

I O compilador utiliza outros programas do sistema paraproduzir o código executável a partir do código emlinguagem simbólica

Montador Tradução do código em linguagem simbólicapara o código de máquina

Ligador Combinação de códigos de máquina dediferentes módulos num único módulo

Page 21: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Necessidade de manipulação de arquivos

I Entrada e saída para o compilador são arquivosEntrada arquivo de texto com a especificação de alto

nível (código-fonte)Saída arquivo binário com o código executável em

linguagem de máquina (módulo objeto)I Outros arquivos temporários podem ser utilizados em

etapas intermediárias

Page 22: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Arquivos em C++

I As necessidades de um compilador relativas à interaçãocom arquivos restringem-se ao acesso seqüencial

I Para tal fim, C++ trabalha com o conceito de streamsI Fontes ou destinos de dados acessados seqüencialmente

I Arquivos em disco podem ser manipulados como streams(fstream)

ifstream para leitura seqüencial de arquivosofstream para escrita seqüencial de arquivos

Page 23: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Leitura de arquivos

I Inicialmente, é preciso associar o arquivo ao objeto(variável) que será a ele associadoCom o construtor

ifstreamnomeVariavel(nomeArquivo);

Com o método openifstream nomeVariavel;...nomeVariavel.open(nomeArquivo);

Page 24: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Modo de abertura

I O modo padrão para abertura de um arquivo é considerarque seu conteúdo é texto

I Se conteúdo é binário, é preciso indicar esse fato naabertura do arquivo

I Especificar o flag ios::binary como segundoargumento do construtor ou do método open

Page 25: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Leitura do conteúdo do arquivoModo texto

I Para a leitura de caracteres de um arquivo texto (ifstream)Operador >> lê conteúdo com interpretação de formato,

ignorando espaços em brancoMétodo get lê cada caráter do arquivo sem interpretação,

retornando o valor inteiro do código ASCIIcorrespondente

Método getline lê um bloco (uma linha) de caracteres paraum arranjo de caracteres especificado peloprogramador

Page 26: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Leitura do conteúdo do arquivoModo binário

I Para leitura de seqüências de bits de um arquivoMétodo read lê um bloco de bytes para um arranjo

especificado pelo programador

eofQualquer que seja o tipo de conteúdo do arquivo, o métodoeof retorna true quando o final do arquivo é alcançado

Page 27: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Escrita de arquivos de destino

I Também é preciso associar o arquivo a um objetoCom o construtor

ofstreamnomeVariavel(nomeArquivo);

Com o método openofstream nomeVariavel;...nomeVariavel.open(nomeArquivo);

Page 28: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Escrita do conteúdo em disco

I Para ofstream, outros especificadores além deios::binary podem ser indicados na abertura doarquivo

I Caso arquivo já existaios::app agrega novo conteúdo ao conteúdo já

existenteios::trunc substitui conteúdo existente pelo novo

conteúdo

Page 29: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Escrita do conteúdo em disco

I Operações para realizar a escrita no arquivo:Operador << formata (transforma valores de variáveis em

caracteres)Método put escreve um caráter, sem interpretaçãoMétodo write escreve um bloco de dados, sem

interpretaçãoMétodo flush descarrega o buffer interno de dados para o

arquivo

Page 30: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Interação com arquivos padrão

I Todo programa ao executar inicia com três streamsassociados

cin arquivo padrão para entrada de caracteres(ifstream)

cout arquivo padrão para saída de caracteres(ofstream)

cerr arquivo padrão para saída de mensagens deerro (ofstream)

I Para usá-los:#include <iostream>using namespace std;

Page 31: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Exemplo de compilador C++: gcc/g++

I Compilador C/C++ do Projeto Gnu, para ambientes do tipounix

I Invocado sem outros argumentos a não ser o nome doarquivo, realiza quatro tarefas

1. Pré-processamento (invoca programa cpp)2. Compilação3. Montagem (invoca programa as)4. Ligação (invoca programa ld)

I Resultado final é a criação de um arquivo executável nodisco (a.out)

I Nome padrão pode ser alterado com a chave -o

Page 32: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Processamento parcial

I Processamento pode ser interrompido após cada uma dasetapas intermediárias por meio do uso de outras chavespara o programa

1. Após pré-processamento: chave -EI Resultado é direcionado para a saída padrão

2. Após compilação propriamente dita: chave -SI Resultado (arquivo texto, assembly) é criado num arquivo

em disco com mesmo nome do arquivo de entrada mas comextensão .s

3. Após montagem: chave -cI Resultado é criado num arquivo binário (código objeto) em

disco com extensão .o

Page 33: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Indicação de erros de compilação

Considere a compilação do seguinte programa (hello.cpp):

#include <iostream>using namespace std;int main() {cout << "Oi, gente!" << endl;

}

Page 34: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Indicação de erros de compilação

Omissão de ; na quarta linha:

hello.cpp: In function ‘int main()’:hello.cpp:5: parse error before ‘}’ token

Por que o compilador gerou essa mensagem?

Page 35: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Indicação de erros de compilação

Omissão de " de abertura na quarta linha:

hello.cpp: In function ‘int main()’:hello.cpp:4: ‘Oi’ undeclared (first use this function)hello.cpp:4: (Each undeclared identifier is reported

only once for each function it appears in.)hello.cpp:4: ‘gente’ undeclared (first use this

function)hello.cpp:4: parse error before ‘!’ tokenhello.cpp:4:21: warning: multi-line string literals

are deprecatedhello.cpp:4:21: missing terminating " characterhello.cpp:4:21: possible start of unterminated string

literal

Por que o compilador gerou essas mensagens?

Page 36: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Exemplo de processamento XML

I Analisador Xerces-CI Suíte de aplicativos para processamento de arquivos com

conteúdo em XMLI Exemplo

SAXCount se arquivo estiver correto, indica quantoselementos XML foram reconhecidos

Page 37: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Exemplo

Arquivo livros.xml:

<livros><livro><título>Dom Casmurro</título><autor>Machado de Assis</autor><ano>1900</ano>

</livro><livro>

<título>As Intermitências da Morte</título><autor>José Saramago</autor><ano>2005</ano>

</livro></livros>

Resultado:livros.xml: 1 ms (9 elems, 0 attrs, 0 spaces, 118 chars)

Page 38: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Indicação de erros

Troca de primeiro livro por lirvo:

Fatal Error at file livros.xml, line 6, char 5Message: Expected end of tag ’lirvo’

Page 39: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Indicação de erros

Omissão da primeira marcação /livro:

Fatal Error at file livros.xml, line 11, char 8Message: Unterminated end tag, ’livro’

Page 40: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Indicação de erros

Omissão da marcação /livros:

Fatal Error at file livros.xml, line 13, char 1Message: The input ended before all started

tags were ended. Last tag startedwas ’livros’

Page 41: Compiladores 1

INTRODUÇÃO À COMPILAÇÃO

Sugestões de leitura (Web)

I C++Referência http://www.cppreference.com/

Compilador http://gcc.gnu.org/

I XMLReferência http://www.w3.org/XML/Analisador http:

//xerces.apache.org/xerces-c/