Нет необходимости компилировать C для каких-либо конкретных сборок или сборок вообще, они оставлены на усмотрение разработчика компилятора и не являются частью спецификации языка.Как правило, каждый производитель ЦП разрабатывает компилятор C для своей конкретной архитектуры.
Однако существуют более общие компиляторы, такие как GCC и Clang, которые могут работать со многими различными наборами команд.
Чтобы использовать Clang в качестве примера, он основан на Низкоуровневой виртуальной машине , которая является абстрактной машиной с языком «промежуточного представления», LLVM IR.Для каждой архитектуры пишется серверная часть, на которую может ориентироваться LLVM для преобразования IR LLVM в набор команд, а затем любой компилятор, который компилирует в IR LLVM, может затем ориентироваться на процессоры, поддерживаемые LLVM.
Компилятор сам решит, какой бэкэнд нацелиться во время выполнения, на основе аргументов, которые вы ему передаете.У компилятора обычно есть серверная часть по умолчанию, которая устанавливается при сборке самого компилятора через конфигурацию (которая, вероятно, будет соответствовать архитектуре, на которой вы строите компилятор).
GCC, вероятно, использует аналогичный подходс некоторым промежуточным представлением, но я не уверен в деталях.Также имеется серверная часть GCC, которая также может работать с LLVM.