Спецификация C++ преднамеренно расплывчата во многих отношениях, главным образом, чтобы оставаться независимой от реализации. Многие области, где язык является неопределенным, больше не представляют большой проблемы - например, вы обычно можете полагаться на символ, состоящий из 8 бит. Тем не менее, другие проблемы, такие как компоновка структур, которые используют множественное наследование, представляют собой реальную проблему, равно как и последствия виртуальных функций для классов. Эти проблемы влияют на совместимость кода, сгенерированного с помощью разных компиляторов. Бинарный интерфейс приложения (или ABI) C++ не строго определен, и в результате вам приходится иногда погружаться в C, где это становится проблематичным. Хорошим примером является написание плагина.
Аналогичным образом стандарт не дает подробного описания того, как должен строиться компилятор, поскольку существует множество ключевых решений и функций, которые различают компиляторы. Например, MSVC может выполнять частичные сборки (разрешая редактирование и продолжение), которые GCC не делает. Вообще говоря, все компиляторы выполняют аналогичные этапы: предварительная обработка, синтаксический анализ, определение потока программы, создание таблицы символов и создание линейной серии инструкций, которые впоследствии могут быть связаны с получением исполняемого файла. О, и связывая эти объектные файлы, это обычно делается с помощью компоновщика.
У меня был краткий взгляд, довольно сложно найти описания отдельных компиляторов. Я сомневаюсь, что там много коммерческих компиляторов, таких как предложение Microsoft, исключительно по коммерческим соображениям. GCC - ваш лучший выбор, although Microsoft is happy to describe the process. Это довольно банальный материал: компиляторы все работают практически так же. Реальное золото заключается в том, как они выполняют эти этапы, алгоритмы и структуры данных, которые они используют. В этом отношении I recommend this book. Несколько лет назад я купил совершенно новый экземпляр для университетского курса, и я заимствовал большинство моих учебников из библиотеки :).
Вот [страница руководства использует GCC Internals в] (http://gcc.gnu.org/onlinedocs/gccint/Passes.html#Passes) , Я думал, что он использовал язык, который вы хотели, но, очевидно, нет. Если вы посмотрите в источнике GCC, то есть множество отдельных проходов оптимизации. Я бы предположил, что нет, стандарт указывает, что нужно для достижения не того, как он должен это делать, и что лучшим выбором будет учебный курс или учебник по составлению компилятора - я уверен, что вокруг много. – Rup
@sharptooth Я отбросил вопрос - я считаю, что этот титул может быть гораздо легче найти людьми, ищущими то же самое. –
@ Luchian Grigore: Хорошо, я просто, хотя изменение названия действительно имело значение - «как это обычно делается» v «что Стандарт говорит о том, как это должно быть сделано». В любом случае, это ваш вопрос, вы решаете. – sharptooth