У компилятора тоже есть ассемблер? - PullRequest
5 голосов
/ 20 июня 2010

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

Ответы [ 5 ]

5 голосов
/ 20 июня 2010

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

gcc -S -o test.S test.c

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

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

3 голосов
/ 20 июня 2010

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

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

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

1 голос
/ 20 июня 2010

У большинства компиляторов есть возможность просмотра списка сборок.

  • VC можно вывести список ассемблера с / FA
  • с помощью gcc,используйте переключатель -S
1 голос
/ 20 июня 2010

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

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

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

0 голосов
/ 20 июня 2010

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

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

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...