Hi Alexey,
Mon Oct 13 2003 10:40, Alexey Boyko wrote to Ilia Tarasov:
IT>> оптимизирующие компиляторы.... И еще btw, аргументы по поводу того, IT>> что gcc портируется на любой процессор, только подтверждают IT>> независимость Си от регистровой модели.
AB> Я не все понял, что ты сказал, но именно gcc ориентирован именно на AB> регистровые архитектуры. Я когда-то думал, так его спортировать на AB> стековую архитектуру - не придумал.
Не берусь утверждать что-то относительно gcc, не специалист. Однако могу привести интересное высказывание, нарытое на одном из форумов на просторах Интернета (могу и ссылку дать, да вряд ли это кому интересно):
Run any GCC compiler on a small C source and use the -S option, it'll generate assembly source code, and peruse that. You'll get a good look at why C is so heavy when calling functions.
To make it short, C pushes all arguments right-to-left onto the return stack (compile all code to perform that), then compiles a machine-call to the subroutine where all arguments are accessed from this stack area, if you have locals then they are also pushed onto the return stack and accessed from this local-stack-frame. To return, you first destroy any locals-stack-frame, then execute a machine return-from-subroutine, and the calling routine then drops all arguments from the stack.
It's very heavy, compared to Forth's calling convention. And all C compilers do it that way, that's why it's called the "C Calling Convention". There are others, like Pascal convention, where you push args left-to-right, call the subroutine, and the called subroutine has the responsability of dropping the args before returning. Much cleaner.
Где-то еще, на этот раз не помню где, встречалось другое высказывание, тоже выглядящее, на мой взгляд, достаточно достоверно. Примерно такое: "Все (или почти все) компиляторы сначала генерируют абстрактный код для абстрактного процессора, в котором параметры передаются через стек. После этого они пытаются "переложить" часть стековых операций на регистры, если таковые есть в реальном процессоре". Склероз может меня и подводит в деталях, но суть пересказываю так, как понял.
То есть, я это понимаю так, что большинство трансляторов поначалу кладет прибором на регистры, и предполагает что имеет дело с одностековой машиной. Те книжки, которые я читал про построение компиляторов, этому пониманию не противоречат, наоборот.
Поэтому твое утверждение, что gcc изначально ориентирован именно на регистровую архитектуру, мне представляется сомнительным. Я бы еще мог понять, если бы ты говорил о PICC, т.к. к ПИК, действительно, "стандартный подход" приложить трудно, больно уж архитектура для этого не приспособлена.
Пока, Алексей