Является ли F# компилятор однопроходным?
Я смотрю в Интернете и нахожу только одно упоминание о F# с использованием однопроходной компиляции в личном блоге, а не в официальных документах.
Из моего опыта на данный момент кажется, что F# использует однопроходную компиляцию, так что вы можете ссылаться только на типы или функции, которые были определены ранее в файле, в котором вы находитесь в данный момент, или появляются в файле, который указан ранее в порядке компиляции.
Это утверждение верно?
1 ответ
Вам нужно определить, что означает "пропуск", чтобы ответить на этот вопрос.
Многие компиляторы - это то, что называется многофазным, что означает отдельные этапы преобразования исходного текста в исполняемый машинный код или код IL.
Я думаю, что термин "pass" устарел и относится к очень ранним компиляторам, которые, возможно, считывали фактические исходные файлы более одного раза как часть своей обработки, реальные компиляторы коммерческого уровня почти наверняка не делают этого или должны это делать.
Например, я работал над компилятором PL/1 (он же PL/I) для Windows много лет назад, и он прошел несколько этапов:
- parse - использовать исходные файлы и создавать дерево разбора
- объявлений - разрешить идентификаторы в дереве разбора для объявленных имен
- оптимизировать - анализировать дерево разбора и оптимально его реструктурировать.
- codegen - анализировать дерево разбора и генерировать файл OBJ.
Большинство компиляторов сегодня в значительной степени делают это (в разных фазах или нет - но они выполняют одну и ту же работу).