Каковы преимущества байт-кода над собственным кодом?

Кажется, что все, что вы можете сделать с байт-кодом, вы можете сделать так же легко и намного быстрее в собственном коде. Теоретически, вы даже можете сохранить независимость от платформы и языка, распределив программы и библиотеки в байт-коде, а затем скомпилируйте собственный код при установке, а не JITing.

Итак, в общем, когда вы хотите выполнить байт-код вместо native?

Хэнк Шиффман из SGI сказал (давным-давно, но это правда):

Существует три преимущества Java, использующих байтовый код вместо перехода на собственный код системы:

  1. Переносимость : каждый компьютер имеет свой уникальный набор команд. Хотя некоторые процессоры include в себя инструкции для своих предшественников, в целом верно, что программа, работающая на одном компьютере, не будет работать ни на одном другом. Добавьте в службы, предоставляемые операционной системой, которые каждая система описывает своим уникальным способом, и у вас есть проблема совместимости. В общем, вы не можете писать и компилировать программу для одного вида системы и запускать ее на любом другом без большой работы. Java обходит это ограничение, вставив свою виртуальную машину между приложением и реальной средой (компьютер + операционная система). Если приложение скомпилировано в байт-код Java и этот байт-код интерпретируется одинаково в каждой среде, вы можете написать одну программу, которая будет работать на всех платформах, на которых поддерживается Java. Во всяком случае, это теория. На практике всегда есть небольшая несовместимость, лежащая в ожидании программиста.)

  2. Безопасность . Одной из достоинств Java является ее интеграция в Интернет. Загрузите веб-страницу, которая использует Java в вашем браузере, и код Java автоматически загружается и выполняется. Но что, если код уничтожает файлы, будь то зло или небрежность на стороне программиста? Java запрещает загруженным апплетам делать что-либо разрушительное, запрещая потенциально опасные операции. Прежде чем он разрешит запуск кода, он проверяет его на попытки обхода безопасности. Он проверяет, что данные используются последовательно: код, который манипулирует элементом данных как целое на одном этапе, а затем пытается использовать его в качестве указателя позже, будет пойман и предотвращен от выполнения. (Язык Java не позволяет арифметику указателей, поэтому вы не можете писать код Java, чтобы делать то, что мы только что описали. Однако нет ничего, что помешало бы кому-либо писать деструктивный байт-код с помощью шестнадцатеричного редактора или даже создания байт Java ассемблер кода.) Как правило, невозможно проанализировать машинный код программы перед выполнением и определить, делает ли он что-то плохое. Трюки, подобные написанию самомодифицирующего кода, означают, что злые операции могут даже существовать дольше. Но байт-код Java был разработан для такого рода проверки: у него нет инструкций, которые вредоносный программист использовал бы, чтобы скрыть свое нападение.

  3. Размер : В микропроцессорном мире RISC обычно предпочтительнее по CISC. Лучше иметь небольшой набор команд и использовать множество быстрых инструкций для выполнения задания, чем для выполнения множества сложных операций в виде отдельных инструкций. Конструкции RISC требуют меньше вентилей на чипе для реализации их инструкций, что позволяет увеличить пространство для трубопроводов и других методов, чтобы быстрее выполнять каждую инструкцию. Однако в переводчике все это не имеет значения. Если вы хотите реализовать одну инструкцию для оператора switch с переменной длиной в зависимости от количества аргументов case, нет причин не делать этого. Фактически, сложный набор команд является преимуществом для веб-языка: это означает, что одна и та же программа будет меньше (меньше инструкций с большей сложностью), что означает меньшее время для передачи по нашей сети с ограниченной скоростью.

Поэтому, рассматривая байтовый код vs native, рассмотрите, какие компромиссы вы хотите сделать между переносимостью, безопасностью, размером и скоростью выполнения. Если скорость является единственным важным фактором, идите на родной язык. Если кто-то из них более важен, пойдите с байт-кодом.

Я также добавлю, что поддержка серии OS и архитектур-ориентированных компиляций одной и той же базы кода для каждой версии может стать очень утомительной. Это огромная победа в использовании одного и того же байт-кода Java на нескольких платформах, и он «просто работает».

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

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

Это преимущество работы байт-кода на некоторое время перед его компиляцией на собственный код: информация профилирования автоматически доступна. Результатом после компиляции Just-In-Time является высоко оптимизированный собственный код для конкретных данных, которые обрабатывает программа.

Возможность запуска байт-кода также обеспечивает более агрессивную собственную оптимизацию, чем статический компилятор может безопасно использовать. Например, если один из аргументов функции отмечен всегда равным NULL, вся обработка для этого аргумента может быть просто исключена из собственного кода. Будет проведена кратковременная проверка достоверности аргументов в prologе функции, если этот аргумент не равен NULL, ВМ вернется к байт-коду и снова начнет профилирование.

Байткод создает дополнительный уровень косвенности.

Преимущества этого дополнительного уровня косвенности:

  • Независимость платформы
  • Может создавать любое количество языков программирования (синтаксис) и сводить их к одному и тому же байт-коду.
  • Может легко создавать кросс-языковые преобразователи
  • x86, x64 и IA64 больше не нужно компилировать в виде отдельных двоичных файлов. Должна быть установлена ​​только соответствующая виртуальная машина.
  • Каждой ОС просто нужно создать виртуальную машину, и она будет поддерживать ту же программу.
  • Как раз вовремя компиляция позволяет вам обновить программу, просто заменив один исправленный исходный файл. (Очень полезно для веб-страниц)

Некоторые из недостатков:

  • Представление
  • Легче декомпилировать

Все хорошие ответы, но моя горячая кнопка была поражена – производительность.

Если выполняемый код тратит все время на вызов библиотечных / системных подпрограмм – операции с файлами, операции с базой данных, отправка сообщений Windows, то это не имеет большого значения, если это JITted, потому что большая часть часов времени проводится в ожидании тех, чтобы завершить операции уровня.

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

Я думаю, вы просто ответили на свой вопрос: независимость платформы. Независимый от платформы байт-код создается и распространяется на целевую платформу. При выполнении он быстро компилируется в собственный код либо до начала запуска, либо одновременно ( Just In Time ). Java JVM и, предположительно, время выполнения .NET работают по этому принципу.

Здесь: http://slashdot.org/developers/02/01/31/013247.shtml

Пойди, посмотри, что скажут об этом вундеркинды Слэшдота! Маленькие датированные, но очень хорошие комментарии!

В идеале у вас будет переносимый байт-код, который компилирует Just In Time в собственный код. Я думаю, что причина, по которой интерпретаторы байт-кода существуют без JIT, объясняется прежде всего практическим фактом, что компиляция собственного кода добавляет сложности виртуальной машине. Для создания, отладки и поддержки этого дополнительного компонента требуется время. Не все имеют время или ресурсы, чтобы сделать это обязательство.

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

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

Переносимость и независимость платформы, вероятно, являются наиболее заметными преимуществами байт-кода над собственным кодом.

  • Джерси: Распечатать фактический запрос
  • Должен ли я использовать это ключевое слово, когда я хочу ссылаться на переменные экземпляра внутри метода?
  • Что действительно возвращает System.in.read?
  • Использование файлов .html как JSP
  • Каковы различия между символами символов \ n и \ r в Java?
  • Как добавить строку в JTable?
  • Для чего используется плагин maven-shade, и почему вы хотите переместить пакеты Java?
  • Почему Runtime.exec (String) работает для некоторых, но не для всех команд?
  • IllegalArgumentException или NullPointerException для нулевого параметра?
  • В каких ситуациях подходит CopyOnWriteArrayList?
  • jackson против. Гсон
  • Давайте будем гением компьютера.