Компилятор имеет ассемблер также?

Мое понимание - то, что компилятор преобразовывает высокоуровневый язык в машинный код. У меня есть вопрос относительно того, использует ли компилятор (говорят, что VC ++) внутренний изгиб ассемблер также? Я не забываю видеть ассемблерный код, каждый раз, когда существует катастрофический отказ или что-то как этот.

5
задан Ben Gartner 20 June 2010 в 17:54
поделиться

5 ответов

Это зависит от компилятора; многие компиляторы могут компилироваться в сборку. Например, если вы передадите gcc флаг '-S', например:

gcc -S -o test.S test.c

Это выведет сборку для вашего файла test.c в файл test.S, который вы можете просмотреть. (Я рекомендую использовать -O0, если вы собираетесь читать сборку, потому что оптимизация компилятора, скорее всего, запутает вас до чертиков).

Поскольку вы упомянули Visual C ++ в своем вопросе, Пол Диксон указывает ниже, что Visual C ++ использует флаг / FA для достижения той же цели.

5
ответ дан 13 December 2019 в 22:01
поделиться

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

  1. Создавать машинный код напрямую, включая серверные части для каждого набора инструкций.
  2. Создание языка ассемблера, который передается внешнему ассемблеру. Это то, что делает gcc. В конце концов, почему бы не использовать существующие ассемблеры? Непосредственная генерация кодов операций - это боль.
  3. Сгенерировать низкоуровневую промежуточную форму кода, такую ​​как байт-код LLVM , который преобразуется в машинный код. LLVM - находка для разработчиков компиляторов, потому что он обрабатывает огромное количество оптимизаций и поддерживает множество серверных приложений, позволяя вам писать на более высоком уровне, чем сборка.
  4. Преобразуйте код в язык вроде C, а затем передайте его другому компилятору. Facebook делает это с PHP : они компилируют его в C ++, а затем используют gcc для компиляции в сборку, которая собирается в собственный код GNU как.

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

3
ответ дан 13 December 2019 в 22:01
поделиться

Компилятор переходит непосредственно к машинному коду.

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

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

1
ответ дан 13 December 2019 в 22:01
поделиться

Большинство компиляторов будут иметь возможность просматривать листинг сборки

  • VC можно указать, чтобы он выводил листинг ассемблера с помощью / FA
  • с помощью gcc, используйте переключатель -S
1
ответ дан 13 December 2019 в 22:01
поделиться

Компилятор переводит некоторый язык программирования высокого уровня на некоторый язык более низкого уровня (как машинный код, ассемблер или даже другой язык высокого уровня, например, с Vala на C, или с uC++ на C++).

Не знаю, как VC++, но большинство компиляторов, как GNU GCC, не содержат ассемблера, а вызывают внешнюю программу-ассемблер (как NASM, или GNU AS).

Cheers

0
ответ дан 13 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: