Является ли F# компилятор однопроходным?

Я смотрю в Интернете и нахожу только одно упоминание о F# с использованием однопроходной компиляции в личном блоге, а не в официальных документах.

Из моего опыта на данный момент кажется, что F# использует однопроходную компиляцию, так что вы можете ссылаться только на типы или функции, которые были определены ранее в файле, в котором вы находитесь в данный момент, или появляются в файле, который указан ранее в порядке компиляции.

Это утверждение верно?

1 ответ

Вам нужно определить, что означает "пропуск", чтобы ответить на этот вопрос.

Многие компиляторы - это то, что называется многофазным, что означает отдельные этапы преобразования исходного текста в исполняемый машинный код или код IL.

Я думаю, что термин "pass" устарел и относится к очень ранним компиляторам, которые, возможно, считывали фактические исходные файлы более одного раза как часть своей обработки, реальные компиляторы коммерческого уровня почти наверняка не делают этого или должны это делать.

Например, я работал над компилятором PL/1 (он же PL/I) для Windows много лет назад, и он прошел несколько этапов:

  • parse - использовать исходные файлы и создавать дерево разбора
  • объявлений - разрешить идентификаторы в дереве разбора для объявленных имен
  • оптимизировать - анализировать дерево разбора и оптимально его реструктурировать.
  • codegen - анализировать дерево разбора и генерировать файл OBJ.

Большинство компиляторов сегодня в значительной степени делают это (в разных фазах или нет - но они выполняют одну и ту же работу).

Другие вопросы по тегам