Какие факторы влияют на необходимый компилятор?

Я изучаю C и не понимаю, какие факторы определяют нужный компилятор и почему.

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

  1. Как набор инструкций влияет на то, какой компилятор нужен? Зависит ли это от фактического набора инструкций или только от размера его регистра (16/32/64 бита)? Если это зависит только от того, является ли он 64-битным или 32-битным, не может ли набор инструкций выглядеть по-другому и, таким образом, машинный код не работает? Меня это смущает, потому что всегда предлагаются 32-битные и 64-битные версии приложения, хотя существует несколько возможных наборов инструкций.

  2. Влияет ли ОС, работающая поверх определенного набора инструкций, на то, какой компилятор необходим и почему? Разве машинный код не один и тот же, если процессор тот же?


ОБНОВЛЕНИЕ

Спасибо всем, кто ответил. Мой окончательный вывод


person MinecraftShamrock    schedule 05.08.2014    source источник


Ответы (3)


Как набор инструкций влияет на то, какой компилятор нужен?

Компилятор должен создавать другие инструкции, если у процессора другой набор инструкций. Большинство компиляторов поддерживают несколько наборов инструкций, поэтому вам может не понадобиться менять компилятор только потому, что меняется набор инструкций.

Зависит ли это от фактического набора инструкций или только от размера его регистра (16/32/64 бита)?

Оба.

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

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

Влияет ли ОС, работающая поверх определенного набора инструкций, на то, какой компилятор необходим и почему? Разве машинный код не один и тот же, если процессор тот же?

Набор инструкций тот же, но способ общения с операционной системой другой. В принципе, вы можете запустить приложение Windows в Linux, если они оба работают с одним и тем же набором инструкций, однако приложение скажет: «Windows открывает этот файл», и Linux понятия не имеет, что делать. Проект wine заполняет пробел и запускает приложения Windows под Linux, переводя "windows open this file" на "linux open тот файл», который усложняется, если необходимо реализовать больше конкретных функций Windows.

person nwp    schedule 05.08.2014
comment
Таким образом, процессоры Intel и AMD, помеченные как 64-битные, скорее всего, будут иметь набор инструкций x64? - person MinecraftShamrock; 05.08.2014
comment
@MinecraftShamrock У них одинаковый базовый набор инструкций. Они немного отличаются в таких вещах, как инструкции SSE, но это обычно обнаруживается во время выполнения. Существует IA64 от Intel с другим набором инструкций, поэтому Intel/AMD x64 не гарантия совместимости. - person nwp; 05.08.2014
comment
И когда эти различия обнаружены, может ли операционная система компенсировать эти различия? Скажем, у нас есть ссылка для загрузки приложения для 64-битной Windows 7, одинаково ли оно скомпилировано для Intel x64 или AMD x64, потому что ОС компенсирует это? И, как вы упомянули выше, могут ли эти компиляторы, поддерживающие несколько наборов инструкций, создавать приложения, совместимые с обоими? - person MinecraftShamrock; 05.08.2014
comment
@MinecraftShamrock ОС не участвует в компенсации. Компилятор создает инструкции, которые работают на любом x86, включая инструкции для проверки существования расширений, и если да, то он использует некоторые из них. Как правило, вы компилируете для общего x86, но вы также можете компилировать для определенного процессора, что немного ускоряет выполнение, поскольку вам не нужны проверки функций, но происходит сбой всякий раз, когда вы используете немного другой процессор. - person nwp; 05.08.2014
comment
Хорошо, я вижу. Так что это зависит от ОС, набора инструкций и размера регистра ЦП. Однако универсальные компиляторы работают с разными наборами инструкций одного семейства. Правильно ли я понимаю это сейчас? - person MinecraftShamrock; 05.08.2014
comment
@MinecraftShamrock Мне кажется, это правильно. Я бы заменил универсальные компиляторы, работающие с разными наборами инструкций, на универсальные компиляторы, которые можно заставить работать с тесно связанными наборами инструкций. - person nwp; 05.08.2014

  1. Это определенно зависит от машины, на которой будет работать ваша программа. Не только на 8/16/32/64 регистрах, но и (что более важно) на самом наборе инструкций. Если вы попытаетесь запустить 32-битную программу x86 на 32-битном процессоре ARM, конечно, она не сработает. Это просто потому, что машинный код очень специфичен для каждой архитектуры и, таким образом, определяет, какой бит что делает/означает. Несмотря на то, что длина некоторых инструкций может быть одинаковой, порядок операндов может быть другим, или определенные биты могут иметь разные значения, или (весьма вероятно) сами коды операций могут быть совершенно другими. Следовательно, MOV на x86 может также иметь тот же код операции, что и BLOWUPTHEWORLD на другой архитектуре. Вот почему для каждой архитектуры существуют специальные компиляторы. Встроенные системы (подумайте обо всем, от контроллера самолета до RaspberryPis и AVR, управляющих игрушечными машинками) имеют разные компиляторы практически для каждого семейства процессоров/микроконтроллеров.

    Отличия, отличные от 32- и 64-битных, которые вы видите в большинстве приложений, в некоторой степени скрыты операционной системой, потому что одна из задач ОС заключается в предоставлении абстракций (подумайте о системных вызовах, таких как opening файл) независимо от того, что это означает внутри ( с точки зрения низкоуровневых инструкций). 32-битная и 64-битная — это разница, которую не может скрыть даже операционная система.

  2. да. Подумайте о динамических библиотеках. Библиотеки Microsoft, безусловно, не будут работать в Linux, если только кто-нибудь не расшифрует их вручную. И наоборот, общие объекты (.so) в Linux не будут работать в Windows просто потому, что они построены совершенно по-другому.

person webuster    schedule 05.08.2014
comment
Таким образом, ОС позволяет приложению не заботиться о разных версиях x64 или x86? - person MinecraftShamrock; 05.08.2014
comment
x86 определяет набор инструкций и обратно совместим вплоть до древнего Intel 8086. Приложение может быть скомпилировано с помощью обычного компилятора x86, и ему все равно, какая машина работает под ним. Если вы хотите использовать расширения x86, вам понадобится специальный компилятор, знающий о преимуществах этих расширений. - person webuster; 05.08.2014
comment
Хорошо. Так верно ли это предположение? stackoverflow.com/questions/ 25138294/ - person MinecraftShamrock; 05.08.2014
comment
Я не вижу в этом проблемы. - person webuster; 05.08.2014

Все упомянутые вами факторы важны для выбора компилятора. Набор инструкций, ABI, включая размер регистра, операционная система, которую вы пытаетесь развернуть, и на которой вы хотите запустить компилятор. Вы можете запускать разные операционные системы на одном компьютере (например, купить iMac и установить MacOS, несколько разновидностей Linux, несколько Unix или Windows), поэтому одного ЦП недостаточно, чтобы решить, какой компилятор вам нужен. Иногда вы можете использовать один и тот же компилятор, но вам просто нужен другой набор файлов заголовков, которые обеспечивают доступ к возможностям вашей операционной системы.

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

person uliwitness    schedule 05.08.2014