Короткий ответ
Программу на Java компилируют один раз в промежуточный байт-код, а исполняет его JVM, реализация которой существует под каждую платформу: Windows, Linux, macOS. Поэтому один и тот же .class-файл работает без перекомпиляции везде, где есть подходящая JVM. Этот принцип называют «Write Once, Run Anywhere».
Как это работает подробнее
Секрет — в разделении труда между компилятором и средой исполнения: компилятор не привязывается к конкретному «железу», а JVM делает это за него.
- Компиляция.
javacпревращает исходный код не в машинный код процессора, а в промежуточный байт-код (.class-файлы), одинаковый для всех платформ. - Исполнение. Каждая реализация JVM «знает», как превратить байт-код в команды именно своей ОС и архитектуры. Переносимым является байт-код, а JVM платформозависима — её устанавливают отдельно под каждую систему.
- Фиксированные примитивы. В отличие от C/C++, где размер
intзависит от архитектуры, спецификация Java задаёт размеры жёстко: например,int— всегда 32 бита.
Пример кода
PrimitiveSizes.java
public class PrimitiveSizes {
public static void main(String[] args) {
// размер примитивов фиксирован спецификацией Java
System.out.println(Integer.SIZE); // 32 на любой платформе
System.out.println(Double.SIZE); // 64 на любой платформе
}
}Что использовать на практике
- Формулировать главную мысль: переносится байт-код, а не JVM.
- Подкреплять тезис фиксированными размерами примитивов — это аргумент против платформенных расхождений.
- Упомянуть: одна компиляция, затем запуск на любой ОС с установленной JVM.