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

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

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


person Community    schedule 25.08.2009    source источник
comment
C ++ можно интерпретировать. Есть несколько интерпретаторов C.   -  person Tom Hawtin - tackline    schedule 25.08.2009


Ответы (9)


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

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

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

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

  • скомпилирован заранее и выполняется как машинный код (аналогично большинству компиляторов C ++)
  • скомпилировано точно в срок и выполнено
  • интерпретированный
  • непосредственно выполняется поддерживаемым процессором (байт-код - это собственный набор инструкций некоторых процессоров)
person mmx    schedule 25.08.2009
comment
Фактически, некоторые JVM HotSpot начинают с интерпретации байт-кодов и компилируют их в машинный код только после того, как выяснят, что стоит компилировать, и соберут некоторую статистику о том, как этот код выполняется; например чтобы выяснить наиболее распространенный путь в каждой условной ветви. - person Stephen C; 25.08.2009
comment
Отсюда и термин «горячая точка» :) Он влияет на то, что часто выполняется, чтобы добиться оптимизации. - person Noon Silk; 25.08.2009
comment
Вы можете выключить интерпретатор в HotSpot с помощью -Xcomp. Стоит попробовать приложение, чтобы убедиться, что это плохая идея. - person Tom Hawtin - tackline; 25.08.2009
comment
В текущей версии Sun HotSpot JVM используется метод, называемый JIT-компиляцией, для компиляции байт-кода в собственные инструкции, понятные ЦП на лету во время выполнения. У меня создалось впечатление, что JVM - это интерпретатор, но он предполагает, что он дополнительно компилирует байтовый код. Я смущен. Также написано, что он это делает на лету во время выполнения. Может кто-нибудь объяснить это тоже? - person Anand; 05.09.2012
comment
поскольку java - это интерпретируемый язык, как это повлияет на производительность или выполнение любого приложения java - person NAND; 30.06.2016

введите описание изображения здесь

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

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

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

person displayName    schedule 04.04.2016
comment
Java использует много памяти из-за кешированного байт-кода? - person Pedro Gordo; 03.07.2017
comment
@sedulam: «Много памяти» - нечеткое утверждение. Управление памятью в Java довольно простое - JVM использует три поколения для создания и обслуживания своих объектов. Этот другой ответ SO может быть вам полезен. - person displayName; 03.07.2017
comment
С приведенным выше объяснением теоретически скомпилированный код C ++ всегда должен быть быстрее, чем логически подобный java-код, поскольку всегда будет некоторая часть файла .class, которую JIT решит не преобразовывать в машинный код. Другими словами, java никогда не сможет уловить скорость выполнения на «голом железе», которую продемонстрировал C ++. Это правильное предположение? - person DevdattaK; 26.11.2017
comment
@DevdattaK: Я не очень хорошо разбираюсь в C ++, но мое предположение состоит в том, что для небольших и специализированных программ Java может дать вам результат быстрее, потому что не будет тратить время на компиляцию тех частей кода, в которых нет не так много ускорения доступно. - person displayName; 26.11.2017
comment
@DevdattaK, ваше предположение обсуждается на этой странице вики en.m.wikipedia.org/ wiki / Java_performance? wprov = sfla1 Короче говоря, это не всегда так. - person Sundar Rajan; 01.10.2018

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

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

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

person starblue    schedule 25.08.2009
comment
Кроме того, Google V8 JavaScript Execution Engine не просто выполняет частичную своевременную компиляцию. Он всегда компилируется в собственный код, на самом деле V8 даже не имеет интерпретатора. Он имеет только компилятор (аналогично Maxine, но в отличие от Maxine V8 имеет только один компилятор). Все три из этих примеров (GCJ, Maxine и V8) еще более убедительно подтверждают вашу точку зрения: не существует такой вещи, как интерпретируемый язык или компилируемый язык. Язык не интерпретируется и не компилируется. Язык просто есть (на самом деле это цитата Шрирама Кришнамурти). - person Jörg W Mittag; 25.08.2009
comment
Почему вы говорите о javascript в вопросе о java? - person Koray Tugay; 24.01.2015
comment
@KorayTugay Просто в качестве примера. Я, конечно, не хочу иметь в виду, что у Java и Javascript есть что-то общее, кроме первых четырех букв их имени. - person starblue; 07.11.2017
comment
Разве хотя бы разница в интерпретируемом и скомпилированном языках не означает, что двоичный код скомпилированного языка не может изменять поток выполнения в любое время, в то время как интерпретируемый язык очень подчиняется некоторым текущим функциям? Библиотеки в C - это вариант, в то время как в других языках вы не можете иметь объект массива без двоичного расширения C, которое может быть обновлено или быть совершенно другим кодом на другой платформе. Язык сценариев сможет работать на обоих, в то время как скомпилированному языку потребуется другой двоичный файл для запуска. - person Eaton Emmerich; 16.01.2018

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

person Noon Silk    schedule 25.08.2009
comment
... но не совсем точно. - person Stephen C; 25.08.2009
comment
JVM может решить не интерпретировать байт-код. Он может компилировать его с помощью JIT и напрямую выполнять. - person mmx; 25.08.2009
comment
Технически JIT не выполняет его напрямую. Просто вспомнил, как это было выполнено. - person cletus; 25.08.2009
comment
Мехрдад: Согласен, я не описал здесь возможные операции JIT, так как считаю, что это до JVM, и я все равно оставил свой ответ простым :) - person Noon Silk; 25.08.2009
comment
cletus: После JIT он будет выполнен напрямую. JIT читает часть байт-кода (например, метод complete), компилирует до машинного кода и переходит к нему. - person mmx; 25.08.2009
comment
@MehrdadAfshari Вы говорите, что он может JIT-компилировать и выполнять напрямую. но если он скомпилирован в машинный код, почему JVM все еще его выполняет? - person Koray Tugay; 24.01.2015
comment
@KorayTugay Скомпилированный код не запускается автоматически, если к нему не переходит что-то. Виртуальная машина выполнит собственный код, который она только что JIT запустила, просто перейдя к первой инструкции и позволив процессору позаботиться обо всем остальном. - person mmx; 25.01.2015

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

person maykeye    schedule 25.08.2009
comment
Это продвинутая программа для развития настроения :) - person Thorarin; 25.08.2009
comment
JIT - действительно очень сложное программное обеспечение, которое может выполнять оптимизацию на основе информации времени выполнения (например, профилировщик), чего не может сделать опережающий компилятор (потому что у него нет информации о поведении среды выполнения). программа заранее). Но у него, наверное, совсем нет настроения ... :-) - person Jesper; 25.08.2009

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

person Sam Harwell    schedule 25.08.2009

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

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

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

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

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

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

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

person prime    schedule 04.04.2018
comment
Должно быть «байт-код может быть преобразован», а не «преобразован». Спецификации Java определяют байт-код. Запускается ли этот байт-код (a) непосредственно на оборудовании, (b) через интерпретатор, ( c) скомпилированы заранее или (d) частично скомпилированы на лету во время выполнения, все оставлено как детали реализации. Обратите внимание, что все четыре из этих параметров действительно использовались различными реализациями Java в реальном мире. - person Basil Bourque; 05.04.2018
comment
Спасибо за указание на это. Что же произойдет, если байт-код не преобразовать в машинный код? Я могу представить себе сценарий, в котором байт-код является собственным набором инструкций для некоторых процессоров, и тогда нет необходимости в преобразовании. Или я что-то упускаю. - person prime; 05.04.2018
comment
Щелкните ссылку, которую я дал для Jazelle DBX (прямое выполнение байт-кода) технология, где подмножество байт-кода JVM является собственными машинными инструкциями ЦП (вроде как). Без этого вы получите машинный код, сгенерированный из байт-кода (а) из интерпретатора (на лету), (б) из компилятора заранее или (в) на лету с помощью своевременного компилятора ( сначала интерпретируется, а затем иногда компилируется и кэшируется во время выполнения). - person Basil Bourque; 05.04.2018

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

person hobbs    schedule 25.08.2009
comment
Что означает байтовая компиляция? - person Jesper; 25.08.2009
comment
@Jesper: Байт-скомпилированный обычно означает скомпилированный в байт-код. Байт-код - это общий термин, который охватывает любой вид нетекстового промежуточного кода (обычно не исполняемый машиной). - person Greg Hewgill; 27.08.2009

Цитата из: 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 определенно является компилируемым языком.

person Teo    schedule 03.04.2016