Я пишу код для ОС или процессора? - PullRequest
15 голосов
/ 20 ноября 2010

Говорят, что с помощью C / C ++ можно писать «нативные» программы, которые работают на платформе. Меня смущает то, что считается родным - архитектура процессора или версия ОС?

Например:

У меня 32-разрядный процессор и Windows 7 (32-разрядная версия), и я компилирую и генерирую файл .exe. Это гарантированно работает на любой Windows 7 32 бит? (Win 7 32 бит на 32/64 битных машинах)

Edit1 : Я не собирался только ОС Windows здесь. Мой пример может быть распространен и на Linux. Например, создание исполняемого файла (по умолчанию a.out) в 32-разрядной ОС Linux, работающей на 32-разрядном процессоре, а затем запуск его на 32-разрядной ОС Linux на 64-разрядном процессоре.

Edit2 : Спасибо за ответы, но я также намеревался использовать стандартные библиотеки и функции - ничего не зависит от ОС. Только один раз, определенный стандартом ANSI или ISO C ++. Нет ссылок на конкретные оконные системы ОС или другие библиотеки. Спасибо

Ответы [ 6 ]

20 голосов
/ 20 ноября 2010

Оба; вид.

Фактические инструкции на самом деле не отличаются для Windows и Linux, поскольку они скомпилированы для архитектуры с одним процессором (x86).

Однако двоичный файл - это больше, чем просто код, работающий на голом оборудовании. Например, он также содержит информацию, которая сообщает операционной системе, как загрузить исполняемый файл и его зависимости. Двоичный файл упакован в определенном формате. Этот формат может быть различным в разных операционных системах.

Кроме того, операционная система предоставляет приложениям некоторые сервисы (через системные вызовы и API). Услуги, предоставляемые операционными системами, и способы их использования различаются в зависимости от операционной системы.

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


Ответ на обновленный вопрос:

Стандарт C ++ не требует ничего о природе скомпилированной цели. Он просто определяет требования совместимости на уровне источника. Следовательно, если вы будете придерживаться стандартных библиотек, вы сможете использовать тот же исходный код для компиляции на платформах, которые предлагают соответствующую реализацию C ++. Стандарт ничего не говорит о бинарной переносимости. Как я упоминал выше, примитивные системные вызовы, которые предоставляют операционные системы, могут различаться, и фактическая реализация стандартной библиотеки зависит от того, как ОС выполняет эти системные вызовы.

Чтобы запустить двоичный файл Windows в Linux, вам необходимо использовать какую-то эмуляцию, например Wine, которая понимает двоичный формат Windows и имитирует Windows API для приложений.

2 голосов
/ 20 ноября 2010

1) Архитектура процессора (плюс статические или динамические целевые библиотеки)

2) Да

32-битное приложение Windows будет работать на 64-битной платформе Windows как WOW .

1 голос
/ 20 ноября 2010

Чтобы конкретно ответить на заголовок, вы вводите код для обоих.

Исполняемый файл содержит машинный код, специфичный для процессора, и множество метаданных для ОС о том, как загрузить / выполнить программу,Это характерно для ОС.

Код также может (и обычно содержит) вызовы функций, определенных ОС.И поэтому, хотя это просто совершенно обычный машинный код, понятный любому совместимому ЦП, он пытается вызвать код, существующий только в Windows.

Так что «родной» означает в действительности оба.Вы кодируете для конкретной ОС (и всех совместимых ОС) и этого конкретного ЦП (и всех совместимых ЦП).

В случае Windows вы обычно выбираете конкретную версию Windows, и программа будетзатем работайте над этим и будущими версиями Windows.

для процессора, на котором работает Windows (и ваша программа), исполняемый файл содержит машинный код x86, который может быть выполнен на any x86Процессор, будь то Intel, AMD, Via или кто-то еще, кто сделал совместимые процессоры за эти годы.

1 голос
/ 20 ноября 2010

Если целевая архитектура вашего (windows) компилятора - x86 (32-битная), то он может работать на любой 32-битной и 64-битной Windows 7. Но если x86-64, он будет работать только на 64-битной Windows 7.

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

Краткий ответ: Нет.

Дольше: когда вы компилируете «собственный код», вы компилируете для конкретной архитектуры процессора;MIPS, ARM, x86, 68k, Sparc и так далее.Эти архитектуры могут иметь длину слова 8, 16, 32 и 64 (есть исключения).Также эти архитектуры могут иметь расширения от поколения к поколению, такие как MMX, SSE, SSE2, Neon и тому подобное.

Также вам необходимо учитывать операционную систему и какие библиотеки вы можете использовать, а также различные соглашения о вызовах.

Таким образом, нет никаких гарантий.Но если вы компилируете MSVC в Windows 7, он почти будет гарантированно работать в Windows 7. Я думаю, что он существует только для x86.

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

Не имея возможности увидеть ваш код, только вы можете сказать нам, кодируете ли вы для 32-битной или 64-битной платформы - например, если вы повторно интерпретируете указатель на 32-битный тип int, а затем обратно на указатель, вы кодируете для 32-битного, тогда как если вы используете тип, такой как int_ptr, вы можете быть уверены, что ваш код скомпилирован для 32- или 64-битных машин. Точно так же кодирование для рабочих столов Windows, кодирование которого может предполагать постоянство машины.

Если, как в вашем примере, вы скомпилируете этот код для 32-битной Windows 7, он также будет работать на 64-битной Windows 7. Если вы используете функции Windows 7, он не будет работать на более ранних версиях. Microsoft очень хорошо справляется с обратной совместимостью, поэтому она, вероятно, будет работать на более поздних версиях.

...