Prévia do material em texto
90% de acerto (dúvida nas questões 3 e 5)
Questão 1/10 - Compiladores
O processo de compilação não é estático e, ao longo das últimas décadas, tem evoluído de forma quase
contínua. Uma das tecnologias mais promissoras do começo do século XXI está no projeto conhecido
como LLVM (Low Level Virtual Machine) que consiste em uma tentativa de criar compiladores, mas
flexíveis, rápidos e eficientes. Considerando o processo de compilação monolítico, comparado com o
processo do LLVM, marque a alternativa correta.
A O LLVM, apesar de utilizar uma arquitetura modular, não permite que o código objeto
criado (bytecode) possa ser otimizado para arquiteturas diferentes;
B Em um processo monolítico de compilação, tudo que precisamos fazer para gerar
código para arquiteturas diferentes é reescrever os analisadores sintático, léxico e
semântico;
C A grande vantagem do processo monolítico é justamente a tabela de símbolos, que
permite a geração de código para diversas arquiteturas para um mesmo processo de
otimização;
D O LLVM, apesar de ser modular, não permite a criação de módulos diferentes para as
mesmas linguagens de programação. Ou seja, o programador terá que se contentar
com o otimizador de código disponível para a linguagem que utiliza;
E O LLVM, utiliza uma arquitetura modular permitindo que o código gerado em uma
linguagem de programação possa ser compilado para diversas arquiteturas,
praticamente ao mesmo tempo já que o código objeto gerado é independente da
arquitetura alvo.
Questão 2/10 - Compiladores
Antes da geração do código executável, o programa que será executado em uma determinada
arquitetura, o compilador realiza uma otimização de código específica para a arquitetura visada. Neste
momento, a otimização específica, ou dependente da máquina, o código oriundo do módulo de geração
de código é, finalmente, adequado a máquina onde será executado. Considerando esta última fase, qual
das afirmações a seguir está errada.
A É na fase de geração de código executável, logo após a otimização que o código é
encapsulado no formato exigido pelo sistema operacional.
B A otimização específica para uma arquitetura permite que o código executável utilize da
melhor forma possível todos os recursos da máquina.
C Ainda que o código seja otimizado várias vezes e de formas diferentes, não é possível
afirmar que o programa resultante é perfeito.
D O código executável, gerado na última fase da compilação contém a tabela de símbolos
criada durante todo o processo de compilação.
E No processo de compilação existe pelo menos uma fase de eliminação de código morto.
Questão 3/10 - Compiladores Duvida
O analisador semântico verifica o sentido das frases, definidas na árvore sintática pelo analisador
sintático. Com esta análise é possível identificar erros como a duplicidade na definição de variáveis ou
a inexistência de um determinado parâmetro de uma função determinada. Estes erros são, em geral,
reportados ao programador para que ele possa corrigi-los. Porém, alguns erros, como certos erros de
tipos podem ser automaticamente resolvidos pelo compilador. A esse processo damos o nome de type
casting. Com relação ao analisador semântico, marque a alternativa correta.
A A análise semântica começa pela marcação das variáveis duplicadas na árvore sintática;
B A análise semântica precede a análise léxica e fornece a esta os lexemas necessários;
C Uma vez que todos os tipos sejam identificados é possível identificar onde será possível
realizar o type casting;
D Uma vez que todos os tipos sejam identificados é possível começar o processo de
otimização de código voltado para a arquitetura alvo;
E A análise semântica precede a análise sintática e fornece as informações de tipos
necessárias a criação da árvore de lexemas;
Questão 4/10 - Compiladores
Dado o alfabeto Σ={1,0}Σ={1,0} identifique, nas opções a seguir, a máquina de estados finitos capaz de
identificar strings binárias que representam números múltiplos de 2 e não de 4.
A
B
C
D
E
Questão 5/10 - Compiladores Duvida
“Chamamos de programa ao resultado da transcrição da linguagem de programação em linguagem de
máquina que está adequadamente formatado para ser executado em uma determinada máquina. Por
outro lado, chamamos de código ao texto que você escreve para sequenciar os comandos que
representam o algoritmo que você quer executar. ” Desta forma é fácil perceber que a função do
compilador é transcrever o código, escrito em linguagem de alto nível, em código binário que possa ser
executado em uma dada arquitetura. Já, no que diz respeito aos interpretadores, podemos afirmar que:
Marque a alternativa errada.
A Interpretadores são compiladores que não necessitam da geração de um arquivo
contendo código intermediário ou código executável;
B A principal função do interpretador é transcrever código, em linguagem de alto nível, em
linguagem de máquina;
C Os interpretadores ocupam um nicho específico de mercado onde não é necessário
compartilhar o código executável;
D Em ambientes que usam interpretadores, em última análise, o código deve ser transcrito
todas as vezes que você desejar usar o programa;
E Uma das diferenças entre compiladores e interpretadores está no fato que os
compiladores podem alterar o código binário gerado de acordo com os dados digitados
pelo usuário durante o uso do arquivo executável criado durante o processo de
transcrição.
Questão 6/10 - Compiladores
Dificilmente você encontrará uma RegEx que não utiliza algum operador de repetição. A ideia
principal desses operadores é permitir que você defina um padrão específico que você espera que
ocorra um determinado número de vezes. Os operadores de repetição são:
? determina que o que vier imediatamente antes dele deve aparecer 0 ou 1 vez na expressão;
* determina que o que vier imediatamente antes dele deve aparecer 0 ou mais vezes na expressão;
+ determina que o que vier imediatamente antes dele deve aparecer 1 ou mais vezes na expressão;
{n} determina que o que vier antes dele deve ser repetido n vezes.
Também será muito difícil encontrar uma expressão regular que não tenha pelo menos um caractere
que seja excluído da análise. Para tal usamos a \ (contra-barra). Com esta informação selecione, entre
as opções a seguir, a expressão regular capaz de identificar uma placa de carro no Brasil sabendo que a
placa é formada de três letras maiúsculas, um hífen e um número inteiro de 4 dígitos.
A [A - Z]{3}\-[0 - 9]{4};
B [AAA]\3\-[9999]\3;
C {3} [A - Z]-{4} [0 - 9];
D [A - Z]*3-[0 - 9]*4;
E [AAA]-[9999];
Questão 7/10 - Compiladores
Em busca da eficiência na execução dos programas, ao longo do tempo, o processo de compilação
ficou complexo e sujeito a erros e a tempos muito longos. Uma forma de tornar o processo de
compilação mais eficiente foi a divisão deste processo em módulos dedicados. Assim, temos um
módulo apenas para fazer a análise sintática do texto e outro apenas para entender o conteúdo
semântico e assim sucessivamente. Quanto ao analisador sintático é verdadeiro dizer que:
Marque a alternativa correta
A O analisador sintático, apesar de fazer parte do processo de compilação, é totalmente
dispensável e não altera o resultado final;
B A principal função do analisador sintático é enviar os tokens necessários ao
funcionamento do analisador Léxico;
C O analisador sintático, para efetuar sua tarefa, organiza os tokens, enviados pelo
analisador léxico em uma árvore;
D A análise sintática só pode ser realizada depois que o seu código-fonte esteja convertidoem linguagem de máquina;
E A maior parte de todas as linguagens formais, utilizadas para a programação de
computadores dispensa o uso de analisadores sintáticos.
Questão 8/10 - Compiladores
A geração do código intermediário, ou código objeto, encerra o processo de compilação no que diz
respeito ao código original. Nesta fase, o código originado do analisador semântico é submetido a
algumas rotinas de otimização visando melhorar o tempo de execução, o uso de memória e o consumo
de energia. Neste processo, o código é representado em uma notação próxima da linguagem Assembly
mas, ainda independente da máquina. Qual das afirmativas a seguir está correta com relação a esta fase
do processo de compilação?
A É na fase de otimização independente de máquina que o compilador torna o código mais
eficiente para uso na arquitetura x86.
B Na fase de otimização, independente de máquina, o código é otimizado removendo-se
todos os laços do programa de forma que não exista nenhum branch.