Dynamische compilatie - Dynamic compilation
| Programma-uitvoering |
|---|
| Algemene concepten |
| Soorten codes |
| Compilatiestrategieën |
| opmerkelijke looptijden |
|
| Opmerkelijke compilers en toolchains |
|
Dynamische compilatie is een proces dat door sommige programmeertaalimplementaties wordt gebruikt om prestaties te verbeteren tijdens de uitvoering van het programma. Hoewel de techniek zijn oorsprong vindt in Self , is Java de bekendste taal die deze techniek gebruikt . Aangezien de machinecode die door een dynamische compiler wordt uitgezonden, wordt geconstrueerd en geoptimaliseerd tijdens de runtime van het programma, maakt het gebruik van dynamische compilatie optimalisaties mogelijk voor efficiëntie die niet beschikbaar zijn voor statisch gecompileerde programma's (dwz programma's die zijn gecompileerd door een zogenaamde "batch-compiler", zoals hieronder beschreven ) behalve door codeduplicatie of metaprogrammering .
Runtime-omgevingen die dynamische compilatie gebruiken, laten programma's de eerste paar minuten meestal langzaam draaien, en daarna is het grootste deel van de compilatie en hercompilatie voltooid en wordt het snel uitgevoerd. Vanwege deze initiële prestatievertraging is dynamische compilatie in bepaalde gevallen ongewenst. Bij de meeste implementaties van dynamische compilatie worden sommige optimalisaties die tijdens de eerste compilatietijd kunnen worden gedaan, uitgesteld tot verdere compilatie tijdens runtime , wat verdere onnodige vertragingen veroorzaakt. Just-in-time compilatie is een vorm van dynamische compilatie.
Incrementele compilatie
Een nauw verwante techniek is incrementele compilatie . Een incrementele compiler wordt gebruikt in POP-2 , POP-11 , Forth , sommige versies van Lisp , bijv. Maclisp en tenminste één versie van ML ( Poplog ML). Dit vereist dat de compiler voor de programmeertaal deel uitmaakt van het runtime-systeem. Bijgevolg kan de broncode op elk moment worden ingelezen, vanaf de terminal, vanuit een bestand, of mogelijk vanuit een gegevensstructuur die door het lopende programma is geconstrueerd, en kan worden vertaald in een machinecodeblok of -functie (die een eerdere functie kan vervangen). met dezelfde naam), die dan onmiddellijk beschikbaar is voor gebruik door het programma. Vanwege de behoefte aan compilatiesnelheid tijdens interactief ontwikkelen en testen, wordt de gecompileerde code waarschijnlijk niet zo sterk geoptimaliseerd als code die wordt geproduceerd door een standaard 'batchcompiler', die de broncode inleest en objectbestanden produceert die vervolgens kunnen worden gekoppeld. en loop. Een incrementeel gecompileerd programma zal echter doorgaans veel sneller werken dan een geïnterpreteerde versie van hetzelfde programma. Incrementele compilatie biedt dus een mix van de voordelen van geïnterpreteerde en gecompileerde talen. Om de portabiliteit te vergemakkelijken, is het over het algemeen wenselijk dat de incrementele compiler in twee fasen werkt, namelijk eerst compileren naar een of andere platformonafhankelijke taal, en dan daaruit compileren naar machinecode voor de hostmachine. In dit geval hoeft voor portering alleen de 'back-end'-compiler te worden gewijzigd. In tegenstelling tot dynamische compilatie, zoals hierboven gedefinieerd, omvat incrementele compilatie geen verdere optimalisaties nadat het programma voor het eerst is uitgevoerd.
Zie ook
- Transmeta- processors compileren dynamisch x86- code in VLIW- code.
- Dynamische hercompilatie
- Just-in-time compilatie
Externe links
- Het UW Dynamic Compilation Project
- Architectuuremulatie door dynamische compilatie
- SCIRun
- Artikel " Dynamische compilatie, reflectie en aanpasbare apps " door David B. Scofield en Eric Bergman-Terrell
- Artikel " High-performance XML: Dynamic XPath expressions compilatie " door Daniel Cazzulino
- Matthew R. Arnold , Stephen Fink , David P. Grove , Michael Hind en Peter F. Sweeney , A Survey of Adaptive Optimization in Virtual Machines , Proceedings of the IEEE, 92 (2), februari 2005, pagina's 449-466.