2013-05-09 6 views
0

Надеюсь, об этом не спрашивали и не ответили уже, но у меня был быстрый вопрос о ARM.Компиляция ARM и GCC

В частности, если при компиляции Android (у которого много C и C++), вы используете GCC для компиляции, не создает код на основе x86? Как получается, что процессор ARM, который использует сокращенный набор команд, может интерпретировать этот код и работать так, как он есть?

Спасибо!

+0

Невозможно написать код ARM с компьютера x86 ... – kennytm

+0

Но это так, не так ли? Я никогда не знал о вашем вопросе, у моего приложения много кода на C++, и он отлично работает на ARM, я клянусь. –

ответ

3

GCC не только компилируется для x86. Он фактически компилируется в любой набор команд. Если бы вы хотели, чтобы вы могли создать новый, просто добавив несколько файлов.

И ARM не является сокращенным набором инструкций. Это совершенно другой набор команд. Есть некоторые вещи, которые ARM имеет, что x86 не делает и наоборот.

+2

«Сокращенный набор инструкций» является ссылкой на [Reduced Instruction Set Computing (RISC)] (http://en.wikipedia.org/wiki/Reduced_instruction_set_computing), в отличие от [Complex Computing Set Computing (CISC)] (http: //en.wikipedia.org/wiki/Complex_instruction_set_computing). –

+0

Хорошо, поэтому при компиляции по умолчанию будет x86, поскольку большинство людей будут использовать GCC для запуска программ на C в Windows/Linux/независимо, но если вы укажете, что вы хотите, чтобы он работал на ARM, он сделает соответствующую сборку/машину код для этого. Спасибо за разъяснение! –

+1

Eh, RISC и CISC сейчас практически не имеют смысла. x86 имеет набор команд CISC, который уменьшает набор микросхем RISC. И у ARM есть тонна инструкций, которые не попадают в модель RISC. Они более полезны в качестве места для обсуждения концепций дизайна, чем сейчас. –

3

Здание gcc проходит через конфигурацию шаг, часть этого является указанием back-end. Основание отвечает за генерацию op-code. Типичным компилятором является множество фаз. Вкратце,

  1. Parser - преобразовать текст в представление данных.
  2. Передняя часть - оптимизируйте, изменив конструкцию кода, возможно, специфичную для языка.
  3. Среднее значение - Выполняет Информатика Оптимизация, которая является общей для любого компилятора.
  4. Задний конец - Выполняет оптимизацию, специфичную для целевого ЦП.

См. stackoverflow compiler wiki для получения дополнительной информации.

Итак части один к три являются общими для x86 и ARM версий gcc (или любого НКИ). Компилятор Android - это версия gcc, которая была сконфигурирована для генерации ARM. Это другой компилятор, чем тот, который обычно работает на x86. Возможно, вы запускаете эмулятор ARM на ПК, а затем считаете, что этот код работает x86. Однако это код virtual ARM machine, запускающий этот код. Процессор x86 не может запустить ARM код изначально.

Android gcc ARM настроен gcc. A нормальный Распределения Linuxgcc настроен для x86 или x86_64.


Что-то отсутствует выше: Кто компилирует компилятор? В обоих случаях компилятор компилятора x86 компилирует новый компилятор. Разница заключается в выбранном back-end.Один из них - x86, другой ARM. Оба компилятора работают на x86, но они генерируют код для разных целей . Gcc может только сгенерировать код для ARMили a x86; никогда не с помощью какого-либо переключателя командной строки. Компилятор build обычно относится к трем различным типам процессоров.

  1. - Машина, на которой построен компилятор. Это компилятор компилятора.
  2. Хост - машина, на которой работает компилятор. Это не выход, а сам компилятор.
  3. Target - аппарат back-end целей. Создается один код.

Я думаю, что, может быть, люди думают, потому что они оба работают на тот же хост , они должны генерировать код для тех же целей . Но это неправда; это немного ума, изгибающегося сначала. В зависимости от настройки вам могут понадобиться компиляторы для каждой из этих машин, чтобы составить окончательный компилятор.

Первым компилятором для любой машины обычно является кросс-компилятор. За исключением некоторых людей, которые давно создали примитивные компиляторы в ассемблере.

См. Также: Cross compiler.

1

Проще говоря, когда вы строите ARM на своем компьютере x86, вы используете кросс-компилятор - компилятор, который работает на одной платформе, но генерирует код для другого. Это чрезвычайно распространено при разработке для встроенных или мобильных платформ.

Смежные вопросы