У Java есть JVM, что у C?

15

Я знаю, что C имеет компилятор, но что определяет производительность выполнения?

Например, в блоке if else, что если в коде просто есть все ifs вместо if elses, что определяет, что все ifs будут запущены? В Java это будет JVM, но в C что такое компилятор выполнения?

scerrecrow
источник
16
Полезным нюансом для изучения является то, что языки - это просто языки. Например, вы можете создать компилятор, который принимает код на Си и запускает его в JVM.
Теластин
10
+1. Это очень хороший вопрос. Я бы не стал принижать его за невежество - удивительно, что больше учеников Java не спрашивают об этом.
Джехлин,
Вы также можете скомпилировать Java в машинный код и избежать JVM ...
AK_
2
Также: язык программирования! = Framework! = Библиотека времени выполнения! = Компилятор! = Компилятор Just in Time! = Interperter
AK_

Ответы:

17

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

Таким образом, Java-программы преобразуются в реальные инструкции JVM при их загрузке, в то время как программы на Си уже преобразуются компилятором в реальные инструкции до их запуска.

vrostu
источник
20
Есть компиляторы, которые берут Java и создают машинный код. Например Эксельсиор Джет . Существуют также интерпретаторы для C ( picoc ), которые никогда не генерируют код, выполняемый реальной машиной. Языки есть языки. Реализации являются реализациями. Смешение двух может сбить людей с толку.
6

Помимо машинного кода, не существует языка программирования, который выполнялся бы непосредственно на оборудовании, в том смысле, что вы не можете передать его в виде буквального исходного текста. Все реальные реализации должны переводить исходную программу на язык «машины».

Для некоторых реализаций он переводится статически. Мы обычно называем эти реализации "скомпилированными". Для других это переводится в некоторую промежуточную форму, которая затем переводится динамически по мере запуска программы. Мы обычно называем эти реализации "интерпретированными". Между ними существует множество возможностей, и даже многие современные процессоры выполняют динамическую трансляцию как часть своего исполнительного ядра.

Даже когда ваша программа статически компилируется задолго до ее выполнения, если вы не пишете микропрограмму, редко, когда скомпилированный код запускается прямо на голом железе, и ничто его не поддерживает. Операционная система предоставляет виртуальную машину для программ пользовательского пространства, часто обеспечивая такие функции, как иллюзия, что у вас есть центральный процессор для себя. Иллюзия плоского пространства памяти, которое может быть больше, чем физическое ОЗУ, подключенное к машине, даже называется «виртуальной памятью».

Кроме того, даже когда вы программируете на C, существует виртуальная машина C! Это традиционно упоминается как "среда выполнения C", или CRT для краткости.

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

Запуск обычно включает в себя настройку стека и кучи; операционная система редко предоставляет их вам, и задача языка программирования - предоставлять их программисту. На некоторых платформах может происходить некоторая инициализация обработки сигналов, настройка «основного» потока в многопоточной среде, запуск глобальных конструкторов на случай, если программа связана с кодом C ++, обработка динамически связанных библиотек или может потребоваться некоторая обработка для установки argc / argv и envp. Наконец, CRT передает управление главному.

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

Псевдоним
источник
2
Среда выполнения C и JVM - совершенно разные звери. ЭЛТ - это просто библиотека.
DeadMG
Я отредактировал ответ, чтобы прояснить ситуацию. Кстати, JVM и VirtualBox тоже совершенно разные звери.
псевдоним
@ Псевдоним: не совсем. Ну, ладно, VirtualBox - это виртуализатор, тогда как типичная JVM - это эмулятор, но если вы замените, например, VirtualBox на QEmu в вашем предложении, то оба на самом деле одинаковы.
Jörg W Mittag