przecież java lata też na armach (głównie smartfony, ale też np chmury obliczeniowe) i innych architekturach. zresztą to czy lata na jednej czy milionie nie jest jedynym kryterium.
Inne języki też latają ale nie potrzebują abstrakcji na ISA, na smartfonach ta proteza Javy od dawna leci w trybie AOT bo w gugielu jednak rozumieją rzeczy. Kryterium jest: skoro mamy praktycznie jednolity standard przemysłowy jeśli chodzi o architekturą, znakomity framework do tworzenia wydajnych kompilatorów na nowe (np. RISC-V) to po cholerę utrzymywać narzut abstrakcji?
jvm podczas ładowania bajtkodu weryfikuje jego poprawność, np. to czy każdy push ma popa, czy skoki są w dozwolone miejsca itd więcej szczegółów np tutaj: https://www.oracle.com/java/technologies/security-in-java.html w sekcji o weryfikowaniu bajtkodu. po zJITowaniu może wyjść kod np x86, który jest dużo trudniejszy do zweryfikowania niż oryginalny bajtkod (np. tak trudny, że praktycznie weryfikacja jest nieosiągalna), więc lepiej weryfikować na poziomie bajtkodu.
To tłumaczy czemu jest tak wolna jak startuje (ach ten tryb interpretera) ;) To po pierwsze, po drugie - kto używa Oraclowej implementacji? A po trzecie - skoro tak to po co nam Rust?
konteneryzacja i vmki to także świetny sposób, żeby nie śmiecić sobie bezpośrednio w sytemie.
Konteneryzacja tak - w końcu NextStep je wdrożył i inni się przekonali. VMki? Wirtualizowałeś sobie kiedy dostęp do GPU który nie kosztuje tyle co dobry samochód na starcie?
izolacja między vmkami pozwala w miarę bezpiecznie odpalać potencjalny malware, jeśli używamy dobrze zabezpieczonych systemów typu https://www.qubes-os.org/ (zamierzam sobie kupić lapka na qubes os w niedalekiej przyszłości, ale nie wiem kiedy jeszcze).
To jest ciekawe bo większość malware zazwyczaj się nie aktywuje jeśli wykryje że działa w środowisku zwirtualizowanym, po prostu takie środowiska służą zazwyczaj do obserwacji ich działania.