Po pierwsze, wyjaśnienie, że Java nie jest w pełni skompilowana statycznie i połączona w sposób C ++. Jest on kompilowany do kodu bajtowego, który jest następnie interpretowany przez JVM. JVM może iść na kompilację „just in time” do natywnego języka maszynowego, ale nie musi tego robić.
Co więcej: myślę, że interaktywność jest główną praktyczną różnicą. Ponieważ wszystko jest interpretowane, możesz pobrać mały fragment kodu, przeanalizować go i uruchomić w stosunku do bieżącego stanu środowiska. Tak więc, jeśli już wykonałeś kod inicjujący zmienną, miałbyś dostęp do tej zmiennej itp. Naprawdę nadaje się do takich rzeczy jak styl funkcjonalny.
Jednak interpretacja kosztuje dużo, zwłaszcza gdy masz duży system z wieloma referencjami i kontekstem. Z definicji jest to marnotrawstwo, ponieważ identyczny kod może wymagać dwukrotnej interpretacji i optymalizacji (chociaż większość środowisk wykonawczych ma w tym celu pewne buforowanie i optymalizację). Mimo to płacisz za środowisko wykonawcze i często potrzebujesz środowiska wykonawczego. Mniej prawdopodobne jest również, że zobaczysz złożone optymalizacje międzyproceduralne, ponieważ obecnie ich wydajność nie jest wystarczająco interaktywna.
Dlatego w przypadku dużych systemów, które nie ulegną znacznym zmianom, a dla niektórych języków bardziej sensowne jest prekompilowanie i prelinkowanie wszystkiego, wykonaj wszystkie optymalizacje, które możesz zrobić. Kończy się to bardzo oszczędnym środowiskiem uruchomieniowym, które jest już zoptymalizowane dla docelowej maszyny.
Jeśli chodzi o generowanie plików wykonywalnych, ma to niewiele wspólnego z IMHO. Często można utworzyć plik wykonywalny z kompilowanego języka. Ale możesz również utworzyć plik wykonywalny z języka interpretowanego, z wyjątkiem tego, że interpreter i środowisko wykonawcze są już spakowane w wymaganym i ukryte przed tobą. Oznacza to, że generalnie nadal ponosisz koszty środowiska wykonawczego (chociaż jestem pewien, że w przypadku niektórych języków istnieją sposoby na przetłumaczenie wszystkiego na plik wykonywalny drzewa).
Nie zgadzam się, że wszystkie języki można uczynić interaktywnymi. Niektóre języki, takie jak C, są tak powiązane z maszyną i całą strukturą linków, że nie jestem pewien, czy możesz stworzyć sensowną, w pełni funkcjonalną wersję interaktywną