Окрім машинного коду, не існує мови програмування, яка виконується безпосередньо на апаратному забезпеченні, в тому сенсі, що ви не можете подати її буквальним вихідним текстом. Усі реальні реалізації повинні перекласти вихідну програму мовою "машини".
Для деяких реалізацій це перекладається статично. Зазвичай ми називаємо ці реалізації "складеними". Для інших він перекладається на деяку проміжну форму, яка потім динамічно переводиться під час запуску програми. Зазвичай ми називаємо такі реалізації "інтерпретованими". Між цими можливостями існує безліч можливостей, і навіть багато сучасних процесорів роблять динамічну трансляцію як частину її виконавчого ядра.
Навіть коли ваша програма статично складена задовго до виконання, якщо ви не пишете прошивку, рідко компільований код працює безпосередньо на голому металі, нічого не підтримуючи. Операційна система забезпечує віртуальну машину для програм простору користувача, часто надаючи такі функції, як ілюзія, що у вас є все для процесора. Ілюзія плоского простору пам’яті, яка може бути більшою, ніж фізична оперативна пам’ять, приєднана до машини, навіть називається «віртуальною пам’яттю».
Крім того, навіть коли ви програмуєте на C, є віртуальна машина C! Традиційно його називають "циклом виконання", або короткочасним ЕКР.
Оскільки C здебільшого переводиться безпосередньо в збірний / машинний код заздалегідь (на деяких платформах, може також бути якийсь потоковий код , який можна вважати частиною віртуальної машини), віртуальна машина зазвичай має лише обробляти запуск та закрити.
Запуск, як правило, включає налаштування стека та купи; операційна система рідко надає це для вас, і завдання мови програмування - це надати їх програмісту. На деяких платформах може бути деяка ініціалізація обробки сигналів, налаштування "основного" потоку в багатопотоковому середовищі, запуску глобальних конструкторів за винятком випадків, що програма була пов'язана з кодом C ++, обробка динамічно пов'язаних бібліотек або там може бути якась обробка, необхідна для налаштування argc / argv та envp. Нарешті, CRT передає контроль головному.
Що стосується відключення, багато операційні системи можуть вбивати процес нечисто, тому відключення не потрібно робити дуже багато. Головне - обробити atexit () виклики для випадку, коли програма виходить чисто.