Prévia do material em texto
Pergunta 1 Leia o texto a seguir: O comportamento de uma tabela de símbolos depende fortemente das propriedades das declarações da linguagem traduzida. Por exemplo, a forma como as operações inserir e remover manipulam a tabela de símbolos, quando essas operações devem ser ativadas e quais atributos devem ser inseridos na tabela, tudo isso varia muito de linguagem para linguagem. Até mesmo o momento durante a tradução/execução em que a tabela de símbolos pode ser construída, e por quanto tempo essa tabela deve existir, pode variar muito entre as diferentes linguagens. Dependendo da linguagem escolhida, a tabela de caracteres pode servir a qual propósito? Grupo de escolhas da pergunta ( ) Mapear nomes lidos pelo compilador para suas informações correspondentes. ( ) Armazenar informações do código hash do objeto durante o processo de compilação. ( ) Armazenar os nomes de todas as entidades de forma estruturada em vários locais de acordo com a estrutura. ( ) Criar símbolos predefinidos após o processo de compilação para guardar informações dos nomes. ( ) Implementar novas atribuições e expressões no código-fonte que sejam semanticamente incorretas. Pergunta 2 Leia o texto a seguir: O código de três endereços é uma sequência de instruções no formato x := y op z, onde x, y e z são nomes, constantes ou objetos temporários gerados pelo compilador. Aqui, op é uma operação de dois lugares, como ponto flutuante ou aritmética fixa, booleana ou bit a bit. O lado direito pode conter apenas um sinal da operação. Os objetos temporários são objetos que não possuem nomes no código e são criados implicitamente pelo compilador em alguns casos. Considerando isso, avalie as afirmações a seguir: Quase todas as linguagens são capazes de criar automaticamente variáveis temporárias para resultados intermediários de tipos simples. Durante a chamada de uma função, o arquivo temporário apresenta uma forma de alocação de dados, chamado de registro de desativação. Ao executar o código, o interpretador usa os valores do contador do programa, receptor, literais e variáveis temporárias. É recomendável usar ponteiros ou referenciar partes de um objeto temporário, pois não há riscos de ir para o lixo. É correto o que se afirma apenas em: Grupo de escolhas da pergunta ( ) I e III, apenas. ( ) II, III e IV, apenas. ( ) I, II e IV, apenas. ( ) I e II, apenas. ( ) II e III, apenas. Pergunta 3 Leia o texto a seguir: O processo de geração de código é realizado por um componente conhecido como gerador de código, parte do compilador de programa. O código-fonte original de qualquer programa passa por vários ganhos antes que o executável final seja gerado, e quando for finalmente gerado é, na verdade, um código de máquina que os sistemas de computador podem executar facilmente. A geração do código é a última fase da tradução. Seu resultado é um módulo montador ou um módulo de objeto (ou inicialização). Ao contrário das linguagens interpretadas, as compiladas não executam o código imediatamente. Ele deve ser construído primeiro, o que é uma etapa extra e um tempo extra. O código é mais difícil de depurar: você tem que recompilá-lo para cada, mesmo uma pequena mudança. O próprio processo de encontrar e eliminar erros pode não ser claro. Considerando as reflexões apresentadas, assinale a opção correta. Grupo de escolhas da pergunta ( ) A tarefa de um gerador de código é construir um programa de máquina equivalente para um programa em linguagem de entrada. A entrada para um gerador de código é uma representação desprotegida. ( ) Nos estágios intermediários da construção, as regras de otimização de código são aplicadas várias vezes, sendo que esses processos de otimização dependem uns dos outros. ( ) A geração de código inclui várias subtarefas específicas e relativamente independentes. Obviamente, a independência dessas subtarefas é relativa. ( ) Todos os geradores de código têm muito em comum, e os principais algoritmos utilizados diferem, via de regra, apenas em detalhes relacionados à geração de saída. ( ) Depois de passar pela face, várias árvores de análise são geradas. Neste ponto, o gerador de código converte de imediato em endereçamento direto por meio do registrador de endereços. Pergunta 4 Leia o texto a seguir: Uma matriz de símbolos é muito conveniente para projetar como um tipo de dados abstrato ou como uma classe. Dessa forma: · Alterações internas na forma como ele é organizado não afetarão o restante do código do compilador. · Namespaces diferentes são facilmente definidos como tabelas de símbolos diferentes. Tabela de símbolos é uma importante estrutura de dados criada e mantida pelo compilador para acompanhar a semântica das variáveis, ou seja, armazena informações sobre o escopo e informações sobre nomes, informações sobre instâncias de várias entidades, como nomes de variáveis e funções, classes, objetos, etc. Refletindo sobre a tabela de símbolos, avalie as seguintes asserções e a relação proposta entre elas. I. A tabela com uma lista encadeada, quando uma sequência de células ligadas ou encadeadas umas às outras, é adequada para arrays com um número muito pequeno de símbolos. PORQUE II. É rápido inserir e pesquisar na tabela encadeada, já que serve para armazenar elementos em certa ordem, mas ela requer um design cuidadoso da provisão para casos de colisão. A respeito dessas asserções, assinale a opção correta: ( ) Grupo de escolhas da pergunta ( ) A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. ( ) As asserções I e II são proposições verdadeiras, e a II é uma justificativa da I. ( ) As asserções I e II são ambas proposições falsas. ( ) A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. ( ) As asserções I e II são proposições verdadeiras, mas a II não é uma justificativa da I. Pergunta 5 Leia o texto a seguir: O registro do tipo de cada identificador de variável é realizado durante a análise de um bloco de declarações. Nessa altura é criada uma entrada na tabela de símbolos e registrado o tipo associado à variável. Quando a definição de uma função é analisada, cria-se uma entrada na tabela dos símbolos com o identificador da função como chave. Deve-se associar o tipo de retorno e memorizar o tipo de cada parâmetro. Fonte: SANTOS, P. R.; LANGLOIS, T. Compiladores - Da Teoria à Prática. São Paulo. Grupo GEN, 2018. Considere o texto acima para analisar as seguintes afirmações: I. Podemos dizer que um identificador permite criar regras específicas e estas independam todas de um identificador comum. II. Um identificador se comporta da mesma maneira, conforme apareça em uma declaração ou na chamada de uma função. III. É fato que um identificador não pode ser uma palavra-chave devido as palavras-chave serem de ordem reservadas. É correto o que se afirma em: Grupo de escolhas da pergunta ( ) I, apenas. ( ) I e III, apenas. ( ) III, apenas. ( ) II e III, apenas. ( ) I, II e III. Pergunta 1 Leia o texto a seguir: O comportamento de uma tabela de símbolos depende fortemente das propriedades das declarações da linguagem traduzida. Por exemplo, a forma como as operações inserir e remover manipulam a tabela de símbolos, quando essas operações devem ser ativadas e quais atributos devem ser inseridos na tabela, tudo isso varia muito de linguagem para linguagem. Até mesmo o momento durante a tradução/execução em que a tabela de símbolos pode ser construída, e por quanto tempo essa tabela deve existir, pode variar muito entre as diferentes linguagens. Dependendo da linguagem escolhida, a tabela de caracteres pode servir a qual propósito? Grupo de escolhas da pergunta ( ) Mapear nomes lidos pelo compilador para suas informações correspondentes. ( ) Armazenar informações do código hash do objeto durante o processo de compilação. ( ) Armazenar os nomes de todas as entidades de forma estruturada em vários locais de acordo com a estrutura. ( ) Criar símbolos predefinidos após o processo decompilação para guardar informações dos nomes. ( ) Implementar novas atribuições e expressões no código-fonte que sejam semanticamente incorretas.