2010-08-06 17 views
8

Históricamente, ¿por qué parece que todo el mundo y su hermano menor definieron sus propias convenciones de llamadas? Tienes C, C++, Windows, Pascal, Fortran, Fastcall y probablemente un trillón de otros que no pensé mencionar. ¿No debería una convención ser la más eficiente para la gran mayoría de los casos de uso? ¿Hay alguna buena razón para preferir uno sobre el otro?¿Por qué hay tantas convenciones de llamadas diferentes?

+0

+1 ¡Sustituyo esa pregunta! – Poni

Respuesta

10

Las convenciones de llamada que menciona han sido diseñadas a lo largo de décadas para diferentes idiomas y diferentes hardware. Todos tenían diferentes objetivos. cdecl soportó argumentos variables para printf. stdcall dio como resultado gen de código más pequeño, pero no argumentos variables. Fastcall podría acelerar mucho el rendimiento de funciones simples con solo uno o dos argumentos en máquinas antiguas (pero rara vez es una aceleración hoy).

Nota que cuando se introdujo x64, al menos en Windows, fue diseñado para tener una sola convención de llamadas.

Raymond Chen escribió una gran serie sobre la historia de las convenciones de llamadas, puede comenzar here.

+2

Me encanta el artículo de Raymond Chen. Respondió a muchas preguntas. – dsimcha

1

Porque históricamente todos y su hermano menor definieron sus propias convenciones de llamadas. Todos fueron creados para diferentes propósitos y, por lo tanto, impulsados ​​por diferentes necesidades de rendimiento. Por ejemplo, C++ favorece las optimizaciones para pasar el parámetro this.

1
  • Algunos de ellos son más eficientes en cuanto a rendimiento y otros más eficientes en el tamaño del código.
  • Algunas características (conteo de argumentos variables) solo son compatibles con algunas convenciones.

Más información: http://en.wikipedia.org/wiki/X86_calling_conventions

0

Parte de la razón es la arquitectura subyacente del microprocesador (o procesador). La mayoría de los lenguajes comienzan en una CPU específica y se enredan un poco con esa arquitectura. Por ejemplo, la antigua computadora de la serie Univac 1100 ni siquiera tenía una pila de llamadas.

Otra parte del motivo es que no es posible prever la mejor solución hasta que hayas probado varias formas de hacer las cosas.

0

Se han creado para diferentes propósitos y con diferentes sistemas de optimización.

Por ejemplo, para reducir el "Desbordamiento de pila" (sin juego de palabras) algunas personas pensaron en varias ideas para llamar a la función para hacer que los desbordamientos de pila fueran imposibles.

Otra instancia es el cálculo de Lambda. No es demasiado vago, pero en Lambda, las funciones solo pueden pasar un argumento y devolver un valor, y por lo tanto también necesitan sus propias convenciones de llamada.

Cuestiones relacionadas