No es posible implementar semántica de llamadas de función sin usar algún tipo de pila. Solo es posible jugar juegos de palabras (p. Ej., Use un nombre diferente para ello, como "FILO return buffer").
Es posible usar algo que no implemente la semántica de llamadas de función (por ejemplo, estilo de paso de continuación, actores), y luego construir una semántica de llamadas de función encima; pero esto significa agregar algún tipo de estructura de datos para rastrear dónde se pasa el control cuando la función regresa, y esa estructura de datos sería un tipo de pila (o una pila con un nombre / descripción diferente).
Imagine que tiene muchas funciones que pueden llamarse entre sí. En tiempo de ejecución, cada función debe saber a dónde regresar cuando sale de la función. Si first
llama second
entonces tiene:
second returns to somewhere in first
Luego, si tiene second
llamadas third
:
third returns to somewhere in second
second returns to somewhere in first
Luego, si tiene third
llamadas fourth
:
fourth returns to somewhere in third
third returns to somewhere in second
second returns to somewhere in first
A medida que se llama a cada función, se debe almacenar más información sobre "dónde regresar" en alguna parte.
Si una función regresa, entonces su información de "dónde regresar" se usa y ya no es necesaria. Por ejemplo, si fourth
regresa a algún lugar third
, la cantidad de información sobre "dónde regresar" se convertiría en:
third returns to somewhere in second
second returns to somewhere in first
Básicamente; "semántica de llamada de función" implica que:
- debe tener información sobre "dónde regresar"
- la cantidad de información crece a medida que se llaman funciones y se reduce cuando las funciones regresan
- la primera parte de la información almacenada de "dónde devolver" será la última parte de la información "dónde devolver" descartada
Esto describe un búfer FILO / LIFO o una pila.
Si intenta utilizar un tipo de árbol, cada nodo del árbol nunca tendrá más de un hijo. Nota: un nodo con varios hijos solo puede suceder si una función llama a 2 o más funciones al mismo tiempo , lo que requiere algún tipo de concurrencia (por ejemplo, hilos, fork (), etc.) y no sería "semántica de llamada de función". Si cada nodo en el árbol nunca tendrá más de un hijo; entonces ese "árbol" solo se usaría como un buffer FILO / LIFO o una pila; y debido a que solo se usa como un buffer FILO / LIFO o una pila, es justo afirmar que el "árbol" es una pila (y la única diferencia son los juegos de palabras y / o los detalles de implementación).
Lo mismo se aplica a cualquier otra estructura de datos que podría usarse para implementar la "semántica de llamada de función": se usará como una pila (y la única diferencia son los juegos de palabras y / o los detalles de implementación); a menos que rompa la "semántica de llamada de función". Nota: proporcionaría ejemplos para otras estructuras de datos si pudiera, pero no puedo pensar en ninguna otra estructura que sea un poco plausible.
Por supuesto, cómo se implementa una pila es un detalle de implementación. Podría ser un área de memoria (donde realiza un seguimiento de una "parte superior de la pila actual"), podría ser algún tipo de lista vinculada (donde realiza un seguimiento de la "entrada actual en la lista"), o podría implementarse en algunos Otra manera. Tampoco importa si el hardware tiene soporte incorporado o no.
Nota: Si solo una invocación de cualquier procedimiento puede estar activa en cualquier momento; entonces puede asignar estáticamente espacio para la información de "dónde regresar". Esto sigue siendo una pila (p. Ej., Una lista vinculada de entradas asignadas estáticamente que se utiliza de forma FILO / LIFO).
También tenga en cuenta que hay algunas cosas que no siguen a la "semántica de llamada de función". Estas cosas incluyen "semánticas potencialmente muy diferentes" (por ejemplo, paso de continuación, modelo de actor); y también incluye extensiones comunes a la "semántica de llamadas de función" como concurrencia (hilos, fibras, lo que sea), setjmp
/ longjmp
, manejo de excepciones, etc.