Подтвердить что ты не робот

Какова цель байт-кода в Java?

Учитывая, что я могу скомпилировать 300 классов за считанные секунды, для реализации Java можно просто предоставить исходные файлы Java вместо байт-кода в качестве входных данных, затем скомпилировать и кэшировать исходный код ввода и никогда не компилировать его снова (например, python делает это, и множество языковых реализаций делают то же самое, за исключением того, что вы даже не пытаетесь кэшировать):

  • Этот первоначальный опыт компиляции будет эквивалентен процессу установки, который пользователи уже используют для
  • Это устранило бы необходимость реализации нетривиальной задачи проверки в интерпретаторе байт-кода (который действительно просто переопределяет части компиляции временные проверки), что снижает сложность реализации.
  • Java, как она есть сейчас, проверяет входной байт-код каждый раз, когда он запускается, даже если он уже проверял его раньше. Точка 2, конечно, уменьшит время запуска, поскольку устраняет этот шаг (хотя текущая платформа Java также может кэшировать "проверенный" статус где-то, чтобы уменьшить время запуска, я не уверен, что он это делает)
  • Это позволит реализовать компиляцию, но они хотят (или вообще не нужны), например, для производительности. Android даже не использует байт-код Java, он использует байт-код dalvik, потому что он утверждает, что он более подходит для их нужд (например, более эффективен на своем оборудовании). Если байт-код не существует, это дизайнерское решение, сделанное Google, было бы полностью прозрачным.
  • Это будет способствовать открытому исходному коду

Это объясняет, почему распространять байт-код вместо собственного кода, но, чтобы быть ясным, мне интересно, почему вообще есть скомпилированный формат для распространения? Предполагая, что компиляция важна, почему бы просто не использовать среду компиляции и кэшировать ее?

Единственное оставшееся обоснование, которое я могу придумать, - это обфускация, но...

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

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

Почему платформа Java предназначена для распространения байт-кода для пользователя, а не для распространения исходного кода для пользователя? Я не мог найти объяснения этого в любом месте в Интернете. Есть ли большая причина, по которой я здесь отсутствую?


Если вы даете причину, вы, вероятно, должны указать, была ли это причина, по которой первоначально были созданы разработчики языка, или причина, которая по-прежнему действует сегодня.

4b9b3361

Ответ 1

Ты думаешь только в своем маленьком мире. Есть несколько веских причин для компиляции источника и доставки байт-кода вместо этого:

  • Время загрузки (апплеты должны были стать общепринятой веб-технологией) - пользователю не нужен источник, поэтому зачем хранить источник? Сокращение объема передаваемой информации означает более быструю загрузку.
  • Сокращает время запуска. Компиляция на каждом прогоне занимает дополнительное время. Если вы можете скомпилировать 300 классов в секунду, это будет означать дополнительное время запуска 5-10 секунд на JRE в настоящее время. Вы знаете, что машины были немного медленнее в 1995 году.
  • Java нацелен на множество платформ. Некоторые платформы не так сильны, как ваш компьютер. Подумайте о встроенных и мобильных устройствах. У них не может быть ни хранилища, ни возможности компиляции кода.
  • Bytecode позволяет скомпилировать любой язык в байт-код, а не только Java. Есть много других языков, которые могут скомпилировать байт-код. Вы предпочли бы установить новый компилятор для каждого из них?
  • Компании часто неохотно дают "источник" из своих рук. Java будет иметь больше проблем с приемом, если программы будут поставляться "в источнике".
  • Bytecode - это форма машинного кода, достаточно простая для непосредственного выполнения в аппаратном обеспечении (существует несколько встроенных проектов, которые имеют частичную поддержку встроенного байт-кода).

Я уверен, что есть больше преимуществ для байт-кода, о котором я даже не думал.