Дизайн компилятора C# - прямая ссылка
В языке прямых ссылок, таком как C#, как компилятор справляется с этим? Каковы этапы работы компилятора?
3 ответа
Основное различие между разрешением или отсутствием прямой ссылки заключается в использовании однопроходного компилятора или многопроходного. Конечно, для обработки прямых ссылок вы должны проверить определения символов и выполнить проверку типов ПОСЛЕ генерации абстрактного синтаксического дерева источника, который вы компилируете.
Таким образом, нет проблем, когда вы сначала находите прямую ссылку, вы просто полагаете, что она будет определена позже (вы можете пометить ее как ожидающую в таблице символов), затем, когда вы найдете фактическое определение, вы уточните объект символа в таблице символов.
После этого вы можете проверить его или проверить, ожидают ли еще какие-либо символы (поэтому нет реального определения, и вы можете вызвать семантическую ошибку).
Это делается путем двух этапов компиляции. Первый проход анализирует код и собирает все используемые идентификаторы. Второй проход разрешает все идентификаторы.
В языке с однопроходным компилятором, таком как Pascal, могут использоваться только обратные ссылки, так как тип идентификатора должен быть известен, прежде чем его можно будет разрешить.
Точно так же, как C++ обрабатывает это, я думаю, единственное отличие: синтаксис достаточно прост, чтобы компилятор мог построить дерево разбора, не требуя, чтобы вы указывали, к какому типу синтаксического объекта относятся ваши еще необъявленные символы.