Усі програми мають середовище виконання. Ми схильні це забувати, але його є. Стандартна кришка для C, яка завершує системні дзвінки в операційну систему. У Objective-C є час виконання, який завершує всю передачу повідомлення.
У Java час виконання - це JVM. Більшість реалізацій Java, з якими знайомі люди, схожі на JVM HotSpot, що є інтерпретатором байтового коду та компілятором JIT.
Це не повинно бути єдиною реалізацією. Абсолютно нічого не говорить про те, що ви не можете створити стандартний час виконання Java для Java та скомпілювати код у кодовому машинному коді та запустити його під час виконання, який обробляє виклики нових об’єктів у mallocs та отримує доступ до системних викликів на машині. І ось що робить компілятор Ahead Of Time (AOT, а не JIT). Назвіть цей час виконання тим, що ви хочете ... ви можете назвати це реалізацією JVM (і це робить слід специфікаціям JVM) або середовищі виконання або стандартну Бібліотеці для Java. Його є, і це робить по суті те ж саме.
Це можна зробити або шляхом повторного впорядкування, javac
щоб орієнтуватися на рідну машину (це те, що робив GCJ ). Або це можна зробити з перекладом байтового коду, згенерованого javac
в машинний (або байтний) код для іншої машини - ось що робить Android. На основі Вікіпедії це робить і Excelsior JET ("Компілятор перетворює переносний байт-код Java в оптимізовані виконувані файли для потрібної апаратної та операційної системи (ОС)"), і те саме стосується RoboVM .
Є додаткові ускладнення з Java, що означає, що це дуже важко зробити як ексклюзивний підхід. Динамічне завантаження класів ( class.forName()
) або проксі-об'єктів вимагає динаміки, яку компілятори AOT не забезпечують легко, тому їх відповідні JVM також повинні включати або компілятор JIT (Excelsior JET), або інтерпретатор (GCJ) для обробки класів, які не можна було попередньо скопіювати рідний.
Пам'ятайте, що JVM є специфікацією , з багатьма реалізаціями . Стандартна бібліотека С - це також специфікація з багатьма різними реалізаціями.
З Java8 було зроблено досить багато роботи над компіляцією AOT. У кращому випадку можна лише узагальнити AOT загалом у межах текстового поля. Однак на Мовному саміті JVM за 2015 рік (серпень 2015 року) відбулася презентація: Java Goes AOT (відео YouTube). Це відео триває 40 хвилин і містить багато глибших технічних аспектів та показників продуктивності.