2013-10-08 5 views
0

Компилятор Java компилируется в двоичный код, как gcc компилирует код C? или он просто компилируется на другой тип «языка», который будет интерпретироваться другой вещью? Я не могу запустить его. Должно быть, я думаю, JVM не так ли?Java интерпретируется во время выполнения?

Итак, Java на самом деле не является истинным скомпилированным языком, интерпретируется?

Это просто вопрос.

+4

Да и нет: http://en.wikipedia.org/wiki/Java_virtual_machine Bytecode - это промежуточный язык http://en.wikipedia.org/wiki/Intermediate_language – tom

+0

Уверен, что на этот вопрос был дан ответ несколько раз, один раз в течение последнего месяца, но я не могу найти ссылку. –

+0

Возможный дубликат [Является ли Java составленным или интерпретированным языком программирования?] (Http://stackoverflow.com/questions/1326071/is-java-a-compiled-or-an-interpreted-programming-language) –

ответ

8

Java на самом деле не настоящий скомпилированный язык, интерпретируется?

Ну ...

Java является скомпилирован. Но не для машинного кода, он компилируется в байт-код. Что может интерпретировать JVM. Или, в свою очередь, он может скомпилировать его далее в машинный код. Это на самом деле происходит (по крайней мере, для частей кода) с так называемым компилятором Just-In-Time Hotspot, который является частью вашей стандартной JVM.

Что отличает его от «настоящих» интерпретируемых языков, таких как Perl или Python (даже если они тоже «компилируются» во внутреннее представление) состоит в том, что для отправленного кода не требуется компилятор для запуска, просто время выполнения. С другой стороны, Perl и Python должны иметь возможность «eval» новых программ во время выполнения.

+0

Являются ли языки DOT NET все скомпилированы в один байт-код, а затем интерпретируются ... с помощью CLR или байт-кода является специфичным для языка ... как и для C# и VB.net? (Я в основном разработчик Java, который никогда не работал в .net, но я хочу узнать из любопытства) – AurA

+1

@AurA CLR означает Common Language Runtime. Все языки .NET составляют одну и ту же спецификацию байт-кода. Для CLR не имеет значения, какой язык использовался для создания байт-кода. Кстати, есть и другие языки, кроме Java, которые могут быть скомпилированы в байт-код Java. Скала, например. – Philipp

+0

@Philipp, который отвечает сомнением отлично .. – AurA

2

Java - это нечто среднее между скомпилированным и интерпретируемым языком.

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

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

Что касается производительности, этот метод имеет как недостатки, так и преимущества перед компиляцией на собственный машинный код.

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

Но, с другой стороны, компиляция во время выполнения позволяет оптимизировать сгенерированный машинный код для платформы, на которой фактически работает программное обеспечение, в то время как предварительно скомпилированное программное обеспечение обычно оптимизировано для конкретного процессора. Компиляция во время выполнения также позволяет оптимизировать «Just-In-Time-Optimization». В то время как обычный компилятор должен угадать, какие части программы выполняются чаще всего, оптимизатор JIT может смотреть программу во время ее фактического выполнения и использовать эту информацию, чтобы изменить программу, чтобы быть более эффективной во время ее работы.

+0

Было бы более точно сказать, что Java ОБА скомпилированный язык И интерпретируемый язык. –

+0

Этот ответ звучит как «да, интерпретируется» (переведен на собственные инструкции = интерпретация) –

2

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

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

Смотреть это fopr подробнее: http://searchsoa.techtarget.com/definition/Java-virtual-machine

1

я надеюсь, если это поможет вам

так, что Java commpiler работает

enter image description here

1

или просто скомпилировать к другому типу из «языка», который будет интерпретируется другой вещью?

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

+0

Немного ошибочно сказать, что процессор «интерпретирует» фактический машинный код, он просто запускает его. Этот термин обычно зарезервирован для описания процесса со значительными накладными расходами, например, JVM – Leeor

+0

Если вы думаете об этом, это не так. Фактически, инструкция типа «ADD A, B» представляет собой очень высокий уровень, чтобы описать, что происходит на уровне транзисторов. Что касается «значительных накладных расходов» - относительно * what *? – Ingo

+0

Также посмотрите на это: http://stackoverflow.com/questions/1383947/can-we-implement-a-java-interpreter-in-hardware-that-executes-java-bytecodes-nat – Ingo

Смежные вопросы