Funciones: abstracciones para simplificar la programación

Fuentes: Async Programming Is Just @Inject Time — Will Richardson

Este artículo explora la naturaleza de las funciones en programación y cómo los lenguajes modernos manejan la ejecución del código, particularmente en lo que respecta al despacho dinámico y el manejo de errores. Comienza desafiando la noción de que las funciones son entidades reales, argumentando que son abstracciones creadas por los programadores y el compilador para simplificar el razonamiento sobre el código y facilitar la compilación. La CPU no 'conoce' las funciones; en cambio, el compilador genera código que salta a una dirección específica para la ejecución de la función, y al retornar, salta a la ubicación desde donde se llamó la función. Esta ubicación de retorno se determina dinámicamente en muchos lenguajes, como Java, donde el tipo de objeto en tiempo de ejecución afecta la función toString() que se invoca. El artículo ilustra esto con ejemplos de C y Java, destacando cómo el compilador genera código para manejar estas llamadas dinámicas. Se menciona a Rust como un ejemplo de lenguaje que requiere una explicitación más clara para la funcionalidad dinámica. La discusión se extiende a los closures, que permiten escribir bloques de código que se ejecutan dentro de una función, pero con limitaciones en cuanto al control del flujo de ejecución. Finalmente, aborda el manejo de errores, presentando el enfoque de Go de devolver un valor de error junto con el resultado, como una extensión simple de la abstracción de la función. La idea central es que la complejidad de la ejecución del código, a menudo oculta por las abstracciones de los lenguajes de programación, es un tema fascinante que puede ser mejor comprendido al examinar cómo el compilador y la máquina virtual gestionan la ejecución de las funciones y el despacho dinámico.