Un Calling Convention (o convención de llamada) es un conjunto de reglas a nivel de bajo nivel que rigen cómo el código de una función interactúa con el código que la invoca. Estas reglas definen aspectos cruciales como el orden en que los argumentos se pasan a la función (ya sea en la pila, en registros o una combinación), quién es responsable de limpiar la pila después de la llamada (el llamador o la función llamada), cómo se devuelven los valores, y qué registros deben ser preservados por la función llamada (callee-saved) o pueden ser sobrescritos libremente (caller-saved). La adherencia a un Calling Convention es fundamental para la interoperabilidad entre diferentes módulos de código, especialmente cuando se compilan con diferentes compiladores o se escriben en diferentes lenguajes.
Los Calling Conventions son omnipresentes en la programación de sistemas y la interacción a bajo nivel. Ejemplos concretos incluyen el `cdecl` (C declaration) en sistemas x86 de 32 bits, donde el llamador empuja los argumentos de derecha a izquierda y es responsable de limpiar la pila. El `stdcall` (standard call), común en la API de Windows, es similar pero la función llamada es responsable de limpiar la pila. En arquitecturas x64, el `System V AMD64 ABI` (Application Binary Interface) para Linux, macOS y otros sistemas Unix-like, utiliza registros para los primeros argumentos y la pila para los subsiguientes, con el llamador limpiando la pila. Windows x64 utiliza su propio Calling Convention que también prioriza los registros. Estas convenciones son críticas para la interoperabilidad de bibliotecas compartidas (DLLs, SOs), llamadas al sistema (syscalls) y la integración de código ensamblador con lenguajes de alto nivel.
Para un Arquitecto de Sistemas, entender los Calling Conventions es vital para diseñar interfaces de bajo nivel robustas y eficientes. La elección o el diseño de un Calling Convention impacta directamente en el rendimiento (uso de registros vs. pila), la seguridad (prevención de desbordamientos de pila o corrupción de registros) y la interoperabilidad. Al integrar componentes escritos en diferentes lenguajes o compilados con distintas herramientas, el arquitecto debe asegurar que los Calling Conventions sean compatibles o que existan "shims" de adaptación. Un conocimiento profundo permite optimizar el rendimiento en rutas críticas de código, como las llamadas al kernel o las interfaces FFI (Foreign Function Interface), y diagnosticar problemas sutiles relacionados con la corrupción de la pila o registros. Las decisiones sobre Calling Conventions son un trade-off entre la simplicidad de implementación, la eficiencia de ejecución y la flexibilidad para la interoperabilidad.