Линейка процессоров Intel и AMD в целом имеет большое совпадение в наборе команд, которые они реализуют (например, иногда один изобретает что-то новое, и существует разрыв, пока другая компания не догонит) - вот почему вы можете запускать программы на обеих архитектурах. По той же причине вы не можете запустить его на других архитектурах ЦП - у них нет одинакового набора команд для начинающих, но есть много разных вещей.
Операционные системы также имеют свои отличия. Например, когда вы компилируете программу под Windows, вы обычно получаете файл .exe. Этот .exe имеет формат, который понимает только Windows, и сильно отличается от формата, используемого Linux, например.
Кроме того, поддержка, предоставляемая ОС, совершенно иная - в Windows есть разные функции ядра, которые вы можете вызывать по сравнению, например, с. OpenBSD. Даже на более абстрактных уровнях это несовместимо. Например. Windows использует буквы дисков, такие как C: \, D: \ и т. Д., Чтобы пометить диски, например, под Linux это одна большая файловая система, где вы монтируете разные разделы, например под / media или около того.
Существуют различные попытки, такие как Wine и Cygwin, выполнять программы с одной платформы на другой. Используя Wine, вы можете запускать исполняемые файлы Windows непосредственно в Linux, поскольку он пытается эмулировать то, что предоставляет Windows (хотя не все работает). Cygwin - это другой продукт - вы можете запускать программы Windows, которые работают аналогично программам GNU в Linux, но их нужно специально скомпилировать - просто давая вам подсказку, что это всего лишь два мира.
Именно поэтому Java и .NET (с поддержкой Mono в Linux) пытаются объединить эти два понятия. Когда вы создаете Java-приложение, вы должны иметь возможность запускать его в Linux с более или менее одинаковым кодом - некоторые вещи могут не совпадать, но большинство есть.