quarta-feira, 13 de agosto de 2008

Compilador Just-in-time


Em Ciência da Computação, JIT é o acrônimo para compilador just-in-time, que é um tradutor que converte, em tempo de execução, instruções de um formato para outro, por exemplo, de bytecode para código de máquina. Esta técnica é normalmente utilizada para incrementar o desempenho de programas "executados" - na verdade, interpretados - em máquinas virtuais.


Visão geral

Em sistemas computacionais baseados em máquina virtualmáquinas virtuais, como Java e .NET, o processo de compilação traduz o código fonte para uma representação intermediária conhecida pelo termo bytecode. Esta representação intermediária não está associada a nenhum código de máquina específico e pode ser transportada para várias arquiteturas de computador distintas. Em cada arquitetura específica, essa representação intermediária é interpretada - ou executada em uma máquina virtual.
Nos ambientes que oferecem o recurso de JIT, a máquina virtual responsável pela execução dos bytecodes resultantes da compilação do programa fonte realiza a tradução desse bytecode para código de máquina nativo enquanto o executa. No caso mais comum, cada trecho de código é traduzido no instante em que está para ser executado pela primeira vez, daí derivando o nome "just-in-time".
A idéia de um sistema que suporta o conceito de JIT é combinar as vantagens da compilação tradicional - que converte o código fonte diretamente para código de máquina - e do conceito de máquinas virtuais, baseadas em bytecode. A custosa tarefa de analisar e verificar o código fonte do programa original é realizada pelo processo de compilação para bytecode, em tempo de desenvolvimento. Também nesta fase, são realizadas todas as possíveis otimizações baseadas na análise do código fonte, obtendo-se um conjunto de bytecodes optimizados e semanticamente equivalente ao programa fonte original. O programa objeto resultante deste processo de compilação é transportável para as várias arquiteturas distintas que suportam a máquina virtual alvo da compilação, isto é, que possuem um interpretador de bytecode. Durante a execução do programa, o compilador JIT realiza apenas a tradução de bytecode para código de máquina, que é uma tarefa muito mais simples e mais rápida.
Esse mecanismo de execução apresenta um desempenho significativamente superior ao processo clássico de interpretação. Isto porque o código de máquina resultante da compilação JIT é armazenado na memória, garantindo que o trecho de código em questão não será mais recompilado ou reinterpretado sempre que, durante a execução do programa, for novamente acionado. Além disso, muitos compiladores JIT possuem mecanismos para realizar optimizações adicionais nos trechos de código do programa que são executados com maior frequência.
Entretanto, o mecanismo de execução baseado em compiladores JIT pode causar um pequeno atraso no início da execução de uma aplicação, em função de ter que compilar o bytecode para código de máquina. Naturalmente, quanto mais otimizações o compilador JIT realizar, mais rápida tenderá a ser a execução do programa alvo, porém maior será o atraso no início da execução. Por conta disso, os compiladores JIT mais bem elaborados normalmente realizam um balanceamento criterioso entre o tempo a ser gasto com a compilação e a qualidade de código que ele pretende gerar.
Dois exemplos de plataformas que se utilizam de compiladores JIT são os ambientes .NET e Java. No caso do ambiente Java, o compilador de Java traduz o programa fonte para uma representação intermediária (programa objeto) conhecida pelo termo bytecode. Posteriormente, o programa objeto será interpretado pela máquina virtual Java. No caso do ambiente .NET, a representação intermediária é conhecida pelo termo Microsoft Intermediate Language (MSIL), que será interpretada pela máquina virtual do ambiente .NET, chamada Common Language Runtime.



saiba mais...

Nenhum comentário: