Prévia do material em texto
Questão 1/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. Nota: 10.0 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. Você assinalou essa alternativa (C) Você acertou! 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 2/10 - Compiladores Criar o diagrama de fluxo no em 3opCode permite a detecção dos blocos básicos de código. Estes blocos servem como base do processo de otimização. Todos eles começam na chegada de um branch e terminam em um jump e são compostos de código que será sempre executado na mesma ordem. Estes blocos são importantes por que... Marque a alternativa que completa esta definição. Nota: 10.0 A Permitem a análise sintática do código. B Toda e qualquer alteração feita dentro do bloco não impacta no algoritmo. Você assinalou essa alternativa (B) Você acertou! C Toda e qualquer alteração feita entre blocos não impacta no algoritmo. D As alterações realizadas entre blocos aprimoram a análise semântica e permitem a correção automática de tipos. E Linguagens orientadas a objetos usam estes blocos para codificar os métodos mais utilizados. Questão 3/10 - Compiladores Se fossemos reduzir todo o processo de análise semântica e suas funções principais poderíamos dizer que se trata da análise de tipos e de escopo. Primeiro, e mais importante, garantir que todas as declarações, operações e variáveis tenham tipos coerentes e, quando não, proceder a conversão automática ou emitir um erro. Segundo verificar as declarações, variáveis e operações com relação ao escopo. Ainda com relação a verificação de escopo e a linguagem C, qual das opções a seguir é falsa. Nota: 10.0 A Verificar se uma variável foi declarada em duplicidade faz parte das funções do analisador semântico; B Verificar se uma variável foi inicializada antes do uso é parte integrante da verificação de escopo realizada pelo analisador semântico; C Verificar se uma determinada variável foi declarada, mas nunca foi usada está entre as funcionalidades de um analisador semântico; D Verificar se um array, uni ou multidimensional, teve seus limites declarados antes de ser utilizado é parte integrante das funções do analisador semântico; E Verificar se uma função foi declarada antes do seu uso não faz parte das funções do analisador semântico e deve ser verificado pelo analisador sintático durante a formação da árvore sintática. Você assinalou essa alternativa (E) Você acertou! Questão 4/10 - Compiladores No módulo de análise sintática, utilizamos a definição de uma gramática livre de contexto, como base para o processo de análise. Notadamente por que, neste caso, estamos interessados com a forma das declarações e não com o seu significado. No caso da análise semântica isto não é verdade já que um conjunto significativo de erros podem ser detectados no analisador semântico se ele for capaz de entender o sentido das declarações e operações. Entre as afirmações a seguir indique aquela que é verdadeira. Nota: 10.0 A Erros de compatibilidade de tipos não são importantes para o analisador semântico; B A verificação de variáveis e declarações em relação ao escopo de cada bloco de código é função do analisador sintático; C A duplicidade de declarações de variáveis faz parte das funções do analisador semântico; Você assinalou essa alternativa (C) Você acertou! D Sem o analisador semântico o compilador não seria capaz de detectar nenhum erro de digitação; E A tabela de símbolos, muito importante nas análises léxica e sintática não tem função na análise semântica. Questão 5/10 - Compiladores O processo de verificação de tipos torna-se mais importante quando consideramos que, em muitas linguagens de programação, existem tipos complexos e tipos compostos. No caso de tipos compostos como um array ou uma struct, caberá ao analisador semântico a análise dos tipos agregados. Há ainda de se considerar a possibilidade de criação de novos tipos, compostos ou complexos, de acordo com a necessidade do programador. Assim, caberá ao analisador semântico, analisar, por exemplo, um tipo struct criado para atender as necessidades específicas de um programa da mesma forma que ele avalia um tipo inteiro ou real. Com relação a verificação de tipos, qual das afirmativas a seguir é incorreta? Nota: 10.0 A A checagem estática de tipos é feita em tempo de compilação, como é o caso da linguagem C, quando compilada; B A checagem de tipos dinâmica é feita em tempo de execução, como é o caso da linguagem PHP, quando interpretada; C Linguagens de programação podem exigir a definição de tipo para cada variável ou estrutura de dados composta ou, podem determinar estes tipos em tempo de execução, dependendo de escolhas realizadas na definição da linguagem; D A definição de tipos complexos, como listas e pilhas, independe da linguagem de programação e, como tal, estes tipos podem ser verificados por qualquer analisador semântico; Você assinalou essa alternativa (D) Você acertou! E Ainda que tipos complexos e compostos tornem o processo de análise semântica mais complexo e demorado, as funcionalidades que são agregadas as linguagens de programação por estes constructors torna sua utilização indispensável. Questão 6/10 - Compiladores Os erros que devem ser verificados pelo analisador semântico, notadamente os que são relacionados com o escopo das variáveis devem incluir a verificação de argumentos e tipos de funções. Os tipos podem ser verificados pela análise de retorno das funções, no caso da linguagem C por exemplo. Neste caso, tudo que é necessário é garantir que a declaração da função coincide com o que ela retorna. Já no caso dos argumentos de uma função, este processo é um pouco mais complicado por que requer, além da verificação do protótipo da função, ou assinatura, a verificação de todas a chamadas a essa função. Neste caso, considerando as afirmativas a seguir, marque a alternativa errada. Nota: 10.0 A Uma das deficiências da linguagem C está na definição do tipo array que não inclui uma regra de verificação de limites, passando para o programador a responsabilidade sobre a verificação destes limites mesmo quando estes arrays são argumentos de uma função; B Métodos de classes, em linguagens orientadas a objetos não precisam que o analisador semântico observe a consistência dos seus argumentos. A exceção a esta regra é o constructor; Você assinalou essa alternativa (B) Você acertou! C A verificação de argumentos de funções, em todas as chamadas, deve incluir, obrigatoriamente, a verificação dos tipos destes argumentos; D No caso dos argumentos de funções, a verificação de tipos destes argumentos pelo analisador semântico pode produzir uma conversão automática de tipos ou um erro; E Além dos tipos, relativos aos argumentos, o analisador semântico deve se preocupar também com a ordem destes argumentos. Questão 7/10 - Compiladores A análise semântica tem o objetivo de verificar a validade das declarações e operações contidas em um código de alto nível. Esta análise, entre outras coisas, verificao tipo de cada declaração, operação, operando e variável em busca de inconsistências. Com isso em mente marque a alternativa incorreta entre as opções a seguir: Nota: 10.0 A A análise semântica é o último grande bloco antes da geração do código intermediário; B A análise semântica indica o tipo das variáveis por meio de etiquetas colocadas na árvore sintática; C Se for necessário, caberá ao processo de análise semântica a marcação das conversões automáticas de tipos; D A determinação dos tipos depende do escopo da variável; Você assinalou essa alternativa (D) Você acertou! A verificação de tipos independe do escopo das variáveis, declarações e operações. E Podemos chamar de árvore semântica a árvore sintática após o processo de análise semântica. Questão 8/10 - Compiladores O processo de compilação é complexo. Para seu entendimento dividimos este processo em módulos de acordo com suas funcionalidades principais. Desta forma temos o analisador léxico, o analisador sintático, o analisador semântico entre outros dependendo apenas da didática utilizada para explicar cada um destes módulos e suas funcionalidades. Do ponto de vista da manutenção dos dados necessários ao processo de compilação, no entanto, há um módulo que permeia todos os outros, a tabela de símbolos. É nesta estrutura de dados que estão armazenados os tokens, a árvore sintática e a árvore semântica. Considerando as afirmativas a seguir marque a que está correta. Nota: 10.0 A A árvore semântica é a árvore sintática que foi identificada (etiquetada) pelo analisador semântico, contendo correções de tipos, indicações de erro; Você assinalou essa alternativa (A) Você acertou! B A criação da árvore semântica começa antes do processo de criação de tokens; C Chamamos de árvore semântica ao conjunto de linhas que compõe todas as declarações do código na forma em que foram escritas; D A árvore semântica será descartada ao término do processo de análise semântica e não afetará a geração de código; E Eventuais erros detectados pelo analisador semântico provocam a poda da árvore sintática retirando desta as declarações onde os erros foram encontrados facilitando a geração do código executável; Questão 9/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? Nota: 10.0 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. C O uso do 3opCode é recomendado já que este código é bem próximo do Assembly e a conversão acaba sendo mais simples. Você assinalou essa alternativa (C) Você acertou! D Na fase de otimização o compilador busca encontrar os últimos erros de sintaxe que existem no código. E A parte mais importante do processo de otimização independente é o reconhecimento das funções de endereçamento específicas da arquitetura visada que tornarão o código mais rápido. Questão 10/10 - Compiladores O 3opCode pode ser escrito de uma forma mais adequada a nossa álgebra para permitir a leitura e otimização manual do código. Ainda que o processo de otimização manual esteja fora de uso. Em alguns casos onde uma pequena variação na eficiência do código tenha grande impacto financeiro este tipo de otimização pode ser necessário. Neste caso, recorremos aos blocos básicos e ao diagrama de fluxo como ferramentas para otimização de código. Considerando esta fase do processo de compilação qual das afirmativas a seguir contém otimizações que são feitas utilizando-se os blocos básicos? Nota: 10.0 A Adequação dos tipos e remoção de código morto. B Remoção de redundâncias e código morto. Você assinalou essa alternativa (B) Você acertou! C Remoção de redundância e correção de estruturas sintáticas. D Adequação dos tipos e correção de escopo. E Correção de escopo e remoção de redundâncias.