Я читал этот вопрос, чтобы узнать различия между виртуальной машиной Java и .NET CLR и ответом Бенджи, и мне стало интересно, почему виртуальные машины необходимы в первое место.
Из моего понимания объяснения Бенджи, JIT-компилятор виртуальной машины интерпретирует промежуточный код в фактическом коде сборки, который выполняется на процессоре. Причина этого заключается в том, что у процессоров часто бывает разное количество регистров, и, по словам Бенджи, "некоторые регистры являются целевыми, и каждая команда ожидает своих операндов в разных регистрах". Это имеет смысл тогда, когда существует потребность в промежуточном интерпретаторе, таком как виртуальная машина, чтобы один и тот же код мог быть запущен на любом процессоре.
Но если это так, то я не понимаю, почему код C или С++, скомпилированный в машинный код, может запускаться на любом компьютере, если он является правильной ОС. Почему тогда программа C, которую я скомпилировал на своей машине Windows, используя Pentium, сможет работать на другой машине Windows с помощью AMD?
Если код C может работать на любом процессоре, то какова цель виртуальной машины? Это значит, что один и тот же код можно запускать на любой ОС? Я знаю, что Java имеет версии VM практически на любой ОС, но есть ли CLR для других ОС помимо Windows?
Или есть что-то еще, что мне не хватает? Описывает ли ОС какую-либо другую интерпретацию кода сборки, которую она запускает, чтобы адаптировать ее к конкретному процессору или что-то в этом роде?
Мне очень любопытно, как все это работает, поэтому ясное объяснение получило бы высокую оценку.
Примечание. Причина, по которой я не просто публиковать свои запросы в комментариях в вопросе JVM vs. CLR, состоит в том, что у меня недостаточно очков для отправки комментариев. = b.
Редактировать: Спасибо за все замечательные ответы! Поэтому мне кажется, что мне не хватало того, что, хотя у всех процессоров есть различия, существует стандартная стандартизация, в первую очередь архитектура X86, которая обеспечивает достаточно большой набор общих функций, так что код C, скомпилированный на одном процессоре X86, будет работать по большей части на другом процессоре X86. Это способствует обоснованию виртуальных машин, не говоря уже о том, что я забыл о важности сбора мусора.