Почему важно, чтобы Java (и другие языки JVM) были очень портативными? [Дубликат]

В моем случае команда, я нахожусь в точках селена, в конкретный файл хромированной решетки, который у нас был. Чтобы заставить Selenium использовать обновленный хромированный реверс, я сначала установил его с помощью варева, а затем создал символическую ссылку для точки, где Selenium ищет ее:

brew install chromedriver
ln -s /usr/local/Cellar/chromedriver/2.36/bin/chromedriver /path/where/selenium/expects/chromedriver
62
задан N J 28 June 2015 в 03:14
поделиться

9 ответов

Страница инструмента ngen пролила бобы (или, по крайней мере, обеспечила хорошее сравнение собственных изображений и JIT-скомпилированных изображений). Исполняемые файлы, которые скомпилированы досрочно, обычно имеют следующие преимущества:

  1. Нативные изображения загружаются быстрее, потому что они не имеют большого количества операций запуска и требуют статического количества меньше памяти (память требуемый компилятором JIT);
  2. Собственные изображения могут совместно использовать библиотечный код, в то время как JIT-скомпилированные изображения не могут.

Скомпилированные исполняемые файлы «точно в срок» обычно имеют верхний в следующих случаях:

  1. Нативные изображения больше, чем их байт-код,
  2. Родные изображения должны быть регенерированы всякий раз, когда изменяется исходная сборка или одна из ее зависимостей.

Необходимость регенерации изображения, которое выполняется заранее, каждый раз, когда один из его компонентов является огромным недостатком для собственных изображений. С другой стороны, тот факт, что JIT-скомпилированные изображения не могут совместно использовать библиотечный код, может привести к серьезному поражению памяти. Операционная система может загружать любую родную библиотеку в одном физическом местоположении и делиться неизменяемыми ее частями с каждым процессом, который хочет ее использовать, что приводит к значительной экономии памяти, особенно с системными рамками, которые практически каждая программа использует. (Я полагаю, что это несколько компенсируется тем фактом, что JIT-скомпилированные программы только компилируют то, что они на самом деле используют.)

Общее мнение Microsoft по этому вопросу заключается в том, что крупные приложения обычно выигрывают от компиляции вперёд - времени, в то время как малые вообще не делают.

15
ответ дан zneak 27 August 2018 в 09:28
поделиться

Кажется, что эта идея была реализована на языке дартов:

https://hackernoon.com/why-flutter-uses-dart-dd635a054ebf

Компиляция JIT используется во время разработки, используя особенно быстрый компилятор. Затем, когда приложение готово к выпуску, оно скомпилировано AOT. Следовательно, с помощью передовых инструментов и компиляторов Dart может обеспечить лучшее из обоих миров: чрезвычайно быстрые циклы разработки и быстрое выполнение и время запуска.

1
ответ дан Aleksandr Ivannikov 27 August 2018 в 09:28
поделиться

Одно из преимуществ JIT, которое я не вижу здесь, - это возможность встроить / оптимизировать отдельные сборки / dlls / jars (для простоты я просто собираюсь использовать «сборки» здесь).

Если ваше приложение ссылается на сборки, которые могут измениться после установки (например, предварительно установленные библиотеки, библиотеки фреймворков, плагины), тогда модель «компиляция при установке» должна воздерживаться от методов наложения границ сборки. В противном случае, когда обновленная ссылка будет обновлена, нам нужно будет найти все такие встроенные биты кода в ссылках на сборки в системе и заменить их на обновленный код.

В модели JIT мы можем свободно встраивать сборки, потому что мы заботимся только о создании действующего машинного кода для одного прогона, в течение которого базовый код не изменяется.

2
ответ дан ChaseMedallion 27 August 2018 в 09:28
поделиться

Возможно, это связано с современным подходом к программированию. Вы знаете, много лет назад вы могли бы написать свою программу на листе бумаги, некоторые другие люди превратили бы ее в стопку перфокарт и загрузили в компьютер, а завтра утром вы получите аварийную свалку на рулоне бумаги, взвешивающем пол пуда. Все это заставило вас много думать, прежде чем писать первую строку кода.

Те дни давно прошли. При использовании языка сценариев, такого как PHP или JavaScript, вы можете немедленно протестировать любые изменения. Это не относится к Java, хотя приложения-службы предоставляют вам горячее развертывание. Поэтому очень удобно, что Java-программы могут быть скомпилированы быстро, поскольку компиляторы байт-кода довольно просты.

Но не существует таких языков, как JIT-only. В настоящее время компиляторы доступны для Java в течение некоторого времени, а в последнее время Моно представил его в CLR. Фактически, MonoTouch вообще возможен из-за компиляции AOT, поскольку в магазине приложений Apple запрещены неродные приложения.

1
ответ дан Dmitry Leskov 27 August 2018 в 09:28
поделиться
  1. Лучшая поддержка отражения. Это можно сделать в принципе в компилируемой программе с опережением времени, но практически это практически не происходит на практике.
  2. Оптимизации, которые часто можно выяснить только при динамическом наблюдении за программой. Например, встраивание виртуальных функций, анализ эвакуации для перевода стеков в распределения кучи и блокирование укрупнения.
4
ответ дан dsimcha 27 August 2018 в 09:28
поделиться

Я тоже пытался понять это, потому что увидел, что Google движется к замене своей виртуальной машины Dalvik (по существу другой виртуальной машины Java, такой как HotSpot), с Android Run Time (ART), которая является компилятором AOT, но Java обычно использует HotSpot, который является JIT-компилятором. По-видимому, ARM ~ 2x быстрее, чем Dalvik ... поэтому я подумал: «Почему Java не использует AOT?». В любом случае, из того, что я могу собрать, основное различие заключается в том, что JIT использует адаптивную оптимизацию во время выполнения, которая (например) позволяет ТОЛЬКО те части байт-кода, которые выполняются часто, чтобы скомпилироваться в собственный код; тогда как AOT компилирует весь исходный код в собственный код, а код меньшей суммы работает быстрее кода большего количества. Я должен представить, что большинство приложений для Android состоят из небольшого количества кода, поэтому в среднем имеет смысл скомпилировать весь исходный код с помощью собственного кода AOT и избежать накладных расходов, связанных с интерпретацией / оптимизацией.

1
ответ дан Scott Ferrell 27 August 2018 в 09:28
поделиться

Разница между платформой-браузером-динамикой и платформенным браузером - это то, как будет скомпилировано ваше угловое приложение. Использование динамической платформы делает угловую отправку компилятора «Just-in-Time» как в интерфейсе, так и в вашем приложении. Это означает, что ваше приложение компилируется на стороне клиента. С другой стороны, использование платформы-браузера приводит к тому, что предварительно скомпилированная версия вашего приложения будет отправлена ​​в браузер. Обычно это означает, что в браузер отправляется значительно меньший пакет. Угловая2-документация для начальной загрузки в https://angular.io/docs/ts/latest/guide/ngmodule.html#!#bootstrap объясняет это более подробно.

0
ответ дан shubham chaturvedi 27 August 2018 в 09:28
поделиться
  1. Большая переносимость: поставляемый (байт-код) остается переносимым
  2. . В то же время, больше зависит от платформы: поскольку JIT-компиляция выполняется в той же системе, что и код , он может быть очень и очень точно настроен для этой конкретной системы. Если вы делаете компиляцию вперёд (и все еще хотите отправить один и тот же пакет всем), вы должны пойти на компромисс.
  3. Усовершенствования в технологии компилятора могут повлиять на существующие программы. Лучший компилятор C не поможет вам вообще с уже развернутыми программами. Лучший JIT-компилятор улучшит производительность существующих программ. Код Java, который вы написали десять лет назад, будет работать быстрее сегодня.
  4. Адаптация к меткам времени выполнения. JIT-компилятор может не только смотреть на код и целевую систему, но также и на то, как используется код. Он может управлять запущенным кодом и принимать решения о том, как оптимизировать, например, какие значения имеют параметры метода.

Вы правы, что JIT добавляет к началу, и поэтому для него существует ограничение по времени, тогда как компиляция в режиме «впереди» может занять все время, что она хочет. Это делает его более подходящим для серверных приложений, где время запуска не так важно и «фаза разминки» до того, как код становится очень быстрым.

Я полагаю, это было бы возможно для хранения результата компиляции JIT где-то, чтобы его можно было повторно использовать в следующий раз. Это даст вам «опережающую» компиляцию для второго запуска программы. Может быть, умные люди в Sun и Microsoft считают, что свежий JIT уже достаточно хорош, а лишняя сложность не стоит того.

30
ответ дан Thilo 27 August 2018 в 09:28
поделиться

Простая логика говорит нам, что компиляция огромной программы размера MS Office даже из байт-кодов займет слишком много времени. У вас будет огромное время пуска, и это напугает любого из вашего продукта. Конечно, вы можете прекомпилировать во время установки, но это также имеет последствия.

Еще одна причина заключается в том, что не все части приложения будут использоваться. JIT будет компилировать только те части, которые заботятся о пользователях, оставляя потенциально 80% кода нетронутыми, экономя время и память.

И, наконец, компиляция JIT может применять оптимизации, которые обычные компиляторы не могут. Подобно встраиванию виртуальных методов или частей методов с деревьями трассировки . Который, теоретически, может сделать их быстрее.

6
ответ дан vava 27 August 2018 в 09:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: