Является ли Java компилируемым или интерпретируемым языком программирования?

119

В прошлом я использовал С++ в качестве языка программирования. Я знаю, что код, написанный на С++, проходит процесс компиляции, пока не станет объектным кодом "машинный код".

Я хотел бы знать, как работает Java в этом отношении. Как пользователь записывает Java-код на компьютер?

  • 13
    C ++ можно интерпретировать. Там есть несколько интерпретаторов Си.
Теги:
compilation
interpretation

9 ответов

175

В реализациях Java обычно используется двухэтапный процесс компиляции. Исходный код Java скомпилирован с помощью байт-кода с помощью компилятора Java. Байт-код выполняется виртуальной машиной Java (JVM). Современные JVM используют метод компиляцию Just-in-Time (JIT) для компиляции байт-кода в собственные инструкции, понятные аппаратным процессором "на лету" во время выполнения.

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

Технически можно скомпилировать Java до исходного кода и выполнить двоичный файл. Также можно напрямую интерпретировать код Java.

Подводя итог, в зависимости от среды исполнения байт-код может быть:

  • скомпилирован заранее и выполнен как родной код (похожий на большинство компиляторов С++)
  • скомпилировано как раз вовремя и выполнено
  • интерпретируется
  • напрямую выполняется поддерживаемым процессором (байт-код - это собственный набор команд некоторых процессоров)
  • 15
    Фактически, некоторые JVM HotSpot начинают с интерпретации байт-кодов и компилируют их в собственный код только после того, как они выяснили, что стоит компилировать, и собрали некоторые статистические данные о том, как выполняется код; например, чтобы выяснить наиболее распространенный путь в каждой условной ветви.
  • 1
    Отсюда и термин «горячая точка» :) Это делает то, что часто выполняется, чтобы получить оптимизацию.
Показать ещё 3 комментария
50

Термины "интерпретируемый язык" или "скомпилированный язык" не имеют смысла, поскольку любой язык программирования может быть интерпретирован и/или скомпилирован.

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

В наши дни частичная компиляция "точно в срок" используется для многих языков, которые когда-то считались "интерпретированными", например Javascript.

  • 3
    Кроме того, Google V8 JavaScript Execution Engine не просто выполняет частичную своевременную компиляцию. Он всегда компилируется в нативный код, на самом деле, в V8 даже нет интерпретатора. Он имеет только компилятор (похож на Maxine, но в отличие от Maxine V8 имеет только один компилятор). Все три из этих примеров (GCJ, Maxine и V8) подтверждают вашу точку зрения еще сильнее: не существует такого понятия, как интерпретируемый язык или скомпилированный язык. Язык не интерпретируется и не компилируется. Язык просто есть (это на самом деле цитата Шрирама Кришнамурти).
  • 3
    Почему вы говорите о JavaScript в вопросе Java?
Показать ещё 2 комментария
45

Изображение 109504

Код, написанный на Java:

  • Сначала скомпилированный в байт-код программой javac, как показано в левой части изображения выше;
  • Затем, как показано в правом разделе приведенного выше изображения, другая программа, называемая java, запускает среду выполнения Java и может компилировать и/или интерпретировать байт-код с помощью Java Interpreter/JIT Compiler.

Когда Java интерпретирует байт-код и когда он его компилирует? Код приложения первоначально интерпретируется, но JVM отслеживает, какие последовательности байт-кода часто выполняются, и транслирует их в машинный код для непосредственного выполнения на оборудовании. Для байт-кода, который выполняется только несколько раз, это экономит время компиляции и уменьшает начальную задержку; для часто выполняемого байт-кода JIT-компиляция используется для запуска на высокой скорости после начальной фазы медленной интерпретации. Кроме того, поскольку программа тратит большую часть времени на выполнение меньшего количества своего кода, сокращение времени компиляции является значительным. Наконец, во время первоначальной интерпретации кода, статистика выполнения может быть собрана до компиляции, что помогает выполнять лучшую оптимизацию.


Рекомендации:

1: http://techwelkin.com/compiler-vs-interpreter

2: http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

3: https://en.wikipedia.org/wiki/Just-in-time_compilation#Startup_delay_and_optimizations

  • 0
    Из-за кэшированного байт-кода Java использует много памяти?
  • 2
    @sedulam: «много памяти» - нечеткое утверждение. Управление памятью в Java довольно простое - три поколения - это то, что JVM использует для создания и обслуживания своих объектов. Этот другой SO ответ может быть полезным для вас.
Показать ещё 3 комментария
45

Java компилируется в байт-код, который затем переходит в виртуальную машину Java, которая интерпретирует его.

  • 0
    простой и приятный ответ
  • 30
    ... но не совсем точно.
Показать ещё 6 комментариев
11

Виды обоих. Сначала компилируется java (некоторые предпочитают говорить "переводится" ) на байт-код, который затем либо скомпилирован, либо интерпретируется в зависимости от настроения JIT.

  • 27
    Это продвинутая часть программного обеспечения, чтобы развить настроение :)
  • 5
    JIT - действительно очень сложная часть программного обеспечения, которая может выполнять оптимизацию на основе информации времени выполнения (например, профилировщика), чего не может сделать преждевременный компилятор (потому что у него нет информации о поведении времени выполнения программа раньше времени). Но, вероятно, у него нет настроения ... :-)
10

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

1

Java выполняет как компиляцию, так и интерпретацию,

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

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

Javac - это компилятор Java, который компилирует код Java в байт-код. JVM - это виртуальная машина Java, которая выполняет/интерпретирует/переводит байт-код в машинный код. В Java, хотя он считается интерпретируемым языком, он может использовать JIT (Just-in-Time) компиляцию, когда байт-код находится в JVM. JIT-компилятор считывает байт-коды во многих разделах (или полностью, редко) и динамически компилирует их в машинный код, чтобы программа могла работать быстрее, а затем кэшироваться и повторно использоваться позже без необходимости перекомпиляции. Таким образом, JIT-компиляция сочетает в себе скорость скомпилированного кода с гибкостью интерпретации.

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

Скомпилированный язык - это язык программирования, реализации которого, как правило, являются компиляторами (переводчиками, которые генерируют машинный код из исходного кода), а не интерпретаторами (пошаговые исполнители исходного кода, где не выполняется перевод перед выполнением)

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

  • 0
    Должно быть «байт - код может быть преобразован» , а не «конвертируется». Спецификации Java определяют байт-код. Независимо от того, выполняется ли этот байт-код (a) непосредственно в аппаратном обеспечении , (b) через интерпретатор, (c) скомпилирован заранее или (d) частично скомпилирован на лету во время выполнения , все оставлено в качестве подробностей реализации. Обратите внимание, что все четыре из этих опций действительно использовались различными реальными реализациями Java.
  • 0
    Спасибо за указание на это. Так что же произойдет, если байт-код не будет преобразован в машинный код? Я могу вспомнить сценарий, в котором байт-код является набором собственных команд для некоторых процессоров, и тогда нет необходимости в преобразовании. Или я что-то упустил.
Показать ещё 1 комментарий
0

Java - это байт-скомпилированный язык, ориентированный на платформу, называемую Java Virtual Machine, которая основана на стеках и имеет некоторые очень быстрые реализации на многие платформы.

  • 1
    Что означает «байтово скомпилированный»?
  • 2
    @Jesper: «Byte-compiled» обычно означает «скомпилированный в байт-код». «Байт-код» - это общий термин, охватывающий любой нетекстовый промежуточный код (обычно не исполняемый на компьютере).
-2

Цитата из: https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster

Разработчики приложений могут разрабатывать код приложения на любой из различных ОС, доступных на рынке сегодня. Язык Java на данном этапе является агностическим для ОС. Блестящий исходный код, написанный разработчиком Java-приложений, теперь компилируется в Java-байт-код, который в терминологии Java называется компиляцией на стороне клиента. Эта компиляция в Java-байт-код позволяет разработчикам Java писать один раз. Java-байт-код может запускаться на любой совместимой ОС и сервере, что делает агностик исходного кода OS/Server. После создания Java-байт-кода взаимодействие между приложением Java и базовой ОС/Сервером более интимное. Путешествие продолжается. Рамка корпоративных приложений выполняет эти байт-коды Java в среде времени выполнения, которая известна как Java Virtual Machine (JVM) или Java Runtime Environment (JRE). JVM тесно связан с базовыми ОС и оборудованием, поскольку он использует ресурсы, предлагаемые ОС и сервером. Байт Java-кода теперь скомпилирован на исполняемый код машинного языка, который является специфичным для платформы. Это называется компиляцией на стороне сервера.

Итак, я бы сказал, что Java определенно скомпилированный язык.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню