Baixe o app para aproveitar ainda mais
Prévia do material em texto
Otimização de código - Compiladores Exercícios 1. A otimização do código deve ser capaz de manter o mesmo resultado, ainda que partes do código sejam eliminadas, substituídas ou modificadas. Ainda assim, durante a otimização deverá ser mantido(a): Você acertou! B. O significado semântico. O significado semântico não deverá ser alterado, já que o código deverá cumprir o mesmo resultado. A sequência das instruções pode ser alterada a fim de aproveitar melhor os registradores e outros motivos. As instruções utilizadas nem sempre são as mais adequadas. Muitas vezes um processador pode disponibilizar instruções específicas para um tipo de problema que será solucionado de maneira mais eficaz. Os registadores alocados não farão diferença se o significado semântico e os resultados obtidos forem os mesmos e podem ser alterados para reduzir a necessidade de carregamentos e armazenamentos em memória. As expressões podem ser alteradas por diversos motivos: simplificação do cálculo, aproveitamento de expressões comuns, uso de recursos específicos em determinados processadores. 2. A otimização pode ser empregada em diferentes etapas da compilação, podendo ser técnicas dependentes ou independentes de máquina. Qual das técnicas abaixo é classificada como dependente de máquina? Você acertou! A. Otimização de pequena escala. A otimização de pequena escala busca por pequenos trechos de código de máquina que podem ser simplificados, sem se preocupar com o contexto maior. Essa técnica requer o conhecimento dos recursos disponibilizados pela máquina. A eliminação de código morto é realizada diretamente sobre o código intermediário e independe de máquina. A movimentação de código analisa o código dentro de laços e blocos que são frequentemente utilizados e independe de máquina. A avaliação em tempo de compilação busca elementos ou expressões constantes que podem ter seu valor substituído durante a compilação, já que não serão alterados durante a execução, e independe de máquina. A análise léxica é parte do processo de compilação, mas não consiste em uma técnica de otimização. 3. Algumas técnicas de otimização de código podem simplificar trechos tão pequenos de código como uma única expressão. Qual a técnica de otimização de código utilizada no exemplo a seguir? Código original: x = a / 4; Código otimizado: x = a >> 2; Você acertou! D. Redução de força. A expressão foi alterada substituindo o operador utilizado por um que facilitasse o cálculo. Já que 4 é um múltiplo binário, pode-se efetuar uma divisão por esse valor movimentando todos os bits da variável a duas casas para a direita. Assim, a técnica utilizada foi de redução de força. 4. Na propagação de variável, elementos comuns entre expressões podem ser utilizados para eliminar trechos de código desnecessários ou reduzir expressões. Utilizando a técnica de propagação de variável, assinale a alternativa que apresenta a solução correta de otimização para o código a seguir: a = b + c; x = a; d = x + e; Você acertou! C. a = b + c; d = a + e; A variável x recebe o valor de a após a expressão a = b + c. No momento em que a expressão d = x + e é executada, o valor de x e a são os mesmos, podendo substituir x nessa expressão pelo próprio valor de a. Por fim, x = a pode ser eliminado por não ter mais serventia para o código. Assim, d = b + c + e; não pode ser utilizado porque o valor de a consiste em um valor diferente das demais variáveis e que pode ser utilizado em outra parte do código, o que não acontecia com x que terá sempre o mesmo valor de a. 5. As técnicas de otimização dependentes de máquina lidam diretamente com o código final, em que o código fonte já foi traduzido para um conjunto de instruções compreensíveis por ela. Dado o código a seguir, assinale a alternativa que apresenta uma simplificação válida utilizando a técnica de alocação e atribuição de registradores, considerando as variáveis x e y como necessárias no restante do código. Considere as seguintes instruções: LD: carrega um valor em um registrador ST: armazena um valor em uma variável DEC: decrementa um registrador ADD x, y, z: efetua uma soma: x = y + z SUB x, y, z: efetua uma subtração: x = y - z LD R0, 5 ADD R0, R0, b ST x, R0 LD R0, x SUB R0, R0, c ST y, R0 LD R0, y DEC R0 ST y, R0 2 4 5 3 - * + Resposta correta. A. LD R0, 5 ADD R0, R0, b ST x, R0 SUB R0, R0, c DEC R0 ST y, R0 Não há necessidade de utilizar um segundo registrador (R1). Se decrementar R0 sem armazenar antes o resultado de R0-c no próprio R0, o resultado será diferente do original. Ao aproveitar sempre o registrador R0, os armazenamentos e carregamentos de R0 novamente são desnecessários enquanto a conta prossegue. Ainda assim, o armazenamento (ST) de x e y, como descrito no código, é necessário, já que serão valores buscados no resto do programa. Logo, pode-se evitar o uso de R1e das instruções de carregamento (LD), mas não das instruções de armazenamento (ST). Assim, a alternativa correta é: LD R0, 5 ADD R0, R0, b ST x, R0 SUB R0, R0, c DEC R0 ST y, R0 Otimização de código - Compiladores Exercícios
Compartilhar