Dynamiczna kompilacja

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ż

Linki zewnętrzne