Logo Passei Direto
Buscar

copiladores provas

User badge image
Luka Alves

em

Ferramentas de estudo

Questões resolvidas

Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Escolha uma das opções e acesse esse e outros materiais sem bloqueio. 🤩

Cadastre-se ou realize login

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Questões resolvidas

Prévia do material em texto

QUESTÃO 1 
A seleção de registradores, o uso dos caches disponíveis e a seleção das 
instruções mais adequadas a uma determinada arquitetura são características de 
um dos blocos do processo de tradução de uma linguagem de programação em 
um código, ou linguagem, de máquina. Marque, entre as alternativas as seguir, 
qual o bloco que apresenta essas características. 
a ) 
Bloco de análise semântica. 
b ) 
Bloco de análise sintática. 
c ) 
Bloco de geração de código intermediário. 
d ) 
Bloco da análise léxica. 
e ) 
Bloco de geração de código de máquina. 
Ver justificativa da resposta 
 
 
QUESTÃO 2 
Uma linguagem formal é composta de um conjunto de símbolos, o alfabeto, e um 
conjunto de strings, as palavras, frases e textos. Esse é o caso de linguagens como 
a música. Considerando esses dois conceitos básicos, podemos afirmar que: 
 
1. o alfabeto tem que ser finito; 
2. o conjunto de strings pode ser infinito; 
3. não há relação entre o alfabeto e o conjunto de strings. 
 
Considerando as afirmações apresentadas, marque a alternativa correta. 
a ) 
Apenas a afirmativa 2 está correta. 
b ) 
Apenas as afirmativas 1 e 2 estão corretas. 
c ) 
Apenas a afirmativa 1 está correta. 
d ) 
Apenas a afirmativa 3 está correta. 
e ) 
Apenas as afirmativas 1 e 3 estão corretas. 
Ver justificativa da resposta 
 
QUESTÃO 3 
A existência de tipos e suas formas de verificação deu origem a uma discordância 
entre os programadores e desenvolvedores de linguagens de programação. 
Enquanto uns preferem linguagens cuja análise semântica é estática, outros 
preferem linguagens cuja análise semântica é dinâmica. Isso ocorre, 
principalmente, porque, em um caso, os tipos precisam ser anotados ou inferidos 
em tempo de compilação e, em outro, os tipos podem ser apenas inferidos em 
tempo de execução. Considerando as seguintes afirmações, preencha as lacunas 
com as palavras corretas e assinale a alternativa com a sequência correta. 
1. Linguagens estaticamente tipadas são ______ suscetíveis a erros em tempo de 
___________. 
2. A análise __________ permite que o código seja escrito em _______ tempo já que 
o programador precisa escrever ________. 
3. A análise dinâmica requer o uso de ________ recursos computacionais durante o 
processo de __________. 
a ) 
menos/ compilação/ dinâmicas/ menos/ menos/ mais/ execução 
b ) 
mais/ execução/ estática/ mais/ menos/ mais/ compilação 
c ) 
menos/ execução/ estática/ menos/ menos/ mais/ execução 
d ) 
menos/ compilação/ estática/ mais/ menos/ menos/ interpretação 
e ) 
mais/ execução/ dinâmica/ menos/ menos/ mais/ compilação 
Ver justificativa da resposta 
 
QUESTÃO 4 
O projeto LLVM disponibiliza uma estrutura de compilação baseada no uso de 
uma representação intermediária, um código intermediário. Assim foi possível 
criar um conjunto de módulos de front-end para cada linguagem de programação 
desejada e um conjunto de módulos de back-end para cada arquitetura alvo 
desejada. A força do projeto LLVM está, justamente, na representação 
intermediária. Considere as seguintes afirmativas. 
 
1. O código intermediário do projeto LLVM é uma linguagem desenhada para 
permitir otimização manual, se for necessário. 
2. A representação intermediária do projeto LLVM não pode ser considerada uma 
linguagem de programação por não ter uma estrutura de tipos. 
3. A representação intermediária do projeto LLVM tem três formas distintas, uma 
textual, uma estrutura de memória e uma espécie de código binário parecido com 
o Bytecode do Java. 
a ) 
Apenas a afirmativa 2 está correta. 
b ) 
Apenas as afirmativas 1 e 2 estão corretas. 
c ) 
Apenas as afirmativas 1 e 3 estão corretas. 
d ) 
Apenas a afirmativa 3 está correta. 
e ) 
Apenas a afirmativa 1 está correta. 
Ver justificativa da resposta 
 
QUESTÃO 5 
A principal função da otimização de código é garantir que o binário gerado com 
base no processo de tradução da linguagem de programação rode o mais 
eficientemente possível. Considerando as divisões didáticas do processo de 
compilação e a existência de um módulo nesse processo, responsável por essa 
otimização, avalie as afirmativas. 
 
1. Toda a otimização realizada no código intermediário deve ser feita de maneira a 
não alterar o algoritmo codificado. 
2. Os processos de otimização realizados no gerador de código intermediário são 
independentes da arquitetura alvo. 
3. As linguagens utilizadas para a geração de código intermediário estão mais 
próximas da linguagem de programação que do Assembly. 
 
Marque, entre as alternativas a seguir, aquela que está correta. 
a ) 
Apenas as afirmativas 1 e 2 estão corretas. 
b ) 
Apenas as afirmativas 1 e 3 estão corretas. 
c ) 
Apenas a afirmativa 2 está correta. 
d ) 
Apenas a afirmativa 1 está correta. 
e ) 
Apenas a afirmativa 3 está correta. 
Ver justificativa da resposta 
 
QUESTÃO 6 
Máquinas executam linguagem de máquina e apenas ela. Esse é o motivo que 
forçou a criação das linguagens de programação, entendidas pelo ser humano e 
que podem ser traduzidas em linguagem de máquina. Assim, podemos afirmar 
que: 
 
1. os núcleos de processamento de notebooks utilizam o código binário como 
linguagem; 
2. o Assembly é a verdadeira linguagem de máquina; 
3. uma linguagem de programação é artificial. 
 
Considerando as afirmações, marque a alternativa correta. 
a ) 
Apenas a afirmativa 3 está correta. 
b ) 
Apenas a afirmativa 1 está correta. 
c ) 
Apenas a afirmativa 2 está correta. 
d ) 
Apenas as afirmativas 1 e 2 estão corretas. 
e ) 
Apenas as afirmativas 1 e 3 estão corretas. 
Ver justificativa da resposta 
 
 
QUESTÃO 7 
O processo de otimização de código é complexo e inclui um conjunto 
diversificado de técnicas de ordenação, de substituição e de ordenação de 
instruções na busca de um conjunto eficiente. Entre as alternativas a seguir, 
marque aquela que apresenta um conjunto de otimizações comuns durante a 
otimização de código intermediário. 
a ) 
Eliminação de tipos errados, simplificação de laços de repetição, exclusão de 
expressões algébricas. 
b ) 
Simplificação de laços de repetição, substituição de constantes, exclusões de 
expressões algébricas. 
c ) 
Eliminação de código intangível, simplificação de laços de repetição, eliminação 
de tipos errados. 
d ) 
Eliminação de instruções redundantes, eliminação de código inatingível, 
simplificação de expressões algébricas. 
e ) 
Simplificação de expressões algébricas, eliminação de laços desnecessários, 
eliminação de tipos errados. 
Ver justificativa da resposta 
 
QUESTÃO 8 
Durante o processo de tradução, os módulos de análise léxica e sintática não têm 
como avaliar eventuais erros de codificação que tenham relação com o contexto 
em que uma declaração de programa se encontra. Cabe ao analisador semântico 
avaliar o contexto da declaração em busca do sentido de cada comando. 
Considerando as tarefas do analisador semântico, marque como verdadeiro (V) ou 
falso (F) as seguintes declarações. 
( ) Cabe ao analisador semântico identificar erros nos parâmetros de uma função. 
( ) Erros como variável utilizada antes de ser declarada são detectados pelos 
analisadores semânticos de linguagens, que exigem esse procedimento. 
( ) O uso de tipos diferentes não será detectado pelo analisador semântico. 
( ) O analisador semântico irá criar a árvore sintática abstrata fornecida pelo 
analisador sintático. 
Selecione, entre as alternativas a seguir, aquela que corresponde a sequência 
correta de verdadeiros (V) e falsos (F). 
a ) 
F/ V/ V/ F 
b ) 
V/ F/ V/ V 
c ) 
F/ F/ F/ F 
d ) 
V/ V/ F/ F 
e ) 
F/ F/ V/ V 
QUESTÃO 1 
Depois do Assembly, criamos as linguagens de nicho, como o Cobol, para 
aplicações comerciais, e o Fortran, para aplicações matemáticas. Com o tempo, 
as linguagens de programação ficaram genéricas e deixaram de ter aplicações 
específicas. Nesse momento, o ser humano agregou as técnicas de programação 
em grandes famílias, os paradigmas de linguagensde programação. Considerando 
essa evolução, marque a alternativa correta. 
a ) 
Linguagens lógicas de programação são linguagens que permitem a escrita de 
algoritmos usando premissas lógicas. 
b ) 
Uma linguagem funcional é aquela que usa os métodos de objetos para 
representar o algoritmo. 
c ) 
Não existe diferença entre linguagens imperativas e funcionais. 
d ) 
Uma linguagem imperativa descreve o algoritmo usando funções matemáticas. 
e ) 
Todas as linguagens de programação estão no paradigma lógico, e a lógica é a 
base da programação. 
Ver justificativa da resposta 
 
QUESTÃO 2 
Linguagens de programação são artificiais e formais, desenvolvidas pelo ser 
humano com o objetivo de resolver um problema específico: usar máquinas para 
resolver outros problemas. Sobre essa afirmação, selecione a alternativa correta. 
a ) 
Linguagens naturais evoluem com o tempo e sofrem alterações, já as 
linguagens formais não. 
b ) 
A linguagem natural é uma característica exclusiva dos seres humanos. 
c ) 
Usamos as linguagens naturais, como a matemática, para representar algoritmos. 
d ) 
As linguagens formais foram criadas para substituir as naturais na comunicação 
entre dois seres vivos. 
e ) 
As linguagens naturais são limitadas em tamanho enquanto as formais não são. 
Ver justificativa da resposta 
 
 
QUESTÃO 3 
A validação do código escrito em uma linguagem de programação será realizada 
por um parser, artefato de software que utilizará uma gramática como referência e, 
caso a validação seja possível, criará uma árvore sintática abstrata. Com relação a 
esse processo, podemos afirmar que: 
 
1. um parser LL(1) precisa de uma gramática especial para ser criado, a qual não 
permita ambiguidade; 
2. um parser obedece à sua gramática de modo a remover qualquer ambiguidade 
que exista nela; 
3. um parser LL(1) varre as declarações da esquerda para a direita e avalia o 
primeiro não terminal à esquerda. 
 
Considerando as afirmações, marque a alternativa correta. 
a ) 
Apenas as afirmativas 1 e 2 estão corretas. 
b ) 
Apenas a afirmativa 3 está correta. 
c ) 
Apenas as afirmativas 1 e 3 estão corretas. 
d ) 
Apenas a afirmativa 2 está correta. 
e ) 
Apenas a afirmativa 1 está correta. 
Ver justificativa da resposta 
 
 
QUESTÃO 4 
O processo de tradução de uma linguagem de programação, criada para uso 
humano, em uma linguagem de máquina, criada para uso por máquinas, é 
complexo. Para reduzir essa complexidade e melhorar sua compreensão, 
dividimos esse processo em módulos funcionais, cada um responsável por uma 
parte. Considerando as divisões e as tarefas que devem ser executadas, marque a 
alternativa que contém uma ordem possível. 
a ) 
Analisador léxico, analisador semântico e analisador sintático. 
b ) 
Analisador semântico, analisador sintático e analisador léxico. 
c ) 
Analisador sintático, analisador léxico e geração de código intermediário. 
d ) 
Analisador léxico, geração de código intermediário e analisador sintático. 
e ) 
Analisador léxico, analisador sintático e analisador semântico. 
Ver justificativa da resposta 
 
 
QUESTÃO 5 
O uso de tipos em linguagens de programação é complexo e requer atenção, tanto 
durante a anotação quando durante a validação. Isso é verdade para a validação 
estática e para a validação dinâmica. Essa complexidade é provocada pelo 
conjunto de artefato de código disponível nas linguagens mais modernas. Não é 
difícil encontrar linguagens com funções, objetos, records e templates. Além, é 
claro, de variáveis e ponteiros. Tendo em vista essa complexidade, os tipos foram 
divididos em classe para análise e compreensão. Considere a seguir as seguintes 
afirmações. 
1. Tipos primitivos são aqueles que estão mais próximos das características 
físicas da máquina. 
2. Tipos compostos são agregações de tipos primitivos, como os tipos double, 
float e arrays. 
3. Tipos complexos são aqueles que precisam de tipos compostos, como 
as unions e as classes. 
Entre as alternativas as seguir marque aquela que estiver correta. 
a ) 
A afirmativa 1 está correta. 
b ) 
A afirmativa 2 está correta. 
c ) 
A afirmativa 3 está correta. 
d ) 
As afirmativas 1 e 2 estão corretas. 
e ) 
As afirmativas 1 e 3 estão corretas. 
Ver justificativa da resposta 
 
QUESTÃO 6 
Para que um programa possa ser executado em uma máquina, os softwares 
responsáveis pela tradução de linguagens precisam encontrar formas de adequar 
os artefatos da linguagem de programação à linguagem de máquina. Nesse caso, 
podemos afirmar que: 
a ) 
a performance do programa em execução não tem relação com a linguagem 
utilizada para criar o algoritmo. 
b ) 
a linguagem de programação não tem impacto na segurança do código em 
execução. 
c ) 
algumas linguagens têm performance melhor que outras, como no caso do 
Rust comparado ao Go. 
d ) 
o programa em execução ou o binário em memória - a verdadeira linguagem de 
máquina - depende da máquina na qual será executado. 
e ) 
todas as linguagens de programação criam o mesmo código de máquina, cuja 
única diferença é o algoritmo implementado. 
Ver justificativa da resposta 
 
 
QUESTÃO 7 
A atribuição de valores, para a criação de conteúdo semântico nos vértices da 
árvore sintática abstrata, é a forma mais comum de acrescentar conteúdo 
semântico a uma estrutura de dados que foi criada com base em uma gramática 
livre de contexto. Sendo assim: 
1. os atributos que serão adicionados podem ser sintetizados ou herdados. 
2. o uso de atributos herdados implica na criação de um processo de translação 
sintática direta. 
3. os atributos de um vértice são utilizados para determinar se os atributos de 
outro vértice são válidos. 
Considerando as afirmativas, marque a opção correta nas alternativas a seguir. 
a ) 
Apenas as afirmativas 1 e 2 estão corretas 
b ) 
Apenas a afirmativa 3 está correta 
c ) 
Apenas as afirmativas 1 e 3 estão corretas. 
d ) 
Apenas a afirmativa 1 está correta. 
e ) 
Apenas a afirmativa 2 está correta. 
Ver justificativa da resposta 
 
QUESTÃO 8 
Analisadores sintáticos são artefatos de software desenvolvidos para validar a 
estrutura das declarações de uma linguagem de programação. Para isso, usam 
gramáticas. Sobre isso, considere as afirmativas a seguir e marque a alternativa 
correta. 
a ) 
A classificação das gramáticas de Chomsky exclui justamente as gramáticas que 
precisamos definir para linguagens livres de contexto. 
b ) 
Linguagens livres de contexto são definidas por gramáticas regulares. 
c ) 
Gramáticas são um conjunto finito de regras que permite definir como as 
declarações de uma linguagem são formadas. 
d ) 
O uso de gramáticas limita a criação de linguagens de programação a linguagens 
regulares. 
e ) 
As gramáticas são ferramentas de análise sintática cujo uso é limitado às 
linguagens naturais. 
Ver justificativa da resposta 
 
QUESTÃO 9 
A existência de tipos e suas formas de verificação deu origem a uma discordância 
entre os programadores e desenvolvedores de linguagens de programação. 
Enquanto uns preferem linguagens cuja análise semântica é estática, outros 
preferem linguagens cuja análise semântica é dinâmica. Isso ocorre, 
principalmente, porque, em um caso, os tipos precisam ser anotados ou inferidos 
em tempo de compilação e, em outro, os tipos podem ser apenas inferidos em 
tempo de execução. Considerando as seguintes afirmações, preencha as lacunas 
com as palavras corretas e assinale a alternativa com a sequência correta. 
1. Linguagens estaticamente tipadas são ______ suscetíveis a erros em tempo de 
___________. 
2. A análise __________ permite que o código seja escrito em _______ tempo já que 
o programador precisa escrever ________. 
3. A análise dinâmica requer o uso de ________ recursos computacionais durante o 
processo de __________. 
a ) 
menos/ execução/ estática/ menos/ menos/ mais/ execução 
b ) 
menos/ compilação/ estática/ mais/ menos/ menos/ interpretação 
c ) 
mais/ execução/estática/ mais/ menos/ mais/ compilação 
d ) 
mais/ execução/ dinâmica/ menos/ menos/ mais/ compilação 
e ) 
menos/ compilação/ dinâmicas/ menos/ menos/ mais/ execução 
Ver justificativa da resposta 
 
QUESTÃO 10 
Na JVM, o código em execução é constantemente monitorado para o recolhimento 
de estatísticas de número de execuções e tempo de execução. Esse 
monitoramento serve para a criação de um perfil de execução de cada fragmento 
de código. Sempre que um determinado número de chamadas a um fragmento é 
encontrado, ou sempre que um fragmento de código demora mais que um valor 
específico, o código desse fragmento é compilado por um compilador JIT. Entre as 
alternativas a seguir, marque a alternativa correta. 
a ) 
Os processos de monitoramento para a criação do perfil de uso são executados 
pelo interpretador antes do início da execução do código e armazenados para uso 
posterior. 
b ) 
Programas interpretados, com o uso de ciclos de otimização JIT, tendem a 
ficar mais eficientes com o uso. 
c ) 
O ciclo de compilação JIT aplica sobre um determinado fragmento de código as 
mesmas técnicas de otimização utilizadas durante a interpretação. 
d ) 
O custo do monitoramento de fragmentos de código faz com que programas que 
usem essa técnica tenham sempre a mesma performance, independentemente 
da quantidade de vezes que um fragmento é chamado. 
e ) 
O compilador JIT da JVM é o único compilador JIT que utiliza módulos capazes de 
monitorar código em memória: os módulos perfiladores. 
Ver justificativa da resposta 
 
QUESTÃO 11 
O projeto LLVM disponibiliza uma estrutura de compilação baseada no uso de 
uma representação intermediária, um código intermediário. Assim foi possível 
criar um conjunto de módulos de front-end para cada linguagem de programação 
desejada e um conjunto de módulos de back-end para cada arquitetura alvo 
desejada. A força do projeto LLVM está, justamente, na representação 
intermediária. Considere as seguintes afirmativas. 
 
1. O código intermediário do projeto LLVM é uma linguagem desenhada para 
permitir otimização manual, se for necessário. 
2. A representação intermediária do projeto LLVM não pode ser considerada uma 
linguagem de programação por não ter uma estrutura de tipos. 
3. A representação intermediária do projeto LLVM tem três formas distintas, uma 
textual, uma estrutura de memória e uma espécie de código binário parecido com 
o Bytecode do Java. 
a ) 
Apenas a afirmativa 1 está correta. 
b ) 
Apenas as afirmativas 1 e 3 estão corretas. 
c ) 
Apenas a afirmativa 3 está correta. 
d ) 
Apenas a afirmativa 2 está correta. 
e ) 
Apenas as afirmativas 1 e 2 estão corretas. 
Ver justificativa da resposta 
 
QUESTÃO 12 
Algumas características do formato de executáveis do Windows, o formato PE, 
foram mantidas apenas por compatibilidade com o antigo formato dos 
executáveis do MSDOS. Hoje essas características são usadas apenas para 
indicar que um determinado programa não é compatível com o MSDOS. 
Considere as afirmativas a seguir. 
 
1. Os únicos arquivos que precisam utilizar o formato PE para serem reconhecidos 
como executáveis, no Windows, são do tipo .exe. 
2. No formato PE, o seu binário, executável no Windows, será armazenado em 
uma seção que não tem relação com as seções compatíveis com o MSDOS. 
3. O formato PE usa a seção DOS Stub para disparar o seu programa, sempre que 
ele for executado em uma máquina MSDOS. 
 
Marque, entre as alternativas a seguir, aquela que está correta. 
a ) 
Apenas a afirmativa 2 está correta. 
b ) 
Apenas a afirmativa 3 está correta. 
c ) 
Apenas a afirmativa 1 está correta. 
d ) 
Apenas as afirmativas 1 e 3 estão corretas. 
e ) 
Apenas as afirmativas 1 e 2 estão corretas. 
Ver justificativa da resposta 
 
QUESTÃO 1 
O processo de otimização de código é complexo e inclui um conjunto 
diversificado de técnicas de ordenação, de substituição e de ordenação de 
instruções na busca de um conjunto eficiente. Entre as alternativas a 
seguir, marque aquela que apresenta um conjunto de otimizações comuns 
durante a otimização de código intermediário. 
a ) 
Eliminação de instruções redundantes, eliminação de código inatingível, 
simplificação de expressões algébricas. 
b ) 
Eliminação de tipos errados, simplificação de laços de repetição, exclusão de 
expressões algébricas. 
c ) 
Eliminação de código intangível, simplificação de laços de repetição, eliminação 
de tipos errados. 
d ) 
Simplificação de expressões algébricas, eliminação de laços desnecessários, 
eliminação de tipos errados. 
e ) 
Simplificação de laços de repetição, substituição de constantes, exclusões de 
expressões algébricas. 
Ver justificativa da resposta 
 
QUESTÃO 2 
Talvez a maior contribuição do projeto da linguagem Java seja exatamente o seu 
código intermediário, o Bytecode, e a estrutura de interpretação com 
compilação JIT implementada na JVM para execução desse código 
intermediário. Considerando a arquitetura criada para a linguagem Java, 
marque, entre as alternativas a seguir, a correta. 
a ) 
O processo de compilação, realizado no front-end dos compiladores Java, tem 
as mesmas funcionalidades de qualquer compilador até a geração do 
código intermediário. 
b ) 
O Bytecode do Java não sofre nenhum tipo de otimização até que seja submetido 
à interpretação. 
c ) 
A linguagem Java só é realmente compilada quando um determinado fragmento 
de código precisa ser otimizado pelo JIT. 
d ) 
O processo de interpretação do Bytecode do Java, na máquina virtual, usa como 
referência o código escrito originalmente. 
e ) 
O back-end do processo de interpretação da linguagem executa processos de 
otimização simples de um passo, característicos do processo de 
interpretação, e não os processos complexos, característicos do processo 
de compilação. 
Ver justificativa da resposta 
 
QUESTÃO 3 
Em 1960, John McCarthy publicou um artigo sobre a linguagem Lisp em que 
comentava sobre fragmentos de código que poderiam ser armazenados 
entre funções diferentes para uso mais eficiente dos processos de 
execução. Esse artigo é relevante por plantar as sementes da compilação 
dinâmica. Marque como verdadeiro (V) ou falso (F) as seguintes afirmações 
e depois indique a alternativa que apresenta a sequência correta. 
 
( ) O termo compilação dinâmica acabou sendo substituído pelo termo JIT, 
que significa que a compilação será utilizada quando necessário. 
( ) Os processos JIT recorrem ao uso do monitoramento do código em 
execução para determinar quando e se um fragmento de código precisa ser 
recompilado. 
( ) O compilador JIT da JVM utiliza duas estruturas de compilação. 
( ) A função do módulo perfilador é determinar quais fragmentos de código 
devem ser otimizados. 
a ) 
V/ V/ F/ F 
b ) 
V/ F/ F/ F 
c ) 
V/ V/ V/ F 
d ) 
F/ F/ F/ F 
e ) 
V/ V/ V/ V 
Ver justificativa da resposta 
 
 
QUESTÃO 4 
O teorema de Kleene relaciona as expressões regulares e as máquinas de estado 
finito. Essas duas abstrações matemáticas podem ser usadas, 
indistintamente, para reconhecer dada linguagem, validadas suas strings 
em relação ao alfabeto que a define. Considerando as linguagens 
regulares, as expressões regulares e as máquinas de estado finito, marque 
a alternativa correta. 
a ) 
A operação de união, quando aplicada a linguagens, resulta no produto vetorial 
entre os elementos desses conjuntos. 
b ) 
Expressões regulares são expressões algébricas formadas pelas operações 
de união, concatenação e fechamento de Kleene. 
c ) 
O fechamento de Kleene é uma operação binária que deve ser realizada entre 
duas linguagens. 
d ) 
Não é possível realizar a concatenação entre linguagens quando uma delas é o 
resultado da aplicação do fechamento de Kleene. 
e ) 
A concatenação é o resultado da operação do fechamento de Kleene quando 
aplicado a duas linguagens distintas. 
Ver justificativa da resposta 
 
QUESTÃO 5 
As máquinas de estados finitos precisam apenas da definição do alfabeto,dos 
estados e da função de transição para identificar se determinado conjunto 
de símbolos de entrada (string) faz parte ou não de uma linguagem regular. 
Considerando as máquinas de estados finitos e um alfabeto composto 
apenas de 0 e 1, marque entre as alternativas a seguir aquela que 
representa uma máquina de estados finitos capaz de reconhecer strings de 
uma linguagem em que todas as strings devem ser terminadas em três 
números 1. 
a ) 
 
b ) 
 
c ) 
 
d ) 
 
e ) 
 
Ver justificativa da resposta 
 
 
QUESTÃO 6 
Para que um programa possa ser executado em uma máquina, os softwares 
responsáveis pela tradução de linguagens precisam encontrar formas de 
adequar os artefatos da linguagem de programação à linguagem de 
máquina. Nesse caso, podemos afirmar que: 
a ) 
algumas linguagens têm performance melhor que outras, como no caso do 
Rust comparado ao Go. 
b ) 
a linguagem de programação não tem impacto na segurança do código em 
execução. 
c ) 
a performance do programa em execução não tem relação com a linguagem 
utilizada para criar o algoritmo. 
d ) 
todas as linguagens de programação criam o mesmo código de máquina, cuja 
única diferença é o algoritmo implementado. 
e ) 
o programa em execução ou o binário em memória - a verdadeira linguagem de 
máquina - depende da máquina na qual será executado. 
Ver justificativa da resposta 
 
 
QUESTÃO 7 
O conceito de tipos é fundamental para a criação de programas seguros e 
eficientes. Cabe ao analisador semântico avaliar a aplicação dos tipos em 
declarações e operações. Essa não é uma tarefa trivial e requer o 
entendimento de alguns conceitos importantes. Considere as afirmativas a 
seguir e as marque como verdadeiras (V) ou falsas (F). 
( ) Os tipos existem para identificar os códigos binários que estarão 
armazenados em memória. 
( ) Os tipos existem para garantir que os processos de interpretação e 
compilação possam manipular os dados corretamente. 
( ) Os tipos determinam a forma como os dados devem ser armazenados 
em memória e um conjunto de regras determina como realizar esse 
armazenamento. 
( ) Números inteiros, números de ponto flutuantes e caracteres são 
exemplos de tipos. 
Marque a alternativa que apresenta a sequência correta. 
a ) 
V/ V/ V/ F 
b ) 
F/ F/ F/ F 
c ) 
V/ V/ V/ V 
d ) 
F/ F/ V/ F 
e ) 
F/ V/ V/ V 
Ver justificativa da resposta 
 
 
QUESTÃO 8 
Analisadores sintáticos são artefatos de software desenvolvidos para validar a 
estrutura das declarações de uma linguagem de programação. Para isso, 
usam gramáticas. Sobre isso, considere as afirmativas a seguir e marque a 
alternativa correta. 
a ) 
Linguagens livres de contexto são definidas por gramáticas regulares. 
b ) 
Gramáticas são um conjunto finito de regras que permite definir como as 
declarações de uma linguagem são formadas. 
c ) 
A classificação das gramáticas de Chomsky exclui justamente as gramáticas que 
precisamos definir para linguagens livres de contexto. 
d ) 
O uso de gramáticas limita a criação de linguagens de programação a linguagens 
regulares. 
e ) 
As gramáticas são ferramentas de análise sintática cujo uso é limitado às 
linguagens naturais. 
Ver justificativa da resposta 
 
QUESTÃO 9 
Não é raro encontrar um livro ou artigo que se refere ao Assembly como uma 
linguagem de baixo nível por estar mais próxima da máquina que do ser 
humano, nem que programar em Assembly permite conseguir o máximo de 
desempenho possível de determinado sistema computacional. Ainda que 
seja a primeira linguagem de programação, com origem na década de 1950, 
justamente graças a sua especificidade, ainda é uma das mais 
desconhecidas. Considerando o Assembly e o ambiente de 
desenvolvimento de programas, marque a alternativa correta. 
a ) 
O uso de recursos como os macros não faz sentido em programas escritos em 
Assembly. 
b ) 
Já que a linguagem Assembly é específica de uma arquitetura, não podemos 
programar nela a arquitetura Intel para gerar executáveis Arm. 
c ) 
O Assembly não pode ser considerado uma linguagem de programação, e sim 
uma forma diferente de linguagem de máquina. 
d ) 
Chamamos de assembler o artefato de software responsável por traduzir o 
Assembly em linguagem de máquina. 
e ) 
O processo de tradução do Assembly em código de máquina é mais complexo que 
o de tradução do Java ou do C++. 
Ver justificativa da resposta 
 
QUESTÃO 10 
Um dos objetivos de criarmos linguagens de programação é tornar mais simples 
para os seres humanos o processo de utilizar máquinas para resolver 
problemas. Nesse esforço, também simplificamos as expressões regulares, 
abstraindo conceitos matemáticos complexos em símbolos mais simples. 
Por exemplo, usamos o símbolo | (barra vertical) para representar a união, o 
? (ponto) para representar a concatenação e o * (asterisco) para 
representar o fechamento de Kleene. Com essas informações em mente, 
marque a alternativa correta. 
 
a ) 
 
b ) 
 
c ) 
 
d ) 
 
e ) 
 
Ver justificativa da resposta 
 
QUESTÃO 1 
Sistemas embarcados, geralmente sistemas simples em que uma CPU tem 
acesso direto aos seus dispositivos de memória, entrada e saída e que, 
geralmente, rodam apenas um programa de cada vez, não precisam de 
qualquer tipo de encapsulamento do binário gerado em um processo de 
tradução de linguagem de programação para linguagem de máquina. Isso 
não pode ser dito de máquinas que executam sistemas operacionais. 
Marque como verdadeiro (V) ou falso (F) as afirmativas. 
 
( ) Encapsular um binário é o processo de incluir as informações 
necessárias para que o sistema operacional saiba como executá-lo. 
( ) O processo de encapsulamento é idêntico para todos os sistemas 
operacionais desde os tempos do Unix. 
( ) O processo de encapsulamento do Windows permite gerar diversos tipos 
diferentes de executáveis. 
 
( ) Graças ao encapsulamento podemos executar binários executáveis do 
Windows no Linux e no Unix. 
 
 
Agora assinale a alternativa que apresenta a sequência correta. 
a ) 
V/ V/ F/ F 
b ) 
F/ F/ V/ V 
c ) 
V/ V/ V/ F 
d ) 
V/ F/ V/ F 
e ) 
F/ V/ F/ V 
Ver justificativa da resposta 
 
QUESTÃO 2 
A criação de analisadores léxicos e sintáticos é um trabalho não trivial e 
frequentemente longo. Alguns programadores, quando criam suas próprias 
linguagens de programação, preferem usar programas geradores de 
analisadores léxicos e sintáticos. Sobre isso, marque a alternativa correta. 
a ) 
O uso de programas geradores é a única forma de utilizarmos parsers LL(1). 
b ) 
O Flex é um aplicativo que gera analisadores léxicos, enquanto o Bison gera 
analisadores sintáticos. 
c ) 
O Antlr gera analisadores léxicos e sintáticos com base em um conjunto de código 
de máquinas. 
d ) 
Programas como o Flex geram parsers LR(1). 
e ) 
Programas como o Bison geram analisadores léxicos para parsers LL(1). 
Ver justificativa da resposta 
 
QUESTÃO 3 
Um dos objetivos de criarmos linguagens de programação é tornar mais simples 
para os seres humanos o processo de utilizar máquinas para resolver 
problemas. Nesse esforço, também simplificamos as expressões regulares, 
abstraindo conceitos matemáticos complexos em símbolos mais simples. 
Por exemplo, usamos o símbolo | (barra vertical) para representar a união, o 
? (ponto) para representar a concatenação e o * (asterisco) para 
representar o fechamento de Kleene. Com essas informações em mente, 
marque a alternativa correta. 
 
a ) 
 
b ) 
 
c ) 
 
d ) 
 
e ) 
 
Ver justificativa da resposta 
 
 
QUESTÃO 4 
Para que uma máquina possa executar um algoritmo, temos duas opções: ou 
escrevemos o código usando o código binário ou traduzimos uma 
linguagem de programação nesse binário. A tradução tornou a 
programação simples e permitiu a criação de toda a tecnologia que temos 
hoje. Levando em conta esses conceitos, considere as afirmativas a seguir. 
 
1. Programar em Assembly permite obtermos o máximo de performance 
sem conhecimento daarquitetura da máquina. 
2. O código de máquina gerado para uma arquitetura, como já está 
otimizado, pode ser utilizado em arquiteturas diferentes. 
3. O processo de compilação gerará um código de máquina diferente para 
arquiteturas diferentes. 
 
Agora marque a alternativa correta. 
a ) 
Apenas as afirmativas 1 e 2 estão corretas. 
b ) 
Apenas a afirmativa 1 está correta. 
c ) 
Apenas a afirmativa 3 está correta. 
d ) 
Apenas as afirmativas 1 e 3 estão corretas. 
e ) 
Apenas a afirmativa 2 está correta. 
Ver justificativa da resposta 
 
QUESTÃO 5 
O processo de análise semântica pode ser feito de forma dinâmica, em tempo de 
execução, ou estática, em tempo de compilação. A escolha, pelos 
criadores da linguagem, das técnicas de anotação e validação de tipos 
definirá se a análise semântica será estática ou dinâmica. Considere as 
seguintes afirmações. 
1. Independentemente de a análise semântica ser estática ou dinâmica, só 
existem duas ações possíveis: correção do erro ou aviso do erro. 
2. Na análise sintática ou dinâmica, se você usar um compilador, deverá 
configurá-lo para apresentar todos os warnings. 
3. Existe apenas uma validação que não pode ser realizada de forma 
dinâmica: a validação dos tipos. 
Selecione, entre as alternativas a seguir, aquela que está correta. 
a ) 
Apenas a afirmativa 2 está correta. 
b ) 
Apenas a afirmativa 1 está correta. 
c ) 
Apenas as afirmativas 1 e 2 estão corretas. 
d ) 
Apenas as afirmativas 1 e 3 estão corretas. 
e ) 
Apenas a afirmativa 3 está correta. 
Ver justificativa da resposta 
 
QUESTÃO 6 
Uma forma interessante de analisar a aplicação de tipos utiliza como base o 
cálculo de sequentes. Nesse cálculo, determinamos axiomas e operações 
e, para cada operação realizada no código, tentamos aplicar uma regra que 
permita deduzir se a operação está correta ou não. Considere as seguintes 
afirmações. 
1. Um axioma é uma verdade relativa que depende do resultado das 
operações que serão realizadas com os tipos analisados. 
2. O cálculo de sequentes se baseia em um contexto definido por uma 
catraca, as operações à esquerda da catraca são chamadas de 
conclusões, e as operações à direita são chamadas de suposições. 
3. O cálculo de sequentes é uma forma de implicação simples, precisa e 
não ambígua de validar um tipo, encontrando a verdade de um conjunto de 
operações lógicas. 
Analisando as afirmativas anteriores, marque, entre as alternativas a seguir, 
aquela que está correta. 
a ) 
A afirmativa 3 está correta. 
b ) 
As afirmativas 1 e 2 estão corretas. 
c ) 
As afirmativas 2 e 3 estão corretas. 
d ) 
A afirmativa 2 está correta. 
e ) 
A afirmativa 1 está correta. 
Ver justificativa da resposta 
 
QUESTÃO 7 
O processo de análise semântica é um processo contextual. Isso quer dizer que, 
para validar uma determinada declaração, precisamos levar em 
consideração o código que foi escrito antes dessa declaração e, em 
algumas linguagens, o código que foi escrito depois da declaração, até 
mesmo em outros arquivos. Nessa análise, a determinação de escopos é 
indispensável. Considerando a análise semântica e o conceito de escopo, 
marque a alternativa correta. 
a ) 
A definição de uma função cria um espaço de código onde não existe um escopo 
específico. 
b ) 
A análise de escopo pelo analisador semântico requer o uso de uma tabela de 
símbolos. 
c ) 
A existência de escopos torna impossível validar uma variável antes do seu uso. 
d ) 
Os escopos são definidos pelo analisador sintático e não têm relação com o 
código ou com a análise semântica. 
e ) 
O C, C++ e Java são exemplos de linguagens de programação que não usam o 
conceito de escopo. 
Ver justificativa da resposta 
 
QUESTÃO 8 
O projeto LLVM disponibiliza uma estrutura de compilação baseada no uso de 
uma representação intermediária, um código intermediário. Assim foi 
possível criar um conjunto de módulos de front-end para cada linguagem 
de programação desejada e um conjunto de módulos de back-end para 
cada arquitetura alvo desejada. A força do projeto LLVM está, justamente, 
na representação intermediária. Considere as seguintes afirmativas. 
 
1. O código intermediário do projeto LLVM é uma linguagem desenhada 
para permitir otimização manual, se for necessário. 
2. A representação intermediária do projeto LLVM não pode ser 
considerada uma linguagem de programação por não ter uma estrutura de 
tipos. 
3. A representação intermediária do projeto LLVM tem três formas distintas, 
uma textual, uma estrutura de memória e uma espécie de código binário 
parecido com o Bytecode do Java. 
a ) 
Apenas a afirmativa 1 está correta. 
b ) 
Apenas as afirmativas 1 e 3 estão corretas. 
c ) 
Apenas a afirmativa 2 está correta. 
d ) 
Apenas as afirmativas 1 e 2 estão corretas. 
e ) 
Apenas a afirmativa 3 está correta. 
Ver justificativa da resposta 
 
QUESTÃO 9 
Algumas características do formato de executáveis do Windows, o formato PE, 
foram mantidas apenas por compatibilidade com o antigo formato dos 
executáveis do MSDOS. Hoje essas características são usadas apenas para 
indicar que um determinado programa não é compatível com o MSDOS. 
Considere as afirmativas a seguir. 
 
1. Os únicos arquivos que precisam utilizar o formato PE para serem 
reconhecidos como executáveis, no Windows, são do tipo .exe. 
2. No formato PE, o seu binário, executável no Windows, será armazenado 
em uma seção que não tem relação com as seções compatíveis com o 
MSDOS. 
3. O formato PE usa a seção DOS Stub para disparar o seu programa, 
sempre que ele for executado em uma máquina MSDOS. 
 
Marque, entre as alternativas a seguir, aquela que está correta. 
a ) 
Apenas as afirmativas 1 e 2 estão corretas. 
b ) 
Apenas as afirmativas 1 e 3 estão corretas. 
c ) 
Apenas a afirmativa 2 está correta. 
d ) 
Apenas a afirmativa 1 está correta. 
e ) 
Apenas a afirmativa 3 está correta. 
Ver justificativa da resposta 
 
QUESTÃO 10 
A principal função da otimização de código é garantir que o binário gerado com 
base no processo de tradução da linguagem de programação rode o mais 
eficientemente possível. Considerando as divisões didáticas do processo 
de compilação e a existência de um módulo nesse processo, responsável 
por essa otimização, avalie as afirmativas. 
 
1. Toda a otimização realizada no código intermediário deve ser feita de 
maneira a não alterar o algoritmo codificado. 
2. Os processos de otimização realizados no gerador de código 
intermediário são independentes da arquitetura alvo. 
3. As linguagens utilizadas para a geração de código intermediário estão 
mais próximas da linguagem de programação que do Assembly. 
 
Marque, entre as alternativas a seguir, aquela que está correta. 
a ) 
Apenas as afirmativas 1 e 2 estão corretas. 
b ) 
Apenas as afirmativas 1 e 3 estão corretas. 
c ) 
Apenas a afirmativa 2 está correta. 
d ) 
Apenas a afirmativa 3 está correta. 
e ) 
Apenas a afirmativa 1 está correta. 
Ver justificativa da resposta

Mais conteúdos dessa disciplina