Продублирую сюда свою идею из
FOR-темы:
Цитата:
Мы нашли довольно неплохие команды ассемблера, но как поместить их в конечный код? Модифицировать Ofront, чтобы генерировал ассемблерные вставки вместо операторов Си? Можно, но тогда теряется кроссплатформенность. Более гибким мне представляется следующий подход: Ofront транслирует цикл FOR в некие псевдооперации (repeat_for(id) … until_for_Z(id)), которые являются макросами Си. Для дальнейшей трансляции подключается библиотека макросов, зависящая от целевой платформы. В этой библиотеке макросы переводятся в последовательность команд ассемблера , либо в простые операторы С, подходящие всем платформам (например repeat_for(id) - > “do{”, until_for_Z(id) - >”}while (id != 0)”).
Понятно, что такой механизм эффективных макроподстановок можно применить не только для реализации цикла FOR.
и далее
Цитата:
Конечно, хорошо, когда есть глобальные оптимизации на уровне самого компилятора. Но в С-исходнике может не хватать некоторой информации. Например не видно, что этот do while (id=0); является реализацией цикла FOR и поэтому id после завершения цикла можно испортить или использовать в своих целях.
Если мы применим макросы, то такая информация будет. Исходник на Си превратится в прогу на неком "псевдоСи" (или лучше назвать "макроСи"?), операторы которого несут дополнительную информацию и могут быть оптимизированы более качественно. Т.е. появляется дополнительный уровень: Оберон -> макроСи -> Си -> Ассемблер. И "макро" могут транслироваться сразу на уровень Ассемблера, если для них придуманы эффективные ассемблерные команды.А если еще не придумали, то этот "макро" легко превращается обратно в Си.