В Обероне (компиляторы, как правило, однопроходные) файл каждого модуля один. Экспортируемые процедуры, константы, типы и переменные помечены звёздочками. В Модуле-2 ещё было два файла — definition module и implementation module, — а в Обероне уже один. И однопроходный компилятор без проблем справляется. Весь компилятор занимает порядка 3000 строк виртовского кода и моментально компилирует сам себя (в машинный код).
а потом с этими однопроходными компиляциями начинаются жалобы на какую-то полноту по Тьюрингу. Мол не понятно, что значит а * б и вообще все сложна. Компилятор тормозит, требует постоянно какую-то дополнительную инфу и вообще результаты работы своей кешировать не умеет.
ЦПУ, когда перешли с обработки опкодов на микрокод, стали работать почему-то быстрее.
ЦПУ, когда перешли с банальной обработки команд на конвейеризацию и предсказание ветвлений, стали работать быстрее.
Изучайте суперскалярные вычисления, их логику и вообще философию векторной обработки.
Вон - человек написал самый быстрый парсер json с использованием векторных обработок (жаль в джаве их не удастся использовать). И ведь у него почти нет ветвлений - все на арфиметике, да логике.
Если такое можно сделать на уровне символов - json, да и токенов - ANTLR, то почему подобное нельзя сделать на уровне семантики? Зачем усложнять, если можно разделить все на тривиальные задачи, которые проц будет выполнять быстрее, чем ваше однопроходное творение искусства?