Java компилятор / интерпретатор - PullRequest
19 голосов
/ 05 июля 2010

Почему мы говорим, что Java - это скомпилированный и интерпретируемый язык?

В чем преимущество этого (быть скомпилированным и интерпретированным)?

Ответы [ 7 ]

45 голосов
/ 05 июля 2010

Java компилируется в промежуточный «байт-код» во время компиляции. Это в отличие от языка, подобного C, который компилируется в машинный язык во время компиляции. Байт-код Java не может быть напрямую выполнен на оборудовании так, как скомпилированный C-код. Вместо этого байт-код должен быть интерпретирован JVM (виртуальной машиной Java) во время выполнения для выполнения. Основным недостатком такого языка, как C, является то, что при его компиляции этот двоичный файл будет работать только на одной конкретной архитектуре (например, x86).

Интерпретируемые языки, такие как PHP, эффективно независимы от системы и зависят от интерпретатора, специфичного для системы и архитектуры. Это приводит к гораздо большей переносимости (одни и те же PHP-скрипты работают на машинах Windows, Linux и т. Д.). Однако такая интерпретация приводит к значительному снижению производительности. Языки высокого уровня, такие как PHP, требуют больше времени для интерпретации, чем машинно-специфические инструкции, которые могут быть выполнены аппаратным обеспечением.

Java стремится найти компромисс между чисто скомпилированным языком (без переносимости) и чисто интерпретируемым языком (который значительно медленнее). Это достигается путем компиляции кода в форму, которая ближе к машинному языку (фактически, байт-код Java является машинным языком, просто для виртуальной машины Java), но все же может легко переноситься между архитектурами. Поскольку для выполнения Java все еще требуется программный уровень (JVM), это интерпретируемый язык. Однако интерпретатор (JVM) работает в промежуточной форме, известной как байт-код, а не в необработанных исходных файлах. Этот байт-код генерируется во время компиляции компилятором Java. Поэтому Java также является скомпилированным языком. Работая таким образом, Java получает некоторые преимущества скомпилированных языков, а также некоторые преимущества интерпретируемых языков. Тем не менее, он также наследует некоторые ограничения от обоих этих языков.

Как указывает Божо, существуют некоторые стратегии для повышения производительности кода Java (и других языков байтового кода, таких как .Net) за счет использования компиляции Just in Time (JIT). Фактический процесс варьируется от реализации к реализации в зависимости от требований, но конечный результат заключается в том, что исходный код компилируется в байт-код во время компиляции, но затем он запускается через компилятор во время выполнения до его выполнения. Делая это, код может быть выполнен с почти родной скоростью. Некоторые платформы (я полагаю, что .Net делает это) сохраняют результат компиляции JIT, заменяя байтовый код. При этом все последующие исполнения программы будут выполняться так, как если бы программа была изначально скомпилирована.

13 голосов
/ 05 июля 2010

Почему мы говорим, что Java - это компилируемый и интерпретируемый язык.

Поскольку исходный код (.java файлы) скомпилирован в байт-код (.class файлы), который затем интерпретируется Виртуальной машиной Java ( также известный как JVM) для выполнения (JVM может выполнять дальнейшую оптимизацию, но это другая история).

В чем преимущество над этим (компилируется / интерпретируется)

Портативность. Тот же самый байт-код может быть выполнен на любой платформе, пока установлена ​​JVM («скомпилируйте один раз, запустите где угодно»).

6 голосов
/ 05 июля 2010

Это длинная тема, и вам лучше прочитать о JIT . Короче говоря, Java компилируется в байт-код, а байт-код позже компилируется (в JVM) в машинный код.

3 голосов
/ 05 июля 2010

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

Он считается «интерпретируемым» языком, поскольку после компиляции байт-кода его можно запустить на любой машине, которая имеетустановленная JVM.Таким образом, Java во многом похожа на интерпретируемый язык в том смысле, что по большей части она не зависит от платформы, на которой он работает.Это поведение аналогично другим интерпретируемым языкам, таким как Perl, Python, PHP и т. Д.

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

2 голосов
/ 05 июля 2010

Java скомпилирована, в байт-код, а не в двоичные файлы. Байт-коды не являются исполняемыми напрямую, им нужна виртуальная машина Java для своевременной компиляции и повторной компиляции в машинный код во время выполнения.

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

1 голос
/ 05 июля 2010

Скомпилировано: Ваша программа синтаксически является правильной Java-программой до ее запуска.

Интерпретировано: Запускать на разных платформах один и тот же (байтовый) код.

Скомпилировано: Когда ваша программа скомпилирована правильно, вы можете быть уверены, что под контролем находится 80% программных ошибок. И ваш код не остановится, потому что вы неправильно закрыли блок кода и т. Д.

Интерпретация: Вы знаете, что такое апплеты? Это было «убийственное» приложение, когда появилась Java. Ваш браузер загружает апплет с веб-сайта и запускает код апплета в вашем браузере. Это не очень круто. Но этот же апплет работает в Windows, Linux, Mac, Solaris, ... потому что запускает / интерпретирует промежуточный язык: байт-код.

0 голосов
/ 15 марта 2018

Статический компилятор преобразует исходный код непосредственно в машинный код, который может быть непосредственно выполнен на целевой платформе, а для разных аппаратных платформ требуются разные компиляторы.Компилятор Java преобразует исходный код Java в переносимые байтовые коды JVM, которые являются «инструкциями виртуальной машины» для JVM.Первое поколение JVM было полностью интерпретировано.В следующем поколении JVM для ускорения выполнения использовались компиляторы JIT.Процесс выполнения HotSpot объединяет интерпретацию, профилирование и динамическую компиляцию.Вместо того, чтобы преобразовывать все байтовые коды в машинный код перед их выполнением, HotSpot сначала запускается как интерпретатор и компилирует только «горячий» код - код, который выполняется чаще всего.

Подробнее здесь - https://www.ibm.com/developerworks/java/library/j-jtp12214/

...