Download - Compiladores 1
INTRODUÇÃO À COMPILAÇÃO
Compiladores na visão do usuário
Ivan Ricarte
2008
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
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
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
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)
INTRODUÇÃO À COMPILAÇÃO
ExemploArquitetura de um processador hipotético
R0
R1
R2
R3
processadormemória
D0−D7
A0−A3
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.
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
INTRODUÇÃO À COMPILAÇÃO
ExemploUm programa desse processador
Linguagem simbólicaLOAD 10, R1LOAD 11, R2ADD R1, R2, R0STORE R0, 12
Linguagem demáquina00101001001011101001100001001100
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
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
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
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
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?
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)
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?
INTRODUÇÃO À COMPILAÇÃO
Atividades de um compilador
Arquivo de
origem
Arquivo de
destino
Estruturas
internasGramáticas
SínteseAnálise
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
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
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
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
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
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);
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
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
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
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);
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
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
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;
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
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
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;
}
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?
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?
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
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)
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’
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’
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’
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/