what pelicula google completa functional-programming recursion computer-science

functional-programming - pelicula - recursion python



SALTAR y LLAMAR (5)

¿Cómo es diferente una instrucción JUMP y CALL? ¿Cómo se relaciona con los conceptos de nivel superior, como un GOTO o una llamada de procedimiento? (¿Estoy en lo correcto en la comparación?)

Esto es lo que creo:

JUMP o GOTO es una transferencia del control a otra ubicación y el control no regresa automáticamente al punto desde donde se llama.

Por otro lado, una LLAMADA o llamada de procedimiento / función vuelve al punto desde donde se llama. Debido a esta diferencia en su naturaleza, los lenguajes generalmente hacen uso de una pila y un marco de pila se empuja para "recordar" la ubicación para volver para cada procedimiento llamado. Este comportamiento también se aplica a los procedimientos recursivos. En caso de recursión de cola, sin embargo, no hay necesidad de "empujar" un marco de pila para cada llamada.

Sus respuestas y comentarios serán muy apreciados.


Creo que tienes la idea general.

Depende de la arquitectura, pero en general, a nivel de hardware:

  • Una instrucción de salto cambiará el contador del programa para continuar la ejecución en una parte diferente del programa.

  • Una instrucción de llamada empujará la ubicación actual del programa (o la ubicación actual + 1) a la pila de llamadas y saltará a otra parte de un programa. Una instrucción de retorno saltará la ubicación de la pila de llamadas y saltará a la ubicación original (o la ubicación original + 1).

Entonces, una instrucción de salto está cerca de un GOTO , mientras que una instrucción de llamada está cerca de una llamada de procedimiento / función.

Además, debido a que se usa una pila de llamadas al hacer llamadas a funciones, si se vuelven demasiadas direcciones de retorno a la pila de llamadas por recursión se producirá un desbordamiento de la pila .

Al aprender a ensamblar, me resulta más fácil cuando trato con procesadores RISC que con procesadores x86, ya que tiende a tener menos instrucciones y operaciones más simples.


En su mayoría tiene razón, si está hablando de CALL / JMP en el ensamblaje x86 o algo similar. La principal diferencia es:

  • JMP realiza un salto a una ubicación, sin hacer nada más
  • CALL empuja el puntero de la instrucción actual en la pila (más bien: uno después de la instrucción actual) y luego los JMP a la ubicación. Con un RET puedes volver a donde estabas.

Generalmente, CALL es solo una función de conveniencia implementada usando JMP. Podrías hacer algo como

movl $afterJmp, -(%esp) jmp location afterJmp:

en lugar de una LLAMADA.


Estás exactamente en lo cierto sobre la diferencia entre un salto y una llamada.

En el caso de muestra de una única función con recursividad de cola, entonces el compilador puede reutilizar el marco de pila existente. Sin embargo, puede volverse más complicado con funciones mutuamente recursivas:

void ping() { printf("ping/n"); pong(); } void pong() { printf("pong/n"); ping(); }

Considere el caso donde ping () y pong () son funciones más complejas que toman diferentes números de parámetros. El documento de Mark Probst habla sobre la implementación de la repetición de cola para GCC en gran detalle.


De acuerdo con el microprocesador, primero se verifica la condición y luego realiza operaciones de salto (pasa a otro código) y no regresa. La operación de llamada es como una llamada de función en el lenguaje c y cuando se realiza la función regresa para completar su ejecución.


Una corrección a sus pensamientos: no es solo con recursividad de cola, sino generalmente con llamadas de cola, que no necesitamos el marco de pila y, por lo tanto, simplemente podría JMP allí (siempre que los argumentos se hayan configurado correctamente).