2017-02-15 22 views
2

Я новичок в java и немного запутался в роли компилятора и JVM. Я прочитал несколько ресурсов и назвать несколькоРоль компилятора и JVM в java?

  1. What-are-the-functions-of-Java-Compiler ?
  2. Is the JVM a compiler or an interpreter?

Компилятор Как я сохранить файл файл .java в системе, компьютер внутренне сохраняет его в байтах 0 и 1-х. Я понимаю, что компилятор проверяет, соответствует ли написанная java-программа стандарту java или нет. Если не выбрасывает ошибку, иначе выровняйте файл класса.

Мой вопрос - это то, что нужно для создания файла .class. Can not JVM интерпретирует его напрямую (из байтов, сгенерированных в соответствии с .java-файлом) без необходимости .class-файла? Использует ли компилятор (javac) какую-либо оптимизацию?

JVM: - Этот вопрос по-другому. Не может компилятор генерировать байтовый/машинный код, который может быть напрямую интерпретирован CPU? так почему же JVM нужен здесь? Требуется ли JVM для интерпретации байтового кода, специфичного для платформы, например Windows или Linux?

+2

Основными причинами для этого способа являются (i) переносимость объектного кода и (ii) таким образом вам нужен только один компилятор и * N * JVM, а не * N * компиляторы. – EJP

+1

Настройка среды сборки сложна и требует много времени. Более крупный проект может занять несколько минут для создания (включая javadoc). Вы не хотите делать это каждый раз, когда запускаете программу. –

+1

В Java есть компиляторы, которые генерируют машинный код (Excelsior JET). Однако Java выигрывает от динамического усложнения, оптимизируя на основе того, как код фактически используется и может быть намного быстрее, чем AOT. –

ответ

0

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

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

Мой вопрос - это то, что нужно для создания файла .class. Невозможно JVM интерпретировать его напрямую (из байтов, сгенерированных в соответствии с .java-файлом) без необходимости .class-файла? Использует ли компилятор (javac) какую-либо оптимизацию?

The javac генерировать .class файл, который является промежуточным, что для достижения независимости от платформы.

Чтобы увидеть, что компилятор оптимизирован, просто декомпилировать байт-код, например, с javap или JD.

Этот вопрос по-другому. Не может компилятор генерировать байтовый/машинный код, который может быть напрямую интерпретирован CPU? так почему же JVM нужен здесь? Требуется ли JVM для интерпретации байтового кода, специфичного для платформы, например, для окон или Linux?

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

Чтобы узнать, что оптимизирован оптимизатор времени во времени, activate debug logging и прочитайте разобранный машинный код.

+0

Вот что мой вопрос о JVM. Не может сам компилятор генерировать машинные инструкции? зачем нам JVM? –

+0

@scottmiles Я отредактировал ответ. благодаря – fabfas

0

Компилятор генерирует байтовый код в значении Java, который представляет собой файл .class, содержащий байтовый код, который не состоит из 1 или 0, независимо от того, на какой ОС вы работаете.

И JVM интерпретирует байт-код, чтобы запустить его на конкретной ОС

0

A JVM, является реализация Java Virtual Machine Specification. Он интерпретирует скомпилированный двоичный код Java (называемый bytecode) для процессора компьютера (или «аппаратной платформы»).

JVM является целевой машиной для байт-кода вместо базовой архитектуры.

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

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

0

Главное, что эти два этапа и промежуточное представление («байт-код» в Java) являются независимостью от платформы.

Программа Java, в исходном коде, не зависит от платформы (в некоторой степени). Когда вы скомпилировать его в байт-код, компилятор Java в основном делает (почти) все то, что он может сделать в то же время поддерживая платформы-независимость:

  • проверяет синтаксис
  • выполняет статические проверки типа
  • транслирует человек-читаемый исходный код в машиночитаемой байт-код
  • делает статические оптимизации
  • т.д.

Это все, что:

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

так что теперь у вас есть .class файлы с байт-код, который все еще зависит от платформы и могут быть распределены в различных ОС или даже аппаратной платформы ,

А затем вторым шагом является JVM. Сам JVM является специфичным для платформы, и его задачей является преобразование/компиляция/интерпретация байтового кода в целевой архитектуре и ОС. Это означает, что:

  • переводить байт-код для набора команд данной платформы, а также с помощью целевой системы OS вызовы
  • время выполнения оптимизаций
  • т.д.
0

Что-в- -функции-Java-компилятора?

«Javac» - это Java-компилятор, который создает байт-код (.class File), и этот код не зависит от платформы.

Является ли JVM компилятором или интерпретатором? Ans- Переводчик

JVM является Java Virtual Machine - Запускается/трактует/переводит байт-код в машинный код и он внутренне использует JIT

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

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

0

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

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

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

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

Обратите внимание, что выбор того, следует ли инетретировать или компилировать, не зависит от используемого языка: например, в теории нет оснований, почему у вас не может быть c intepreter или компилировать python непосредственно в машинный код. Конечно, на практике большинство языков обычно компилируются или интерпретируются.

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

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