Baixe o app para aproveitar ainda mais
Prévia do material em texto
Atividade 4 Iniciado: 10 abr em 18:38 Instruções do teste Pergunta 1 0,2 pts Importante: Caso você esteja realizando a atividade através do aplicativo "Canvas Student", é necessário que você clique em "FAZER O QUESTIONÁRIO", no final da página. 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: A+ A A- NOTA: 0.8 de 1.0 Pergunta 2 0,2 pts 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. 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. As asserções I e II são ambas proposições falsas. 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. Fonte: LOUDEN, K. C. Compiladores: princípios e práticas. São Paulo. Cengage Learning Brasil, 2004. Dependendo da linguagem escolhida, a tabela de caracteres pode servir a qual propósito? Armazenar os nomes de todas as entidades de forma estruturada em vários locais de acordo com a estrutura. Armazenar informações do código hash do objeto durante o processo de compilação. 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. Mapear nomes lidos pelo compilador para suas informações correspondentes. A+ A A- Pergunta 3 0,2 pts Pergunta 4 0,2 pts 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. A geração de código inclui várias subtarefas específicas e relativamente independentes. Obviamente, a independência dessas subtarefas é relativa. 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. 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. 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. 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 A+ A A- Pergunta 5 0,2 pts 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: II e III, apenas. III, apenas. I, apenas. I, II e III. I e III, apenas. 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. A+ A A- Salvo em 17:07 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: I. Quase todas as linguagens são capazes de criar automaticamente variáveis temporárias para resultados intermediários de tipos simples. II. 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. III. Ao executar o código, o interpretador usa os valores do contador do programa, receptor, literais e variáveis temporárias. IV. É 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: I e III, apenas. II, III e IV, apenas. I e II, apenas. II e III, apenas. I, II e IV, apenas. Enviar teste A+ A A-
Compartilhar