Компилятор C компилируется в общую сборку? - PullRequest
6 голосов
/ 26 сентября 2011

Я нахожусь в классе компьютерной организации, и мы программируем вещи на ассемблере. Однако, поскольку это класс, я не получаю более широкого представления о чем-либо или о реальном использовании. Мы используем язык ассемблера Nios II от Altera. Профессор ничего не сказал нам о том, какие языки ассемблера используются в текущем производстве, и какова семантика, или как код C компилируется во ВСЕ языки ассемблера.

После этого краткого вступления я прав, полагая, что существует несколько языков ассемблера, на которые компилируется код C? Если так, что он делает, чтобы охватить все эти языки ассемблера - проанализировать его на общий язык ассемблера и затем перевести его оттуда? Или для каждого языка ассемблера существует отдельный процесс?

Ответы [ 2 ]

7 голосов
/ 26 сентября 2011

Нет необходимости компилировать C для каких-либо конкретных сборок или сборок вообще, они оставлены на усмотрение разработчика компилятора и не являются частью спецификации языка.Как правило, каждый производитель ЦП разрабатывает компилятор C для своей конкретной архитектуры.

Однако существуют более общие компиляторы, такие как GCC и Clang, которые могут работать со многими различными наборами команд.

Чтобы использовать Clang в качестве примера, он основан на Низкоуровневой виртуальной машине , которая является абстрактной машиной с языком «промежуточного представления», LLVM IR.Для каждой архитектуры пишется серверная часть, на которую может ориентироваться LLVM для преобразования IR LLVM в набор команд, а затем любой компилятор, который компилирует в IR LLVM, может затем ориентироваться на процессоры, поддерживаемые LLVM.

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

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

3 голосов
/ 26 сентября 2011

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

Обратите внимание, что если вы пишете прямой ассемблер внутри своего кода C (например, вы пишете аппаратный драйвер на C, но вам нужно сделать что-то очень низкоуровневое), то вы заблокировали свой код дляязык ассемблера этой конкретной платформы.C (и компилятор) NOT возьмет некоторый код со встроенным ассемблером x86 и переведет его в (скажем) MIPS или PPC.

...