BartonFink, ну так вся сложность что для каждой новой архитектуры нужно будет писать свои компилятор, а так сама виртуальная машина будет конкретно переводить код. Код один, платформ много. А не как в си куча дефайнов и проверять каждый чих
Разные архитектуры процессоров, разные ос, инструкции и прочее. Чтоб упростить что либо, надо разделить сложное на мелкое, то есть есть машина и адаптер, адаптер как прослойка