Baixe o app para aproveitar ainda mais
Prévia do material em texto
Geração de código de máquina - Compiladores Exercícios 1. As linguagens de montagem são específicas para cada microprocessador e intimamente ligadas à arquitetura do sistema. Com relação à maneira como o compilador deve realizar a tradução para a linguagem de montagem, é correto afirmar que: Resposta correta. B. Ao realizar a tradução da linguagem intermediária para a linguagem de montagem, o resultado final deve permanecer o mesmo, apesar de a sequência de operações geradas poder ser alterada. As linguagens de montagem são específicas de cada microprocessador, uma vez que estão ligadas à estrutura interna de cada dispositivo, com as suas limitações específicas, como de tipos de dados. A tradução da linguagem intermediária para a linguagem de montagem, é realizada por meio de um algoritmo guloso, que realiza escolhas locais ótimas a fim de aproximar a escolha global ótima. Existem casos, porém, em que é preciso alterar a sequência das instruções de montagem, mantendo o resultado final do algoritmo inalterado. 2. Para a criação de um código de montagem otimizado, para determinado processador, existem processos que podem ser observados. Quais são esses processos? Resposta correta. A. Escalonamento do código, em que partes do código de montagem são espaçadas de forma a possibilitar o paralelismo do código. Uma forma de otimizar o código de montagem se dá por meio do escalonamento do código a fim de permitir a paralelização do código no dispositivo. Outras maneiras de otimização consistem em propagar constantes (não endereços de memória) e maximizar a quantidade de funcionalidades cobertas pelas instruções (não minimizar). O desenrolamento de estruturas de repetição é uma técnica de otimização que pode ser utilizada no código fonte ou no código intermediário, no lugar do código de montagem, e as escolhas de substituição devem se basear no custo das substituições. 3. As variáveis de um programa são utilizadas para o armazenamento de dados que devem ser processados. Apesar de o desenvolvedor poder utilizar quantas variáveis quiser no código fonte, o número de registradores em um microprocessador é limitado. Com relação à alocação de registradores, é correto afirmar que: Você acertou! C. para verificar quais variáveis podem ser utilizadas, é preciso determinar quando uma variável está viva em determinado ponto do código. Os registradores de um microprocessador são elementos monolíticos, que não podem ser subdivididos à vontade. Para determinar quais variáveis podem ser armazenadas em quais registradores, é preciso verificar quais variáveis estão vivas em um dado momento do código, independentemente da sua posição no código. Para a utilização de uma variável, os conjuntos gen[i] e succ[i] precisam trabalhar em conjunto para que conseguir verificar quais variáveis podem ser utilizadas em qual ponto do código. 4. A propriedade de liveness é uma propriedade das variáveis de um programa utilizada para determinar qual variável pode ser alocada para determinado registrador. Com relação à propriedade de liveness, é correto afirmar que: Resposta correta. B. quando uma variável está viva, ela pode interferir em outras variáveis, o que significa que ambas não podem se alternar no mesmo resgitrador. A lista de variáveis vivas deve conter as variáveis que estão em uso em determinado ponto do programa, uma vez que, quando uma variável está viva, ela pode interferir em outras variáveis e estas não podem compartilhar o mesmo registrador. Para verificar quais variáveis não podem compartilhar o mesmo registrador, utiliza- se um grafo denominado grafo de interferência. A resolução desse grafo, porém, é do tipo NP completo e, portanto, não tem solução ótima conhecida. Assim, para resolver esse problema, emprega-se o algoritmo de coloração de nodos, com o número de cores limitado ao número de registradores. 5. Para a criação de código-objeto a partir do código intermediário, é preciso realizar a divisão do código em blocos básicos, com suas instruções líderes e como a execução flui entre os blocos. Sobre as instruções líderes, assinale a alternativa correta. Você acertou! E. Referem-se à primeira instrução de três endereços do código intermediário, à qualquer instrução que é alvo de um salto e a instrução que segue um salto. As regras de detecção das instruções líderes são três e bem definidas. Toda instrução é dita líder se for: a primeira instrução do código intermediário; o alvo de um salto; ou a instrução que segue um salto. As instruções líderes devem sempre iniciar o bloco básico e seguem os mesmos critérios independentemente do algoritmo analisado. Geração de código de máquina - Compiladores Exercícios
Compartilhar