Java относится к интерпретируемым

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

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

9 ответов

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

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

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

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

  • скомпилирован заранее и выполнен как родной код (похожий на большинство компиляторов С++)
  • скомпилировано как раз вовремя и выполнено
  • интерпретируется
  • напрямую выполняется поддерживаемым процессором (байт-код — это собственный набор команд некоторых процессоров)

Фактически, некоторые JVM HotSpot начинают с интерпретации байт-кодов и компилируют их в собственный код только после того, как они выяснили, что стоит компилировать, и собрали некоторые статистические данные о том, как выполняется код; например, чтобы выяснить наиболее распространенный путь в каждой условной ветви.

Вы можете отключить переводчик в HotSpot с помощью -Xcomp. Стоит попробовать приложение, чтобы увидеть, что это за плохая идея.

Существует утверждение: «Текущая версия Sun HotSpot JVM использует метод компиляции Just-in-time (JIT) для компиляции байт-кода с собственными инструкциями, понятными ЦП на лету во время выполнения». У меня сложилось впечатление, что JVM — это интерпретатор, но он предполагает дальнейшую компиляцию байтового кода. Я сбит с толку. Также написано, что он делает это на лету во время выполнения. Может кто-нибудь объяснить это тоже?

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

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

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

Читайте также:  Php html to pdf mpdf

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

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

@KorayTugay Просто в качестве примера. Я, конечно, не хочу подразумевать, что у Java и Javascript есть что-то общее, кроме первых четырех букв их имени.

Разве, по крайней мере, разница в интерпретируемом и скомпилированном языке не означает, что двоичный файл скомпилированного языка не может изменить свой поток выполнения в любое время, в то время как интерпретируемый язык очень послушен некоторым текущим функциям функций? Библиотеки в C это опция, в то время как в других языках вы не можете иметь объект массива без двоичного расширения C, которое может быть обновлено или может быть совершенно другим кодом на другой платформе. Язык сценариев сможет работать на обоих, в то время как скомпилированному языку потребуется другой двоичный файл для запуска

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

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

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

@sedulam: «много памяти» — нечеткое утверждение. Управление памятью в Java довольно простое — три поколения — это то, что JVM использует для создания и обслуживания своих объектов. Этот другой SO ответ может быть полезным для вас.

Читайте также:  JavaScript User defined object

С вышеприведенным объяснением теоретически скомпилированный код C ++ всегда должен быть быстрее, чем логически подобный Java-код, поскольку всегда будет некоторая часть файла .class, которую JIT решит не преобразовывать в машинный код. Другими словами, java никогда не сможет поймать скорость исполнения без использования железа, которую продемонстрировал C ++. Это правильное предположение?

@DevdattaK: Я не слишком много знаю C ++, но я предполагаю , что для небольших и специализированных программ Java может дать вам результат быстрее, потому что это не будет тратить время на компиляцию тех частей кода, где не так много ускорения.

@DevdattaK Ваше предположение обсуждается на этой вики-странице en.m.wikipedia.org/wiki/Java_performance?wprov=sfla1 Короче говоря, это не всегда так.

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

JVM может предпочесть не «интерпретировать» байт-код. Он может JIT скомпилировать его и выполнить напрямую.

Mehrdad: Согласен, я не описывал возможные операции JIT здесь, так как считаю это до JVM, и я все равно оставляю свой ответ простым 🙂

Клетус: После JIT это будет выполнено напрямую. JIT читает фрагмент байт-кода (например, полный метод), компилирует его в машинный код и переходит к нему.

@MehrdadAfshari Вы говорите: «Он может скомпилировать JIT и выполнить его напрямую», но если он скомпилирован в машинный код, почему JVM все еще выполняет его?

@KorayTugay Скомпилированный код не запускается автоматически, если к нему не применен какой- либо элемент. ВМ выполнит собственный код, который он просто JITted, просто перейдя к первой инструкции и позволив CPU позаботиться обо всем остальном.

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

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

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

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

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

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

Читайте также:  Php json encoding objects

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

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

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

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

Должно быть «байт — код может быть преобразован» , а не «конвертируется». Спецификации Java определяют байт-код. Независимо от того, выполняется ли этот байт-код (a) непосредственно в аппаратном обеспечении , (b) через интерпретатор, (c) скомпилирован заранее или (d) частично скомпилирован на лету во время выполнения , все оставлено в качестве подробностей реализации. Обратите внимание, что все четыре из этих опций действительно использовались различными реальными реализациями Java.

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

Нажмите на ссылку, которую я дал для технологии Jazelle DBX (Direct Bytecode eXecution) , где подмножество байт-кода JVM это машинные инструкции собственного процессора (своего рода сортировка). Без этого вы получите машинный код, сгенерированный из байт-кода (a) от интерпретатора (на лету), (b) от компилятора заранее или (c) на лету с помощью компилятора, работающего точно в срок ( сначала интерпретируется, а затем иногда компилируется и кэшируется во время выполнения).

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

Источник

Оцените статью