Чем создание JVM под конкретные платформы «лучше», «проще», «продвинутее», «правильнее» написания компиляторов под те же платформы?
=====================================================================================================================================

 В книгах и статьях о языке программирования Java всегда говорится о том, что идея компиляции байт-кода, который исполняет строго стандартизованная JVM, решила проблему переносимости, платформонезависимости, программ.   

Мол, вместо того, чтобы писать компилятор для каждой платформы, что достаточно сложно и затратно, теперь достаточно написать виртуальную Java-машину для каждой платформы, что, подразумевается, гораздо проще. При этом я ни разу не встречал объяснения: а чем, собственно, проще?:) 

 Упрощения для разработчиков инструментальных средств - это тема очень непростая. Намного легче объяснить плюсы с позиции прикладного программиста и пользователей ПО. В 2003-м году я участвовал в разработке одной системы на Java EE. Написанный мной и другими разработчиками код был скомпилирован с помощью Java 1.4, упакован в war и развёрнут на сервере заказчика. Это был сервер с 32-битными процессорами Xeon Prestonia, работавший под управление FreeBSD. Позже это приложение в том же war-файле было перенесено на сервер Fujitsu PRIMEPOWER с процессорами абсолютно иной архитектуры - SPARC, и управляемый очень отличающейся операционной системой - Solaris. Сейчас оно крутится на IBM'овских блэйдах c процами POWER и под управлением AIX, на сколько мне известно. Не удивлюсь, если через некоторое время приложение перенесут на что-нибудь с ARM'ами и под Linux или HP-UX. Все эти миграции выполняются без перекомпиляции и без привлечения разработчиков. Если бы приложение было написано на чём-нибудь вроде C++, код приложения пришлось бы портировать на каждую платформу и перекомпилировать. Это было долго, сложно и очень дорого. 

 В теории, проще тем, что не нужно каждую программу перекомпилировать под все платформы. Ты получаешь один файл для каждой программы и запускаешь его везде, где есть jvm. Если разработчик программы с закрытыми исходниками не скомпилировал её под твою платформу, то ты эту программу никогда не запустишь.  

На практике всё не так радужно, конечно. 

![5d258f7036002830560220.png](https://habrastorage.org/webt/5d/25/8f/5d258f7036002830560220.png)  

Чтобы портировать например OpenJDK на любую платформу, потребуется изменить максимум 1% платформозависимого кода. Портирование чего-нибудь вроде GCC требует существенно большего количества работы.