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?
Respuesta
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.
Me encanta el artículo de Raymond Chen. Respondió a muchas preguntas. – dsimcha
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
.
- 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
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.
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.
- 1. ¿Por qué hay tantas formas ligeramente diferentes de hacer lo mismo en Ruby?
- 2. ¿Qué son las convenciones de llamadas personalizadas?
- 3. Explicar x => x.ToString() // simplificar tantas llamadas
- 4. ¿Por qué tantas sp_resetconnections para la agrupación de conexiones C#?
- 5. ¿Por qué no hay llamadas al constructor?
- 6. ¿Por qué Java tiene tantas ediciones a diferencia de C#?
- 7. ¿Por qué hay tantas funciones de construcción de mapas en clojure?
- 8. ¿Por qué tantas instancias de ASP.NET Development Server?
- 9. ¿Por qué las llamadas C# son diferentes para métodos sobrecargados para diferentes valores del mismo tipo?
- 10. ¿Por qué hay tantos dialectos de expresiones regulares diferentes?
- 11. ¿por qué usar 'assert' en un proyecto? (Y por qué usarlo tantas veces)
- 12. Obteniendo convenciones de llamadas desde la información de DWARF
- 13. ¿Qué llamadas REST PUT/POST/DELETE deben devolver por convención?
- 14. ¿Cómo sabe std :: function sobre las convenciones de llamadas?
- 15. ¿Por qué el marco de la entidad hace tantas vueltas a la base de datos?
- 16. ¿por qué diferentes respuestas?
- 17. x86_64 convenciones de llamadas y marcos de pila
- 18. MS Visual C++: ¿Cuándo debería preocuparse por usar las convenciones de llamadas?
- 19. ¿Por qué nadie usa las convenciones de nomenclatura de STL?
- 20. ¿Por qué la basura de Android se acumula tantas veces con Jacksons ObjectMapper?
- 21. por qué hay tantas herramientas/tecnologías para hacer la misma tarea en la comunidad de código abierto
- 22. Convenciones de registro
- 23. ¿Por qué hay dos funciones getline() diferentes (si es que las hay)?
- 24. Convenciones de nomenclatura administradas por JSF
- 25. ¿Por qué las fuentes Java tienen tantas carpetas dentro de la otra?
- 26. ¿Por qué hay CL_DEVICE_MAX_WORK_GROUP_SIZE?
- 27. ¿Qué convenciones de nomenclatura usas en C#?
- 28. ¿Por qué diferentes etags para diferentes representaciones del mismo recurso?
- 29. JNI Llamadas diferentes en C vs C++?
- 30. ¿Por qué Dict tiene el peor caso O (n) para tantas operaciones?
+1 ¡Sustituyo esa pregunta! – Poni