Buscar

Avaliação I_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 4 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

Prévia do material em texto

Avaliação I – COMPILADORES 
 
1. A propriedade de liveness é uma propriedade das variáveis de um programa utilizada para 
determinar qual variável pode ser alocada para determinado registrador. Com relação à 
propriedade de liveness, é correto afirmar que: 
o grafo de interferência de variáveis revela quais variáveis não podem compartilhar o mesmo 
registrador e há uma solução ótima para esse problema. 
caso duas variáveis não interfiram uma na outra, automaticamente determina-se que ambas 
podem compartilhar um registrador. 
determinada variável é considerada viva caso possa ser eliminada da lista de variáveis que estão 
em uso. 
quando uma variável está viva, ela pode interferir em outras variáveis, o que significa que 
ambas não podem se alternar no mesmo registrador. (Alternativa correta) 
2. Basicamente, há duas fases de compiladores, e cada uma delas cria uma representação do 
código original mais próxima do código que a máquina consegue executar. Considerando o 
momento em que a síntese é realizada e seus objetivos, assinale a alternativa correta. 
A síntese é realizada após os procedimentos de análise léxica, sintática e semântica, e seu 
objetivo é permitir a geração do código de máquina. (Alternativa correta) 
A síntese é realizada após os procedimentos de análise léxica, sintática e semântica, e seu 
objetivo é validar esses procedimentos. 
A síntese é realizada durante os procedimentos de análise léxica, sintática e semântica, e seu 
objetivo é permitir a geração do código de máquina. 
A síntese é realizada após o procedimento de geração de código de máquina, com o objetivo de 
otimizar esse código para o processador de destino. 
3. Ao executar um programa, o compilador, após verificar a sintaxe, pode sinalizar os erros 
semânticos. Um erro semântico ocorre quando um programa está certo sintaticamente, mas o 
resultado gerado não está correto. Analise o seguinte trecho do programa escrito em C#: 
public class Teste : Teste 
int k = “xyz” * false; 
int y = 1.22; 
 void x(int c, int c) 
 { int a; 
 int p = 14 * a; 
} 
} 
Em relação aos erros semânticos apresentados no trecho do programa acima, analise as 
afirmações a seguir. 
I. Não é possível uma classe herdar de si mesma — class Teste : Teste. 
II. Não é possível multiplicar uma string por um boolean. 
III. O número 1.22 não pode ser atribuído como um inteiro. 
IV. Na instrução int p = 14 * a, do método x, a variável a não foi inicializada. 
V. Não é possível declarar parâmetros com o mesmo nome e com o mesmo tipo. Agora, assinale 
a alternativa que apresenta a resposta correta. 
Todas as afirmativas estão corretas. (Alternativa correta) 
Apenas as afirmativas II, III e IV estão corretas. 
Apenas as afirmativas I, II e V estão corretas. 
Apenas as afirmativas I, III e IV estão corretas. 
4. Os compiladores são organizados em uma sequência de fases. À medida que o compilador 
deriva conhecimento sobre o código que compila, precisa transmitir essa informação de uma fase 
para outra. Ele necessita, então, de uma representação para todas as informações que deriva 
sobre o programa-fonte. Chama-se isso de representação intermediária (IR). Sobre as IRs geradas 
por um compilador, considere as seguintes afirmações: 
I — A árvore sintática é a forma de representação intermediária mais próxima da estrutura do 
código-alvo. 
II — A árvore sintática abstrata é uma representação contendo mais informações sobre as 
produções gramaticais realizadas, se comparada com a árvore sintática comum. 
III — Um dos motivos de se utilizar o código de três endereços como representação 
intermediária é a sua facilidade de tradução para linguagens de máquina. 
Assinale a alternativa que indica as afirmações corretas: 
Apenas a afirmação III está correta. (Alternativa correta) 
Apenas a afirmação II está correta. 
Apenas a afirmação I está correta. 
As afirmações I e II estão corretas. 
5. As variáveis de um programa são utilizadas para o armazenamento de dados que devem ser 
processados. Apesar de o desenvolvedor poder utilizar quantas variáveis quiser no código fonte, 
o número de registradores em um microprocessador é limitado. Com relação à alocação de 
registradores, é correto afirmar que: 
para a verificação da possibilidade de uso futuro de uma variável, é preciso verificar se ela não 
está contida no conjunto gen[i], apenas. 
os registradores do microprocessador podem ser subdivididos em quantas partes forem 
necessárias para armazenar os dados do programa. 
para verificar quais variáveis podem ser utilizadas, é preciso determinar quando uma variável 
está viva em determinado ponto do código. (Alternativa correta) 
as variáveis de um programa podem ser colocadas em registradores sem a necessidade de outra 
organização, a não ser a do ponto em que são utilizadas. 
6. As fases de um compilador podem ser classificadas em dois grupos: análise e síntese. Na fase 
de análise, encontram-se as fases de análise léxica, análise sintática e análise semântica. Já na 
fase de síntese, encontram-se as fases de geração de código intermediário, otimização e geração 
de código. Sobre a fase de geração de código intermediário de um compilador, assinale a 
alternativa correta: 
A fase de geração de código intermediário de um compilador é a fase em que se 
procura produzir um código que execute com mais eficiência. 
A fase de geração de código intermediário de um compilador é a fase em que ocorre a 
transformação da árvore sintática em uma linguagem intermediária, que é mais próxima da 
linguagem-objeto do que o código-fonte, mas ainda não se trata do código-final. (Alternativa 
correta) 
A fase de geração de código intermediário de um compilador é a fase em que se constrói uma 
árvore sintática para validar a estrutura dos tokens reconhecidos do código-fonte. . 
A fase de geração de código intermediário de um compilador é a fase em que se reconhecem 
os tokens da linguagem-fonte por meio da leitura dos caracteres do código-fonte. 
7. As variáveis alocadas estaticamente não podem ter seus valores alterados. Assinale a 
alternativa que cita uma vantagem da alocação de memória do tipo estático. 
Flexibilização do tamanho. 
Velocidade de acesso. (Alternativa correta) 
Mudança de endereço. 
Alocação em tempo de execução. 
8. Normalmente, a pilha apresenta um tamanho previamente definido e que, se ultrapassado, 
resultará em uma exceção conhecida como stack overflow (ou “estouro de pilha”). Qual das 
alternativas a seguir apresenta uma forma de reduzir as ocorrências de stack overflow? 
Manter somente a referência ao objeto na stack. (Alternativa correta) 
Aumentar a quantidade ou tamanho dos argumentos das funções. 
Aumentar a quantidade de funções aninhadas. 
Ampliar a quantidade de chamadas recursivas. 
9. Na alocação de memória dinâmica, o tamanho e o endereço a ser utilizado somente serão 
conhecidos pelo sistema no momento da execução. Assinale a alternativa que apresenta uma 
desvantagem desse tipo de alocação. 
Não é possível aumentar o tamanho da memória alocada para uma variável. 
Requer mecanismo de limpeza. (Alternativa correta) 
Possibilita apenas a implementação em forma de pilha. . 
São alocadas em tempo de compilação, aumentando o tempo do processo. 
10. Para a criação de um código de montagem otimizado, para determinado processador, existem 
processos que podem ser observados. Quais são esses processos? 
Escalonamento do código, em que partes do código de montagem são espaçadas de forma a 
possibilitar o paralelismo do código. (Alternativa correta) 
Desenrolamento de estruturas de repetição, substituindo estruturas de repetição com limites n 
bem definidos por n cópias do código. 
Propagação de endereços de memória por constantes, permitindo o acesso mais rápido a áreas 
de memória. 
Minimização da quantidade de funcionalidades coberta pelas instruções, uma vez que utilizar 
mais instruções é mais veloz que usar a instrução complexa. 
 
 
 
	1. A propriedade de liveness é uma propriedadedas variáveis de um programa utilizada para determinar qual variável pode ser alocada para determinado registrador. Com relação à propriedade de liveness, é correto afirmar que:
	2. Basicamente, há duas fases de compiladores, e cada uma delas cria uma representação do código original mais próxima do código que a máquina consegue executar. Considerando o momento em que a síntese é realizada e seus objetivos, assinale a alternat...
	3. Ao executar um programa, o compilador, após verificar a sintaxe, pode sinalizar os erros semânticos. Um erro semântico ocorre quando um programa está certo sintaticamente, mas o resultado gerado não está correto. Analise o seguinte trecho do progra...
	public class Teste : Teste
	int k = “xyz” * false;
	int y = 1.22;
	void x(int c, int c)
	{ int a;
	int p = 14 * a;
	}
	}
	Em relação aos erros semânticos apresentados no trecho do programa acima, analise as afirmações a seguir.
	I. Não é possível uma classe herdar de si mesma — class Teste : Teste.
	II. Não é possível multiplicar uma string por um boolean.
	III. O número 1.22 não pode ser atribuído como um inteiro.
	IV. Na instrução int p = 14 * a, do método x, a variável a não foi inicializada.
	V. Não é possível declarar parâmetros com o mesmo nome e com o mesmo tipo. Agora, assinale a alternativa que apresenta a resposta correta.
	4. Os compiladores são organizados em uma sequência de fases. À medida que o compilador deriva conhecimento sobre o código que compila, precisa transmitir essa informação de uma fase para outra. Ele necessita, então, de uma representação para todas as...
	I — A árvore sintática é a forma de representação intermediária mais próxima da estrutura do código-alvo.
	II — A árvore sintática abstrata é uma representação contendo mais informações sobre as produções gramaticais realizadas, se comparada com a árvore sintática comum.
	III — Um dos motivos de se utilizar o código de três endereços como representação intermediária é a sua facilidade de tradução para linguagens de máquina.
	Assinale a alternativa que indica as afirmações corretas:
	5. As variáveis de um programa são utilizadas para o armazenamento de dados que devem ser processados. Apesar de o desenvolvedor poder utilizar quantas variáveis quiser no código fonte, o número de registradores em um microprocessador é limitado. Com ...
	6. As fases de um compilador podem ser classificadas em dois grupos: análise e síntese. Na fase de análise, encontram-se as fases de análise léxica, análise sintática e análise semântica. Já na fase de síntese, encontram-se as fases de geração de códi...
	7. As variáveis alocadas estaticamente não podem ter seus valores alterados. Assinale a alternativa que cita uma vantagem da alocação de memória do tipo estático.
	8. Normalmente, a pilha apresenta um tamanho previamente definido e que, se ultrapassado, resultará em uma exceção conhecida como stack overflow (ou “estouro de pilha”). Qual das alternativas a seguir apresenta uma forma de reduzir as ocorrências de s...
	9. Na alocação de memória dinâmica, o tamanho e o endereço a ser utilizado somente serão conhecidos pelo sistema no momento da execução. Assinale a alternativa que apresenta uma desvantagem desse tipo de alocação.
	10. Para a criação de um código de montagem otimizado, para determinado processador, existem processos que podem ser observados. Quais são esses processos?
	1. Compiladores podem gerar uma variedade de representações intermediárias para representar as construções sintáticas da linguagem-fonte. Cada representação tem a finalidade de registrar informações de uma fase da compilação para as fases seguintes. _...
	2. A semântica denotacional constitui o método mais rígido para descrever o significado dos programas, sendo baseado na teoria da função recursiva. Considerando o contexto apresentado, avalie as seguintes asserções sobre a semântica denotacional.
	I. A semântica denotacional utiliza uma função que estrutura a entidade e o objeto matemático. PORQUE
	II. O objeto matemático representa o significado das entidades sintáticas correspondentes.
	A respeito dessas asserções, assinale a opção correta.
	3. A utilidade de um código intermediário entre as linguagens de alto nível e de baixo nível não se resume à simplificação das tarefas envolvidas no processo de compilação. Além dessa simplificação, o uso de um código intermediário apresenta outras va...
	I. Flexibilização dos procedimentos de análise do código.
	II. Aumento do número de compiladores necessários para máquinas diferentes.
	III. Independência dos detalhes sintáticos da linguagem original.
	É correto o que se afirmar em:
	4. A alocação de memória dinâmica pode ser feita em modo pilha (stack) e em modo heap (monte). Apesar de não existir uma regra única, existem situações em que determinado tipo é mais benéfico que o outro. A pilha é a principal implementação quando se ...
	5. Na notação tradicional para as expressões aritméticas (notação infixa), o operador aparece entre os seus dois operandos. Já na notação pós-fixa, também conhecida como notação polonesa inversa, o operador é colocado após os seus dois operandos. Cons...
	EXPR → EXPR + TERMO{ imprimir (“+”) }
	EXPR → EXPR – TERMO { imprimir (“-”) }
	EXPR → TERMO TERMO → TERMO * FATOR {imprimir (“*”) }
	TERMO → TERMO / FATOR {imprimir (“/”) }
	TERMO → FATOR FATOR → ( EXPR ) FATOR → 0 { imprimir (“0”) }
	FATOR → 9 { imprimir (“9”) } Qual será o resultado da sua execução para a entrada 2 + 4 * (5 - 3)?
	6. A função de um compilador é traduzir programas escritos em uma linguagem-fonte em um dos programas equivalentes em outra linguagem-alvo. Para isso, o compilador é dividido em fases, que implementam diversas técnicas. A ___________________ é uma téc...
	7. As regras da semântica dinâmica são classificadas em operacional, denotacional e axiomática. Com relação à classificação da semântica dinâmica, avalie as questões a seguir e associe os itens numerados de acordo com as representações adotadas para s...
	1. Semântica operacional
	2. Semântica axiomática
	3. Semântica denotacional
	I. Utiliza expressões lógicas, conhecidas como asserções.
	II. É um método representado por objetos matemáticos definindo o significado dos atributos sintáticos.
	III. Esse método é baseado em funções recursivas.
	IV. É utilizada em manuais das linguagens e livros didáticos.
	V. Esse método é classificado em natural e estrutural. Assinale a alternativa que apresenta a associação correta entre as colunas.
	8. Gerir os recursos disponibilizados pela máquina é um processo que demanda habilidade tanto do desenvolvedor quanto da eficiência do compilador. A alocação de memória, qualquer que seja consiste em:
	9. As linguagens de montagem são específicas para cada microprocessador e intimamente ligadas à arquitetura do sistema. Com relação à maneira como o compilador deve realizar a tradução para a linguagem de montagem, é correto afirmar que:
	10. As linguagens intermediárias geradas pelo compilador podem estar em níveis diferentes de abstrações. Tomando como referência o conceito e os objetivos de uma representação de código intermediário em baixo nível de abstração, julgue as afirmativas ...
	( ) A representação de baixo nível é a mais distante do código a ser executado pelo processador, pois ainda precisa ser otimizada.
	( ) As instruções contidas nesse nível de representação devem ser aquelas próprias do processador para o qual o código está sendo gerado.
	( ) O compilador fará a geração do código em baixo nível de abstração apenas para casos em que o código-fonte for escrito em linguagem Assembly. Assinale a alternativa que contém a sequência correta de V e F.

Continue navegando