Buscar

Exercício introdutório a compiladores

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 6 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 6 páginas

Prévia do material em texto

TAREFA: Exercícios Introdução 1
TAREFA: Exercícios Introdução
Exercícios Propostos
1. (Price, 2005) No contexto de implementação de linguagens de 
programação, dê o significado dos seguintes termos:
Linguagem de máquina
A linguagem de máquina é a linguagem de mais baixo nível de entendimento pelo 
ser humano e a única, na verdade, entendida pelo processador. É constituída 
inteiramente de números, o que torna praticamente impossível entendê-la 
diretamente. Cada processador tem seu conjunto único de instruções que definem 
sua linguagem de máquina, estabelecido pelo fabricante do chip. Uma instrução 
típica em linguagem de máquina seria algo como: 0100 1111 1010
Essa linguagem é também classificada como uma linguagem de primeira geração.
Pré-compiladores
Pré-compilador é o programa responsável por mudanças no código fonte 
destinadas de acordo com decisões tomadas em tempo de compilação. Por 
exemplo, um programa na linguagem de programação C permite instruções 
condicionais para o pré-compilador que podem incluir ou não parte do código caso 
uma assertiva lógica seja verdadeira ou falsa, ou simplesmente um termo esteja 
definido ou não.
Interpretadores
Interpretador é outro tipo comum de processador de linguagem, mas em vez de 
produzir um programa objeto como resultado da tradução, um interpretador executa 
diretamente as operações especificadas no programa fonte sobre as entradas 
fornecidas pelo usuário.
Compiladores (Tradutores)
Compilador é o programa que recebe como entrada um programa em uma 
linguagem de programação - a linguagem fonte - e o traduz para um programa 
equivalente em outra linguagem - a linguagem objeto. Um papel importante do 
TAREFA: Exercícios Introdução 2
compilador é relatar quaisquer erros no programa fonte detectados durante esse 
processo de tradução.
Montadores (Assemblers)
Montador é o programa que faz a tradução entre uma linguagem de montagem 
(assembly) e o código de máquina. Muitos confundem os termos assembler (o 
programa montador) e assembly (a linguagem de montagem).
Ligadores (Linkers)
Resolve referências simbólicas cruzadas (cross-references) entre os códigos-
objeto.
Carregadores (Loaders)
Carrega segmentos (instruções e/ou dados) nos endereços de memória reservados 
e inicia execução.
2.  Descreva as tarefas efetuadas pelos seguintes programas, e 
explique como eles se assemelham ou se relacionam a 
compiladores:
Um pré-processador C
E um tradutor que efetuam conversões da linguagem C para a linguagem de 
máquina. Os récompiladores surgiram para facilitar a extensão de linguagens de 
alto nível existentes.
Um pretty-printer (formatador de programas)
Tem como finalidade formatar o texto, porém deve verificar se existe o tipo de fonte, 
o tamanho da fonte, o estilo, entre outros devem ser verificados para realizar a 
formatação.
Um colorizador de programas de um editor de texto
Um montador
São aqueles tradutores que mapeiam instruções em linguagem simbólica 
(assembly) para instruções em linguagem de máquina, geralmente, numa relação 
TAREFA: Exercícios Introdução 3
de um pra um, isto é, uma instrução de linguagem simbólica para uma instrução de 
máquina.
Um linkeditor do sistema operacional
Tem a função de efetuar a ligação dos módulos em código objeto e gerar um único 
programa executável.
3. (Aho, 2008) Qual é a diferença entre um compilador e um 
interpretador?
Compiladores são tipos de tradutores que possuem uma forma específica de 
conversão, visto que, atuam na transformação de uma linguagem de alto nível para 
uma linguagem de baixo nível - linguagem de máquina. Assim como o compilador, um 
interpretador analisa sintática e semanticamente um programa escrito em uma 
determinada linguagem de programação, mas no entanto, algumas diferenças são 
observadas, principalmente no que se refere à forma de se executar o programa em 
questão: o compilador executa o programa somente após ter traduzido o mesmo por 
inteiro; já o interpretador, lê, traduz e executa cada linha de código sequencialmente, 
ou seja, passo a passo; no compilador, há geração de um código de máquina ao final 
do processo de tradução; já no interpretador, não existe a criação de código 
executável.
4. (Price, 2005) Aponte as vantagens e desvantagens dos 
interpretadores em relação aos compiladores?
Vantagens dos compiladores:
1. a execução do programa é mais rápida;
2. estruturas de dados mais completas;
3. permitem a otimização de código fonte;
4. impossibilita ou pelo menos dificulta ser quebrado e visualizado o código fonte 
original.
Desvantagens dos compiladores:
1. várias etapas de tradução;
2. processo de correção de erro e de depuração é mais demorado;
TAREFA: Exercícios Introdução 4
3. programação final é maior, o que gera a necessidade de mais memória.
Vantagens dos interpretadores:
1. depuração é mais simples;
2. consomem menos memória;
3. resultado imediato do programa ou rotina desenvolvida.
Desvantagens dos interpretadores:
1. a execução do programa é mais lenta;
2. estrutura de dados demasiadamente simples;
3. necessário fornecer o programa fonte ao utilizador.
5. (Aho, 2008) Que vantagens existem em um sistema de 
processamento de linguagem no qual o compilador produz 
linguagem simbólica em vez de linguagem de máquina?
Uma linguagem de máquina é constituída inteiramente por códigos numéricos, 
representados por números hexadecimais ou binários, tornando as instruções 
praticamente impossíveis de serem compreendidas diretamente por humanos. Uma 
linguagem simbólica é constituída por mnemônicos, tornando as instruções mais 
compreensíveis por humanos. Considerando, por exemplo, o processador hipotético 
proposto por Ricarte (2008), a instrução em linguagem simbólica  LOAD 5, R1  é mais 
compreensível do que a instrução em linguagem de máquina  00010101 , apesar de 
ambas as instruções transferirem o conteúdo da posição de memória 5 para o 
registrador R1.
A linguagem de máquina é a linguagem utilizada pelo processador para efetuar 
diretamente o processamento, estando diretamente relacionada as características do 
processador. A linguagem simbólica, por sua vez, não é executada diretamente pelo 
processador, sendo portanto independente do processador, de modo que a linguagem 
simbólica possa ser traduzida para várias linguagens de máquina, possibilitando que os 
programas desenvolvidos possam ser executados em diversos processadores com 
características diferentes, denominado portabilidade. Esse é, por exemplo, o 
mecanismo utilizado pela linguagem de programação Java, que ao ser compilado não 
produz linguagem de máquina, mas uma linguagem simbólica chamada de bytecode, 
que é a linguagem reconhecida pela Máquina Virtual Java (JVM).
TAREFA: Exercícios Introdução 5
6. (Aho, 2008) Um compilador que traduz uma linguagem de alto 
nível para outra linguagem de alto nível é chamada de tradutor 
de fonte para fonte. Que vantagens existem em usar a linguagem 
de programação C como linguagem objeto para um compilador?
A vantagem é poder ter portabilidade, pois existem compiladores C para quase todas 
as arquiteturas computacionais conhecidas, uma vez que a linguagem de programação 
C é praticamente a mãe de todas as linguagens de programação modernas. Outra 
vantagem importante é o desempenho, uma vez que a linguagem de programação C 
permite o compartilhamento de recursos de alto e baixo nível, permitindo o acesso 
direto aos instruções do microprocessador.
7.(Price, 2005) Qual o significado de "passo" no processo de 
compilação? Quais as vantagens e desvantagens de implementar 
um compilador em vários passos?
Uma compilação pode ser realizada em um ou em vários passos. Entende-se por 
passo a passagem completa do compilador sobre o programa fonte que está sendo 
compilado. Em uma compilação em vários passos, a execução de um passo termina 
antes de iniciar-se a execução dos passos seguintes. Assim, o compilador de dois 
passos, por exemplo, poderia combinar a análise léxica e análise sintática num primeiro 
passoe a análise semântica e a geração de código num segundo passo.
De outra forma, pode-se utilizar o analisador sintático como módulo principal: para 
construir a árvore sintática, obtém os tokens necessários através de chamadas ao 
analisador léxico e chama o processo de geração de código para executar a análise 
semântica e geração de código objeto.
Os critérios para escolha da forma de implementação envolvem: memória disponível, 
tempo de compilação ou tempo de execução, características da linguagem, equipe de 
desenvolvimento, disponibilidade de ferramentas de apoio, e prazo de 
desenvolvimento.
A principal vantagem de se construir compiladores de vários passos é a modularização 
alcançada no projeto e na implementação dos processos que constituem o compilador.
A principal desvantagem é o aumento do projeto total, com a necessidade de 
introdução das linguagens (arquivos) intermediárias.
TAREFA: Exercícios Introdução 6
8.(Aho, 2008) Descreva algumas das tarefas que um programa 
montador precisa realizar.
O montador (assembler) é o programa do sistema responsável por traduzir o 
código assembly em linguagem de máquina, traduzindo cada instrução do programa 
para a sequência de bits que codifica a instrução de máquina. Como cada processador 
tem sua própria linguagem, montadores são específicos para processadores.
Em geral, montadores oferecem facilidades além da simples tradução de 
código assembly para código de máquina. Além das instruções do processador, um 
programa fonte para o montador pode conter diretivas ou pseudo-instruções definidas 
para o montador (e não para o processador), assim como macro-instruções, uma 
sequência de instruções que será inserida no código ao ser referenciada pelo nome.
Um montador que suporte a definição e utilização de macro-instruções é usualmente 
denominado um macro-montador (macro-assembler). Um montador multiplataforma 
(cross-assembler) é um montador que permite gerar código para um processador-alvo 
diferente daquele no qual o montador está sendo executado.
9.(José Neto, 2016) Quais as dificuldades encontradas quando se 
deseja transportar um compilador de uma máquina para outra? 
Como contorná-las?
Caso o compilador tenha sido projetado de forma modular, a maior dificuldade seria no 
processo de otimização dependente de máquina, que teria que ser reescrito para a 
nova máquina destino, uma vez que os recursos fornecidos provavelmente seriam 
diferentes da máquina original.
Agora, caso o compilador não tenha sido projetado de forma modular, provavelmente 
se teria que reescrever todo o compilador novamente, pois as rotinas de otimização 
dependente de máquina estariam mescladas com as rotinas dos demais processos 
envolvidos no desenvolvimento do compilador.

Outros materiais