Compilação dinâmica - Dynamic compilation
| Execução do programa |
|---|
| Conceitos gerais |
| Tipos de código |
| Estratégias de compilação |
| Tempos de execução notáveis |
|
| Compiladores e conjuntos de ferramentas notáveis |
|
A compilação dinâmica é um processo usado por algumas implementações de linguagem de programação para obter desempenho durante a execução do programa. Embora a técnica tenha se originado no Self , a linguagem mais conhecida que usa essa técnica é Java . Uma vez que o código de máquina emitido por um compilador dinâmico é construído e otimizado no tempo de execução do programa, o uso da compilação dinâmica permite otimizações para eficiência não disponíveis para programas compilados estaticamente (ou seja, aqueles compilados por um chamado "compilador em lote", conforme escrito abaixo ), exceto por meio de duplicação de código ou metaprogramação .
Os ambientes de tempo de execução que usam compilação dinâmica normalmente têm programas executados lentamente nos primeiros minutos e, depois disso, a maior parte da compilação e recompilação é feita e executada rapidamente. Devido a esse atraso de desempenho inicial, a compilação dinâmica é indesejável em certos casos. Na maioria das implementações de compilação dinâmica, algumas otimizações que poderiam ser feitas no tempo de compilação inicial são atrasadas até uma nova compilação em tempo de execução , causando mais lentidão desnecessária. A compilação just-in-time é uma forma de compilação dinâmica.
Compilação incremental
Uma técnica intimamente relacionada é a compilação incremental . Um compilador incremental é usado em POP-2 , POP-11 , Forth , algumas versões do Lisp , por exemplo, Maclisp e pelo menos uma versão do ML ( Poplog ML). Isso requer que o compilador da linguagem de programação faça parte do sistema de tempo de execução. Em consequência, o código-fonte pode ser lido a qualquer momento, a partir do terminal, de um arquivo ou possivelmente de uma estrutura de dados construída pelo programa em execução e traduzido em um bloco de código de máquina ou função (que pode substituir uma função anterior com o mesmo nome), que fica então imediatamente disponível para uso pelo programa. Devido à necessidade de velocidade de compilação durante o desenvolvimento e teste interativo, o código compilado provavelmente não será tão otimizado quanto o código produzido por um 'compilador de lote' padrão, que lê o código-fonte e produz arquivos-objeto que podem ser posteriormente vinculados e corra. No entanto, um programa compilado de forma incremental normalmente será executado muito mais rápido do que uma versão interpretada do mesmo programa. A compilação incremental, portanto, fornece uma mistura dos benefícios das linguagens interpretadas e compiladas. Para auxiliar a portabilidade, é geralmente desejável que o compilador incremental opere em dois estágios, ou seja, primeiro compilando para alguma linguagem independente de plataforma intermediária e, em seguida, compilando dessa para o código de máquina para a máquina host. Neste caso, a portabilidade requer apenas a mudança do compilador 'back end'. Ao contrário da compilação dinâmica, conforme definido acima, a compilação incremental não envolve otimizações adicionais depois que o programa é executado pela primeira vez.
Veja também
- Os processadores Transmeta compilam dinamicamente o código x86 em código VLIW .
- Recompilação dinâmica
- Compilação just-in-time
links externos
- O Projeto de Compilação Dinâmica UW
- Emulação de arquitetura por meio de compilação dinâmica
- SCIRun
- Artigo " Dynamic Compilation, Reflection, & Customizable Apps ", de David B. Scofield e Eric Bergman-Terrell
- Artigo " XML de alto desempenho: compilação de expressões XPath dinâmicas " por Daniel Cazzulino
- Matthew R. Arnold , Stephen Fink , David P. Grove , Michael Hind e Peter F. Sweeney , A Survey of Adaptive Optimization in Virtual Machines , Proceedings of the IEEE, 92 (2), fevereiro de 2005, páginas 449-466.