Jakie są zalety kompilacji just-in-time w porównaniu z kompilacją z wyprzedzeniem?

Ostatnio o tym myślałem i wydaje mi się, że najwięcej korzyści dajeJIT kompilacja powinna być w mniejszym lub większym stopniu przypisywana formatowi pośredniemu, a samo jitting nie jest dobrym sposobem generowania kodu.

Więc to są głównepro-JIT argumenty kompilacyjne, które zwykle słyszę:

Kompilacja „na czas” pozwala na większą przenośność. Czy nie można tego przypisać formatowi pośredniemu? To znaczy, nic nie powstrzymuje cię przed kompilowaniem wirtualnego kodu bajtowego do rodzimego kodu bajtowego, gdy już go masz na swoim komputerze. Przenoszenie jest problemem w fazie „dystrybucji”, a nie w fazie „biegu”.OK, a co z generowaniem kodu w czasie wykonywania? To samo dotyczy. Nic nie powstrzyma Cię przed integracją kompilatora just-in-time w celu uzyskania prawdziwej potrzeby na czas w swoim rodzimym programie.Jednak środowisko wykonawcze kompiluje go do kodu natywnego i tak raz, i zapisuje wynikowy plik wykonywalny w jakiejś pamięci podręcznej gdzieś na dysku twardym. Tak, jasne. Ale to zoptymalizowało twój program pod kątem ograniczeń czasowych i od tego momentu nie poprawia go. Zobacz następny akapit.

To nie takprzed czasem kompilacja też nie miała żadnych zalet.Just-in-time kompilacja ma ograniczenia czasowe: nie możesz pozwolić, aby użytkownik końcowy czekał wiecznie podczas uruchamiania programu, więc ma gdzieś kompromis. Przez większość czasu po prostu optymalizują mniej. Mój przyjaciel miałprofilowanie dowodów że wstawianie funkcji i rozwijanie pętli „ręcznie” (zaciemnianie kodu źródłowego w procesie) miało pozytywny wpływ na wydajność na jegoDO# program do obliczania liczby; robię to samo po mojej stronie, z moimC program wypełniający to samo zadanie, nie przyniósł żadnych pozytywnych wyników i wierzę, że wynika to z rozległych transformacji, które mój kompilator mógł wykonać.

A jednak jesteśmy otoczeni przez rozbite programy.DO# iJawa są wszędzie, skrypty Pythona mogą kompilować się do jakiegoś kodu bajtowego i jestem pewien, że cała masa innych języków programowania robi to samo. Musi być dobry powód, dla którego tęsknię. Więc co sprawiajust-in-time kompilacja tak doskonałaprzed czasem kompilacja?

EDYTOWAĆ Aby usunąć pewne zamieszanie, może być ważne, aby stwierdzić, że jestem za pośrednią reprezentacją plików wykonywalnych. Ma to wiele zalet (i naprawdę większość argumentów zajust-in-time kompilacja jest w rzeczywistości argumentem dla pośredniej reprezentacji). Moje pytanie dotyczy tego, jak powinny być kompilowane do kodu natywnego.

Większość środowisk wykonawczych (lub kompilatorów) woli albo skompilować je na czas, albo wcześniej. Tak jakprzed czasem kompilacja wygląda na lepszą alternatywę dla mnie, ponieważ kompilator ma więcej czasu na optymalizacje, zastanawiam się, dlaczego Microsoft, Sun i wszyscy inni idą na odwrót. Mam pewne wątpliwości co do optymalizacji związanych z profilowaniem, jak z moim doświadczeniemjust-in-time skompilowane programy wyświetlały słabe podstawowe optymalizacje.

Użyłem przykładu z kodem C tylko dlatego, że potrzebowałem przykładuprzed czasem kompilacja kontrajust-in-time kompilacja. Fakt, żeC Kod nie został wyemitowany do pośredniej reprezentacji nie ma znaczenia dla sytuacji, ponieważ po prostu musiałem to pokazaćprzed czasem kompilacja może dać lepsze natychmiastowe wyniki.

questionAnswers(9)

yourAnswerToTheQuestion