Я кодирую ОС или Процессор?
Говорят, что с помощью 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 С++. Нет ссылок на ОС Windows для оконных систем или других библиотек.
Благодаря
Ответы
Ответ 1
И; вид.
Фактические инструкции на самом деле не отличаются друг от друга в Windows и Linux, поскольку они скомпилированы для единой архитектуры процессора (x86).
Однако двоичный код - это больше, чем просто код, который работает на голом оборудовании. Например, он также содержит информацию, которая сообщает операционной системе, как загрузить исполняемый файл и его зависимости. Бинарный файл упакован в определенном формате. Этот формат может быть разным в разных операционных системах.
Кроме того, операционная система предоставляет некоторые услуги приложениям (через системные вызовы и API). Услуги, предоставляемые операционными системами, и способ их использования варьируются от операционной системы к другой.
Эти причины способствуют тому, что большую часть времени собственный бинар зависит от архитектуры ОС и ЦП, скомпилированной для нее.
Ответ на обновленный вопрос:
Стандарт С++ не требует ничего о природе скомпилированной цели. Он просто указывает требования совместимости на уровне источника. Следовательно, если вы придерживаетесь стандартных библиотек, вы сможете использовать тот же исходный код для компиляции на платформах, которые предлагают соответствующую реализацию на С++. В стандарте ничего не говорится о бинарной переносимости. Как я уже упоминал выше, примитивные системные вызовы, которые предоставляют операционные системы, могут различаться, и фактическая реализация стандартной библиотеки зависит от способа предоставления этих системных вызовов ОС.
Чтобы запустить двоичный файл Windows в Linux, вам нужно использовать некоторую эмуляцию типа Wine, которая понимает двоичный формат Windows и имитирует Windows API для приложений.
Ответ 2
1) Архитектура процессора (плюс целевые библиотеки статические или динамические)
2) Да
32-битное приложение Windows будет работать на платформе Windows 64 бит WOW.
Ответ 3
Если ваша целевая архитектура компилятора (windows) - x86 (32-разрядная), то она может работать на любой 32-битной и 64-битной Windows 7. Но если ее x86-64, она будет работать только на 64-битной Windows 7.
Ответ 4
Чтобы ответить на заголовок конкретно, вы кодируете для обоих.
Исполняемый файл содержит машинный код, специфичный для процессора, и множество метаданных для ОС о том, как загружать/выполнять программу, которая относится к ОС.
Код может также (и обычно) содержать вызовы функций, определенных ОС. И поэтому, хотя это просто совершенно обычный машинный код, который понимает любой совместимый процессор, он пытается вызвать код, который существует только в Windows.
Так что "родной" действительно означает и то, и другое. Вы кодируете конкретную ОС (и все совместимые ОС) и конкретный процессор (и все совместимые процессоры).
В случае Windows вы обычно нацеливаетесь на определенную версию Windows, и тогда программа будет работать над этой и будущими версиями Windows.
для процессора, на котором выполняется Windows (и ваша программа), исполняемый файл содержит машинный код x86, который может быть выполнен на любом процессоре x86, будь то от Intel, AMD, Via или кто бы то ни было сделал совместимые процессоры над лет.
Ответ 5
Не имея возможности увидеть ваш код, вы можете сказать нам, кодируете ли вы 32-разрядную или 64-битную платформу, например, если вы переинтерпретируете указатель на 32-битный int, затем вернитесь к указателю, вы кодируете 32-разрядную версию, тогда как если вы используете такой тип, как int_ptr
, вы уверены, что ваш код скомпилирован для 32 или 64-разрядных машин. Точно так же, кодирование для настольных компьютеров Windows, ваше кодирование может принимать окончание машины.
Если в вашем примере вы скомпилируете этот код для 32-разрядной Windows 7, то он также будет работать на 64-битной Windows 7. Если вы используете функции Windows 7, это не будет работать в более ранних версиях. Microsoft очень хороша в обратной совместимости, поэтому, вероятно, она будет работать в более поздних версиях.
Ответ 6
Короткий ответ: Нет.
Дольше: когда вы компилируете "собственный код", вы компилируете для конкретной архитектуры процессора; MIPS, ARM, x86, 68k, Sparc и так далее. Эти архитектуры могут иметь длину слова 8, 16, 32 и 64 (есть исключения). Кроме того, эти архитектуры могут иметь расширения от поколения к поколению, такие как MMX, SSE, SSE2, Neon и т.д.
Также вам нужно рассмотреть операционную систему и библиотеки, которые вы можете использовать, и различные соглашения о вызовах.
Итак, нет никакой гарантии. Но если вы компилируете с MSVC в Windows 7, то почти гарантированно будет работать в Windows 7. Я думаю, что он существует только для x86 на данный момент.