Як правило, скомпільований код являє собою точний набір інструкцій, необхідних ЦП для "виконання" програми. У Java скомпільований код - це точний набір інструкцій для "віртуального процесора", який необхідний для однакової роботи на кожній фізичній машині.
Отже, в певному сенсі дизайнери мови Java вирішили, що мова та скомпільований код будуть незалежними від платформи, але оскільки код врешті-решт повинен працювати на фізичній платформі, вони вирішили розмістити весь залежний від платформи код у JVM.
Ця вимога до JVM на відміну від вашого прикладу Turbo C. За допомогою Turbo C компілятор видасть код, який залежить від платформи, і немає необхідності в роботі JVM, оскільки скомпільована програма Turbo C може виконуватися центральним процесором безпосередньо.
З Java процесор виконує JVM, який залежить від платформи. Потім цей запущений JVM виконує байт-код Java, який не залежить від платформи, за умови, що у вас є доступний JVM для його виконання. Можна сказати, що, пишучи код Java, ви не програмуєте для виконання коду на фізичній машині, ви пишете код для виконання на віртуальній машині Java.
Єдиний спосіб роботи всього цього байт-коду Java на всіх віртуальних машинах Java - це те, що був написаний досить суворий стандарт щодо роботи віртуальних машин Java. Це означає, що незалежно від того, яку фізичну платформу ви використовуєте, частина інтерфейсу байт-коду Java з JVM гарантовано працює лише в один бік. Оскільки всі JVM працюють однаково, той самий код працює абсолютно однаково скрізь без перекомпіляції. Якщо ви не можете пройти тести, щоб переконатися, що це те саме, вам не дозволяється називати вашу віртуальну машину "віртуальною машиною Java".
Звичайно, є способи, якими ви можете порушити переносимість програми Java. Ви можете написати програму, яка шукає файли, знайдені лише в одній операційній системі (наприклад, cmd.exe). Ви можете використовувати JNI, який ефективно дозволяє скласти скомпільований код C або C ++ у клас. Ви можете використовувати конвенції, які працюють лише для певної операційної системи (наприклад, припускаючи, що ":" відокремлює каталоги). Але вам гарантовано ніколи не доведеться перекомпілювати програму для іншої машини, якщо ви не робите щось справді особливе (наприклад, JNI).