Java-машина в Kotlin
Давайте выясним, что такое Java-машина. Слово машина здесь легко понять буквально, и это будет ошибкой. Это не отдельный компьютер и не системный блок. Java-машина - программа, которую устанавливают на компьютер или на сервер, где код должен выполняться.
Полное имя этой программы - JVM (Java Virtual Machine, виртуальная машина Java). Слово виртуальная значит вот что. Настоящие компьютеры разные, а машина показывает программе одну и ту же среду. Программа обращается к машине, а машина уже обращается к конкретному компьютеру.
Так сделано из-за различия компьютеров. Процессоры и операционные системы устроены по-разному. Windows, Linux и macOS принимают не один и тот же файл команд. Если перевести программу сразу в команды одного процессора, на другом компьютере она часто просто не запустится. Переносить такую программу с системы на систему пришлось бы заново, отдельной сборкой под каждый вариант.
Программу на Kotlin или на Java процессору напрямую не отдают. Сначала компилятор переводит исходный код в байткод. Исходный код - текст, который пишет человек и который потом правят, когда программа меняется. Байткод - список простых команд в промежуточной форме. На текст программы он не похож, и руками его обычно не редактируют. Компилятор складывает байткод в отдельные файлы. Исходный текст при этом остается на месте.
Дальше работает Java-машина. Она открывает файлы с байткодом и выполняет команды одну за другой. Выполняет она их уже средствами того компьютера, на котором установлена сама: просит процессор посчитать, просит систему прочитать файл, просит сеть отправить запрос. На Windows стоит своя сборка машины, на Linux своя, на macOS своя. Байткод для них общий. Одну и ту же скомпилированную программу переносят на другую систему, если там тоже установлена Java-машина.
На этом шаге Kotlin и Java совпадают. Машина видит байткод и выполняет его. Ей не важно, был исходный текст написан на Kotlin или на Java. Поэтому программы на обоих языках запускаются в одном месте. Поэтому же библиотека на Java и новый код на Kotlin могут работать вместе: до машины они доходят уже в одном виде.
Цепочку удобно держать целиком. Человек пишет исходный текст. Компилятор проверяет текст и получает байткод. Java-машина читает байткод и выполняет программу. Процессор и операционная система делают реальную работу, но команды для них составляет машина, а не автор программы.
Без установленной Java-машины байткод остается просто файлами. Сам он не стартует. Машина - обязательная часть запуска и для Kotlin, и для Java, а не дополнительная программа вокруг языка.
Расскажите своими словами, что такое Java-машина и почему это не отдельный компьютер.
Расскажите своими словами, зачем компилятор получает байткод, а не команды одного конкретного процессора.
Расскажите своими словами, почему одну и ту же скомпилированную программу запускают и на Windows, и на Linux, и на macOS.
Расскажите своими словами, что будет с файлами байткода, если Java-машина на компьютере не установлена.