Прежде всего, стоит отметить, что JVM от Sun была написана на языке C. Язык C очень популярен, когда требуется переносимость.
C язык является переносным , хотя многие C программа не является. Это потому, что C не накладывает столько ограничений на программиста и не делает столько предположений. Если программист на Си хочет, чтобы его программы были переносимыми, он должен наложить эти ограничения на себя.
На практике это на самом деле не намного сложнее, чем жить с ограничениями, которые на вас навязывает Java. Это в основном вопрос того, чтобы помнить о вашем порядке байтов и примитивах и использовать переносные библиотеки, такие как GTK +, вместо библиотек, специфичных для платформы.
Вы можете создать компилятор GTK + target и C, который поддерживает виртуальную машину, даже, возможно, JVM, и заставить существующий код работать с очень небольшими изменениями. На самом деле, без сборки мусора виртуальная машина C, вероятно, была бы намного проще. Почему вы хотите, хотя?
Обратное, компиляция Java в нативный код, также выполнимо. Это в основном то, что делает JIT. Почему вы хотите, хотя? Я уверен, что есть любимые проекты, чтобы сделать это «просто потому что», но они не используются серьезно.