Мое понимание - то, что компилятор преобразовывает высокоуровневый язык в машинный код. У меня есть вопрос относительно того, использует ли компилятор (говорят, что VC ++) внутренний изгиб ассемблер также? Я не забываю видеть ассемблерный код, каждый раз, когда существует катастрофический отказ или что-то как этот.
Это зависит от компилятора; многие компиляторы могут компилироваться в сборку. Например, если вы передадите gcc флаг '-S', например:
gcc -S -o test.S test.c
Это выведет сборку для вашего файла test.c в файл test.S, который вы можете просмотреть. (Я рекомендую использовать -O0, если вы собираетесь читать сборку, потому что оптимизация компилятора, скорее всего, запутает вас до чертиков).
Поскольку вы упомянули Visual C ++ в своем вопросе, Пол Диксон указывает ниже, что Visual C ++ использует флаг / FA для достижения той же цели.
Обычно компилятор переводит один язык на другой. Большинство компиляторов нацелены на машинный код; вот наиболее распространенные способы сделать это, в порядке от низшего уровня к высшему:
Если вы хотите попробовать написать компилятор, я бы рекомендовал начать с чего-то вроде C в качестве бэкэнда. Если вы хотите получить более подробную информацию позже, попробуйте LLVM. Если вы попытаетесь создать язык ассемблера или машинный код напрямую, это, вероятно, будет менее эффективно, чем то, что может произвести компилятор C или LLVM. Я говорю по этому поводу, исходя из личного неловкого опыта.
Компилятор переходит непосредственно к машинному коду.
Отладчик покажет инструкции машинного кода как ассемблер, но отладчик может также показать другой код, который не был скомпилирован компилятором.
Компилятор может также включать ассемблер, чтобы вы могли включить встроенный код ассемблера в язык более высокого уровня или сгенерировать вывод ассемблера.
Большинство компиляторов будут иметь возможность просматривать листинг сборки
Компилятор переводит некоторый язык программирования высокого уровня на некоторый язык более низкого уровня (как машинный код, ассемблер или даже другой язык высокого уровня, например, с Vala на C, или с uC++ на C++).
Не знаю, как VC++, но большинство компиляторов, как GNU GCC, не содержат ассемблера, а вызывают внешнюю программу-ассемблер (как NASM, или GNU AS).
Cheers