У Java є JVM, що має C?


15

Я знаю, що C має компілятор, але що визначає ефективність виконання?

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


16
Корисним нюансом для вивчення є те, що мови - це лише мови. Ви можете зробити компілятор, який бере C код і змушує його працювати, наприклад, у JVM.
Теластин

10
+1. Це дуже гарне запитання. Я б не сказав це за його незнання - дивно, що більш студенти Java цього не запитують.
djechlin

Ви також можете скласти Java до машинного коду та уникати JVM ...
AK_

2
Також: Мова програмування! = Framework! = Бібліотека часу виконання! = Компілятор! = Тільки в часі компілятор! =
Інтерпертер

Відповіді:


17

У Java віртуальна машина виконує ваш код, але компілятори C генерують код, який реальна машина виконує. Якщо точніше, в обох випадках ваша програма в кінцевому підсумку перетворюється на реальний машинний код, але у випадку з Java є середній крок збирання в байт-код JVM.

Таким чином, програми Java перетворюються в реальні інструкції JVM, коли ви завантажуєте їх, тоді як програми C вже перетворюються на реальні інструкції компілятора перед їх запуском.


20
Є компілятори, які беруть Java і виробляють машинний код. Наприклад, Excelsior Jet . Існують також інтерпетери для C ( picoc ), які ніколи не генерують код, який виконує справжня машина. Мови - це мови. Реалізація - це реалізація. Плутати їх двоє можуть бентежити людей.

6

Окрім машинного коду, не існує мови програмування, яка виконується безпосередньо на апаратному забезпеченні, в тому сенсі, що ви не можете подати її буквальним вихідним текстом. Усі реальні реалізації повинні перекласти вихідну програму мовою "машини".

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

Навіть коли ваша програма статично складена задовго до виконання, якщо ви не пишете прошивку, рідко компільований код працює безпосередньо на голому металі, нічого не підтримуючи. Операційна система забезпечує віртуальну машину для програм простору користувача, часто надаючи такі функції, як ілюзія, що у вас є все для процесора. Ілюзія плоского простору пам’яті, яка може бути більшою, ніж фізична оперативна пам’ять, приєднана до машини, навіть називається «віртуальною пам’яттю».

Крім того, навіть коли ви програмуєте на C, є віртуальна машина C! Традиційно його називають "циклом виконання", або короткочасним ЕКР.

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

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

Що стосується відключення, багато операційні системи можуть вбивати процес нечисто, тому відключення не потрібно робити дуже багато. Головне - обробити atexit () виклики для випадку, коли програма виходить чисто.


2
Виконання C, і JVM, - зовсім інші звірі. CRT - це лише бібліотека.
DeadMG

Я відредагував відповідь, щоб зробити щось більш зрозумілим. Між іншим, JVM і VirtualBox - теж абсолютно різні звірі.
Псевдонім

@ Псевдонім: не дуже. Ну добре, VirtualBox є віртуалізатором, тоді як типовий JVM є емулятором, але якщо замінити, наприклад, VirtualBox на QEmu у своєму реченні, то два насправді однакові.
Йорг W Міттаг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.