Компиляторы и наборы инструкций

«C — это язык общего назначения, не привязанный к конкретной системе». Язык программирования C, BRIAN W KERNIGHAN & DENNIS M. RITCHIE.

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

Итак, мой вопрос: каждый процессор x86-64 (Intel или AMD) использует один и тот же набор инструкций? (да, я мог бы провести сравнение...) если нет, то мне придется предположить, что компилятор определяет, какой ЦП мы используем, и использует правильный набор инструкций во время компиляции.

Я совсем ошибаюсь?

Я едва знаю, о чем говорю, поэтому, пожалуйста, потерпите меня. Просто чувак пытается заглянуть под капот.

Спасибо


person Nalda Oudas    schedule 12.12.2017    source источник
comment
Очень грубо сказано: да, все процессоры x86-64 (Intel или AMD) используют один и тот же набор инструкций.   -  person Jabberwocky    schedule 12.12.2017
comment
Учитывая, что Windows также работает на ARM, с правильным компилятором мы можем создать .exe, который будет работать на каждом компьютере с Windows, что, в свою очередь, означает, что на каждом процессоре, на котором работает Windows, это неверно. Один и тот же собственный исполняемый файл не может работать как в Windows/ARM, так и в Windows/x86-64.   -  person sepp2k    schedule 12.12.2017
comment
Надо было написать 32 и 64 битные процессоры   -  person Nalda Oudas    schedule 12.12.2017
comment
Я не понимаю путаницы. Язык/код не привязан к какой-либо конкретной системе. Двоичный файл, который вы компилируете для определенного класса систем. Язык не эквивалентен вещам, скомпилированным конкретной реализацией этого языка.   -  person underscore_d    schedule 12.12.2017
comment
компилятор определяет, какой ЦП мы используем, и использует правильный набор инструкций во время компиляции. - нет, вы сообщаете компилятору о целевом ЦП с опцией компилятора. Машина, на которой вы компилируете, не определяет машину, на которую вы ориентируетесь для своего скомпилированного кода.   -  person nicomp    schedule 12.12.2017
comment
Каждый процессор x86-64 поддерживает подмножество инструкций с наименьшим общим знаменателем, то есть базовые скалярные инструкции плюс все, вплоть до SSE2. Некоторые компиляторы либо автоматически или по указанию сделать это либо компилируют для заданного процессора, или определить ЦП, на котором запущен компилятор, и скомпилировать специально для него, или скомпилировать несколько версий для разных ЦП и добавить дополнительный код в исполняемом файле, чтобы определить ЦП машины и решить, какую версию запускать *во время выполнения*. Это очень сильно зависит от компилятора и опций, которые вы ему даете.   -  person Iwillnotexist Idonotexist    schedule 12.12.2017
comment
Система — это больше, чем ЦП, она включает в себя память, ввод-вывод и различную специфическую для реализации архитектуру. Windows - это не платформа, это ОС. Даже использование одного и того же набора инструкций может иметь разные результаты, особенно при вводе-выводе.   -  person chux - Reinstate Monica    schedule 12.12.2017


Ответы (1)


Intel производит множество различных моделей процессоров, которые используют базовый набор инструкций семейства «x86-64» (и дополнительные модели процессоров, которые этого не делают). Даже среди процессоров с общими инструкциями ядра есть вариации. Более новые модели могут иметь инструкции, которых не было в старых моделях, и некоторые части набора инструкций могут быть на одних моделях, а не на других.

Некоторые инструкции даже ведут себя по-разному на разных процессорах.

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

Часто настройка по умолчанию для цели компилятора — это либо модель процессора, подобная той, на которой вы работаете, либо какой-то типичный набор подмножеств инструкций, характерный для современных моделей процессоров. Цель также может быть выбрана на основе других настроек, которые вы задаете компилятору, например, запрашивая его для конкретной версии операционной системы. Однако вы можете передать переключатели компилятора, чтобы он компилировался для совершенно других целей, даже для совершенно разных архитектур, например, компиляция для процессора ARM при работе на процессоре Intel.

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

person Eric Postpischil    schedule 12.12.2017