Prévia do material em texto
Síntese de código - Compiladores Exercícios 1. Basicamente, há duas fases de compiladores, e cada uma delas cria uma representação do código original mais próxima do código que a máquina consegue executar. Considerando o momento em que a síntese é realizada e seus objetivos, assinale a alternativa correta. Você acertou! B. A síntese é realizada após os procedimentos de análise léxica, sintática e semântica, e seu objetivo é permitir a geração do código de máquina. A síntese é realizada após os procedimentos de análise léxica, sintática e semântica, e seu objetivo é permitir a geração do código de máquina. Não se pode atribuir à síntese o objetivo de validar procedimentos anteriores. Sempre haverá a garantia de que os procedimentos de análise léxica, sintática e semântica entregarão um código livre de erros ao procedimento de síntese. Não se pode também associar a síntese com a mera otimização do código. Pelo sequenciamento estabelecido pelo compilador, não se pode posicionar a síntese durante ou antes dos procedimentos de análise. 2. A utilidade de um código intermediário entre as linguagens de alto nível e de baixo nível não se resume à simplificação das tarefas envolvidas no processo de compilação. Além dessa simplificação, o uso de um código intermediário apresenta outras vantagens. Considerando a finalidade da geração de um código intermediário, analise os itens que seguem: I. Flexibilização dos procedimentos de análise do código. II. Aumento do número de compiladores necessários para máquinas diferentes. III. Independência dos detalhes sintáticos da linguagem original. É correto o que se afirma em: Você acertou! A. apenas III. O item I não é correto. A criação de um código intermediário entre o original e o código-objeto acarreta flexibilidade ao processo de compilação, mas não exatamente aos procedimentos de análise. O item II também não é correto, já que a geração de código intermediário visa à diminuição do número de compiladores necessários para máquinas diferentes. Por fim, o item III é correto, já que expressa a desvinculação dos detalhes da linguagem original no processo de geração do código final. 3. As linguagens intermediárias geradas pelo compilador podem estar em níveis diferentes de abstrações. Tomando como referência o conceito e os objetivos de uma representação de código intermediário em baixo nível de abstração, julgue as afirmativas a seguir em verdadeiras (V) ou falsas (F): ( ) A representação de baixo nível é a mais distante do código a ser executado pelo processador, pois ainda precisa ser otimizada. ( ) As instruções contidas nesse nível de representação devem ser aquelas próprias do processador para o qual o código está sendo gerado. ( ) O compilador fará a geração do código em baixo nível de abstração apenas para casos em que o código-fonte for escrito em linguagem Assembly. Assinale a alternativa que contém a sequência correta de V e F. Você acertou! B. F – V – F. A primeira afirmação é falsa, pois a representação em baixo nível de abstração é a mais próxima da linguagem que o compilador poderá executar. A segunda afirmação é verdadeira, pois será por meio dessa linguagem que o compilador poderá executar com seu próprio conjunto de instruções o código traduzido. Por fim, a terceira afirmação também é falsa, pois a geração desse tipo de código independe da linguagem em que o programa-fonte foi escrito. 4. Considerando elementos relacionados à geração de código de máquina, assinale a alternativa que contém os termos que preenchem corretamente as lacunas da sentença que segue: A geração do código de máquina a partir do código __________________ é feita com mais _________________ a partir da tradução exata de uma instrução do primeiro tipo de código para a instrução correspondente do segundo código, embora possa haver instruções em uma linguagem que sejam capazes de executar ________________ instruções da outra. Resposta correta. D. intermediário / facilidade / múltiplas. A solução mais simples para gerar código de máquina a partir de código intermediário é traduzir cada instrução do código intermediário para uma ou mais instruções de código de máquina, embora muitas vezes seja possível encontrar uma instrução de código de máquina que cubra duas ou mais instruções de linguagem intermediária. Essa correspondência exata de “um para um” também falha nas formas possíveis de se gerar um código de máquina, pois não existe apenas uma maneira de obtê-lo, e, além disso, não existe um único objetivo no qual a geração de código se apoia. Portanto, a alternativa correta é: intermediário / facilidade / múltiplas. 5. Os bytecodes são as instruções de um processador virtual que podem ser codificadas em um único byte por um ambiente denominado "máquina virtual Java", ou JVM, utilizando um interpretador. Considerando características da JVM, analise as afirmações que seguem: I. Os bytecodes gerados pela JVM são totalmente dependentes do hardware e do sistema operacional que executarão as instruções. II. A JVM é uma linguagem intermediária de alto nível que dispõe de instruções para operações complexas, como chamar métodos virtuais e criar objetos. III. Um compilador da linguagem Java é capaz de gerar arquivos constituídos por bytecodes, que são criados com a extensão .class. É verdadeiro o que se afirma em: Você acertou! D. II e III. A afirmativa I é falsa, já que os bytecodes não dependem de plataforma específica para serem executados. A afirmativa II é verdadeira. De fato, a caracterização da JVM é feita corretamente nesta afirmativa. A afirmativa III é verdadeira. Um arquivo de bytecodes contém, de fato, a extensão .class. Síntese de código - Compiladores Exercícios