- Нет, я был бы удивлен, если бы вы нашли интенсивно используемый однопроходный компилятор C ++.
- Нет, он выполняет несколько проходов и даже различные оптимизации на основе флагов, которые вы передаете.
Преимущества (однопроходные): быстро! Поскольку весь источник необходимо проверить только один раз, фаза компиляции (и, следовательно, начало выполнения) может произойти очень быстро. Это также модель, которая привлекательна, потому что она делает компилятор простым для понимания и зачастую «более легким» для реализации. (Я работал над однопроходным компилятором Pascal один раз, но не часто с ними сталкиваюсь, тогда как однопроходные интерпретаторы встречаются часто)
Недостатки (sinlge-pass): Оптимизация, семантический / синтаксический анализ. Иногда один просмотр кода позволяет легко проходить через простые механизмы за несколько проходов. (вроде почему у нас есть такие вещи, как JSLint)
Преимущества (многоходовые): оптимизации, семантический / синтаксический анализ. Даже псевдоинтерпретируемые языки, такие как «JRuby», проходят процесс конвейерной компиляции, чтобы получить байт-код java / jvm перед выполнением, вы можете рассмотреть этот многоходовый проход, и множественный взгляд на изменяющиеся представления (и, следовательно, результирующие оптимизации) кода может сделать это очень быстро.
Недостатки (многоходовые): сложность, иногда время (в зависимости от того, используется ли AOT / JIT в качестве метода компиляции)
Кроме того, в академических кругах довольно распространен однопроходный метод, помогающий изучить аспекты проектирования компилятора.