На самом глубоком уровне это означает, что наборы команд различаются. Пропуск определенной последовательности битов через процессор x86 даст вам совершенно другие результаты, чем если бы вы поставили тот же набор битов, скажем, через процессор ARM.
Языки более высокого уровня "преодолевают" это, потому что все компьютеры делают одно и то же, просто по-разному. В ARM есть способы сложения двух чисел, как в x86, в способе загрузки данных из ОЗУ в регистры (и наоборот), как в x86 и т. Д.
Все высокоуровневые конструкции в конечном итоге могут быть сведены к фундаментальному набору операций, которые могут выполняться всеми машинами общего назначения (хотя некоторые конструкции могут оказаться более эффективными на некоторых процессорах, чем на других).
Это то, что делают компиляторы. Они анализируют язык высокого уровня и, так или иначе, сводят его к машинному языку целевой системы. Часто только новые биты компилятора должны быть записаны заново для нового процессора. Некоторые компиляторы (GCC - отличный пример) встроены в слои, которые значительно упрощают эту работу. Один высококвалифицированный разработчик, знакомый с компиляторами и целевой платформой, может довольно легко создать элементарный порт.
Выше уровня простого приведения конструкций к собственному машинному языку существуют, конечно, такие проблемы, как ввод / вывод, доступ к файловой системе и т. Д. Они также обычно обрабатываются в слоях, часто только с самыми низкими уровнями драйверы - переписываются для новой платформы, поддерживая согласованный интерфейс с верхними уровнями.
И даже драйверы часто могут быть общими, частично или полностью, для разных типов машин! Платформы x86 - не единственные, которые имеют, например, шину PCI. И даже там, где шина отличается, подключенные к ним устройства часто оказываются одинаковыми. Linux разделяет несколько драйверов устройств на несколько типов машин практически без изменений. Компилятор обрабатывает детали перевода в машинный код, и чем больше внутренних уровней ядра пытается абстрагироваться от других поведенческих различий, которые они могут, то автору драйвера просто нужно придерживаться установленных интерфейсов.
После этого вы сталкиваетесь с вопросами о том, имеет ли в рамках данной платформы какая-либо конкретная система определенные дополнительные устройства (или категории устройств). Например, для большинства серверов было бы глупо иметь 3D-ускорители. Некоторые системы могут иметь аппаратный генератор случайных чисел, а некоторые нет. Некоторые могут не иметь фиксированного хранилища. Однако, безоговорочно, «машинная зависимость» обычно не направлена на этот уровень зависимости.