Я не знаю настоящих причин, так как не участвовал в реализации JVM, но могу придумать некоторые правдоподобные:
- Идея Java состоит в том, чтобы быть языком с возможностью однократной записи и запуском в любом месте, и размещение предварительно скомпилированного материала в файле класса является своего рода нарушением этого (только «своего рода», потому что, конечно, фактический байтовый код все еще будет там)
- Это увеличило бы размеры файлов классов, потому что у вас был бы один и тот же код там несколько раз, особенно если вы запускаете одну и ту же программу на нескольких разных JVM (что на самом деле не редкость, если вы считаете разные версии разными JVM, которые вы действительно нужно сделать)
- Сами файлы классов могут быть недоступны для записи (хотя это довольно легко проверить)
- Оптимизация JVM частично основана на информации о времени выполнения, а при других запусках они могут быть неприменимы (хотя они все равно должны давать некоторые преимущества)
Но я на самом деле предполагаю, и, как вы видите, я не думаю, что какие-либо из моих причин действительно мешают шоу. Я полагаю, что Sun просто не считает эту поддержку приоритетной, и, возможно, моя первая причина близка к истине, поскольку выполнение этого обычно может также привести людей к мысли, что файлам классов Java действительно нужна отдельная версия для каждой виртуальной машины, а не кроссплатформенность.
На самом деле я предпочитаю иметь отдельный переводчик байт-кода в собственный, который вы могли бы использовать для выполнения чего-то вроде этого заранее, создавая файлы классов, которые явно созданы для конкретной виртуальной машины, возможно, с исходным байт-кодом в них, чтобы вы также может работать с разными виртуальными машинами. Но это, вероятно, исходит из моего опыта: я в основном занимаюсь Java ME, и мне очень больно, что компилятор Java не умеет компилировать.