Зависимость C-программы от CPU и OS - PullRequest
1 голос
/ 17 ноября 2010

Давайте подумаем о простой программе на С, скомпилированной в Windows.

  1. Я могу скомпилировать программу на процессорной машине Intel и запустить ее на процессорной платформе AMD (той же операционной системы). Значит ли это, что набор команд CPU одинаков?

  2. Почему одна и та же программа не запускается на компьютере с другой ОС и тем же процессором?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2010

Линейка процессоров 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 с более или менее одинаковым кодом - некоторые вещи могут не совпадать, но большинство есть.

0 голосов
/ 17 ноября 2010

1) Процессоры Intel и AMD специально созданы таким образом. Вы не можете бежать программа, скомпилированная, скажем, для процессора SPARC, скажем, на процессоре ARM.

2) Теоретически это возможно. Скажем, в Linux есть Wine для эмуляции Windows. Многие программы Windows прекрасно работают в Linux под Wine.

0 голосов
/ 17 ноября 2010

Они одинаковые или, по крайней мере, ваша программа использует только общее подмножество.

На ваш второй вопрос есть несколько общих причин:

  1. для разных ОС требуются разные форматы исполняемых файлов
  2. разные ОС обычно имеют разные функции для использования программой
  3. разные ОС используют разные способы вызова того, что они предоставляют
...