Спецификация C ++ преднамеренно расплывчата во многих отношениях, главным образом, чтобы оставаться независимой от реализации. Многие области, в которых язык расплывчатый, больше не представляют большой проблемы - например, вы обычно можете полагаться на 8-битный символ. Тем не менее, другие вопросы, такие как расположение структур, которые используют множественное наследование, представляют реальную проблему, как и влияние виртуальных функций на классы. Эти проблемы влияют на совместимость кода, созданного различными компиляторами. Двоичный интерфейс приложения (или ABI) C ++ не является строго определенным, и в результате вам иногда приходится заглядывать в C, где это становится проблематичным. Написание интерфейса плагина является хорошим примером.
Точно так же стандарт не дает подробного описания того, как должен быть построен компилятор, потому что есть много ключевых решений и функций, которые отличают компиляторы. Например, MSVC может выполнять частичные сборки (позволяя редактировать и продолжать), а GCC - нет. Тем не менее, в общем, все компиляторы выполняют одинаковые этапы: предварительная обработка, синтаксический анализ, определение потока программы, создание таблицы символов и создание линейной серии инструкций, которые впоследствии могут быть связаны для создания исполняемого файла. Да, и связывая эти объектные файлы, обычно это делает компоновщик.
Я кратко посмотрел, довольно сложно найти описания отдельных компиляторов. Я сомневаюсь, что есть много коммерческих компиляторов, таких как предложения Microsoft, исключительно по коммерческим причинам. GCC - ваш лучший выбор, , хотя Microsoft с радостью описывает этот процесс. Хотя это довольно банальная вещь: все компиляторы работают примерно одинаково. Настоящее золото в том, как они выполняют эти этапы, алгоритмы и структуры данных, которые они используют. В этом отношении Я рекомендую эту книгу . Я купил совершенно новый экземпляр для университетского курса несколько лет назад, и я позаимствовал большинство своих учебников из библиотеки:).