Dynamiczna kompilacja
Wykonanie programu |
---|
Pojęcia ogólne |
Rodzaje kodu |
Strategie kompilacji |
Godne uwagi czasy działania |
|
Wybitne kompilatory i łańcuchy narzędzi |
|
Kompilacja dynamiczna to proces używany przez niektóre implementacje języków programowania w celu zwiększenia wydajności podczas wykonywania programu. Chociaż technika ta wywodzi się ze Smalltalk , najbardziej znanym językiem wykorzystującym tę technikę jest Java . Ponieważ kod maszynowy emitowany przez kompilator dynamiczny jest konstruowany i optymalizowany w czasie wykonywania programu, użycie kompilacji dynamicznej umożliwia optymalizację wydajności niedostępną dla programów kompilowanych statycznie (tj. kompilowanych przez tak zwany „kompilator wsadowy”, jak napisano poniżej ) z wyjątkiem powielania kodu lub metaprogramowania .
W środowiskach wykonawczych korzystających z kompilacji dynamicznej zazwyczaj programy działają wolno przez pierwsze kilka minut, a potem większość kompilacji i ponownej kompilacji jest wykonywana i działa szybko. Ze względu na to początkowe opóźnienie wydajności dynamiczna kompilacja jest w niektórych przypadkach niepożądana. W większości implementacji kompilacji dynamicznej niektóre optymalizacje, które można było wykonać w początkowym czasie kompilacji , są opóźniane do dalszej kompilacji w czasie wykonywania , co powoduje dalsze niepotrzebne spowolnienia. Kompilacja just-in-time jest formą kompilacji dynamicznej.
Kompilacja przyrostowa
Blisko spokrewnioną techniką jest kompilacja przyrostowa . Kompilator przyrostowy jest używany w POP-2 , POP-11 , Forth , niektórych wersjach Lispa , np. Maclisp i co najmniej jednej wersji ML ( Poplog ML). Wymaga to, aby kompilator języka programowania był częścią systemu wykonawczego. W rezultacie kod źródłowy może być odczytany w dowolnym momencie z terminala, z pliku lub ewentualnie ze struktury danych utworzonej przez działający program i przetłumaczony na blok kodu maszynowego lub funkcję (która może zastąpić poprzednią funkcję o tej samej nazwie), który jest następnie natychmiast dostępny do użycia przez program. Ze względu na potrzebę szybkości kompilacji podczas interaktywnego programowania i testowania, skompilowany kod prawdopodobnie nie będzie tak mocno zoptymalizowany, jak kod generowany przez standardowy „kompilator wsadowy”, który wczytuje kod źródłowy i tworzy pliki obiektowe, które można następnie połączyć i biegnij. Jednak program kompilowany przyrostowo będzie zazwyczaj działał znacznie szybciej niż interpretowana wersja tego samego programu. Kompilacja przyrostowa zapewnia zatem połączenie zalet języków interpretowanych i kompilowanych. Aby wspomóc przenośność, generalnie pożądane jest, aby kompilator przyrostowy działał w dwóch etapach, a mianowicie najpierw kompilował do jakiegoś pośredniego języka niezależnego od platformy, a następnie kompilował z tego do kodu maszynowego dla maszyny hosta. W tym przypadku przeniesienie wymaga jedynie zmiany kompilatora „zaplecza”. W przeciwieństwie do kompilacji dynamicznej, jak zdefiniowano powyżej, kompilacja przyrostowa nie obejmuje dalszych optymalizacji po pierwszym uruchomieniu programu.
Zobacz też
- Transmeta dynamicznie kompilują kod x86 do kodu VLIW .
- Rekompilacja dynamiczna
- Kompilacja w samą porę
Linki zewnętrzne
- Projekt dynamicznej kompilacji UW
- Emulacja architektury poprzez dynamiczną kompilację
- SCIRun
- Artykuł „ Aplikacje dynamicznej kompilacji, refleksji i dostosowywania ” autorstwa Davida B. Scofielda i Erica Bergmana-Terrella
- Artykuł „ Wydajny XML: kompilacja dynamicznych wyrażeń XPath ” autorstwa Daniela Cazzulino
- Matthew R. Arnold, Stephen Fink, David P. Grove, Michael Hind i Peter F. Sweeney, A Survey of Adaptive Optimization in Virtual Machines , Proceedings of the IEEE, 92(2), luty 2005, strony 449-466.