Является ли Java компилируемым или интерпретируемым языком программирования? - PullRequest
133 голосов
/ 25 августа 2009

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

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

Ответы [ 9 ]

189 голосов
/ 25 августа 2009

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

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

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

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

  • скомпилировано заранее и выполнено как собственный код (аналогично большинству компиляторов C ++)
  • скомпилировано точно в срок и выполнено
  • истолковано
  • , непосредственно выполняемый поддерживаемым процессором (байт-код является собственным набором команд некоторых процессоров)
64 голосов
/ 04 апреля 2016

enter image description here

Код, написанный на 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

55 голосов
/ 25 августа 2009

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

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

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

47 голосов
/ 25 августа 2009

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

11 голосов
/ 25 августа 2009

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

10 голосов
/ 25 августа 2009

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

3 голосов
/ 04 апреля 2018

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

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

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

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

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

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

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

0 голосов
/ 03 апреля 2016

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

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

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

0 голосов
/ 25 августа 2009

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

...