En programación informática , la palabra trampolín tiene varios significados y generalmente se asocia con instrucciones de salto (es decir, moverse a diferentes rutas de código).
Programación de bajo nivel
Los trampolines (a veces denominados vectores de salto indirecto ) son ubicaciones de memoria que contienen direcciones que apuntan a rutinas de servicio de interrupción , rutinas de E/S , etc. La ejecución salta al trampolín y luego salta inmediatamente fuera, o rebota, de ahí el término trampolín . Tienen muchos usos:
- El método del trampolín puede utilizarse para superar las limitaciones impuestas por una arquitectura de unidad central de procesamiento (CPU) que espera encontrar siempre vectores en ubicaciones fijas.
- Cuando se inicia un sistema operativo en una máquina de multiprocesamiento simétrico (SMP), solo un procesador, el procesador de arranque, estará activo. Una vez que el sistema operativo se haya configurado, indicará a los demás procesadores que salten a un fragmento de código intermedio que los inicializará y esperará a que el sistema operativo comience a programar hilos en ellos.
Programación de alto nivel
- Tal como se usa en algunas implementaciones de Lisp , un trampolín es un bucle que invoca iterativamente funciones que devuelven thunks ( estilo de paso de continuaciones ). Un solo trampolín es suficiente para expresar todas las transferencias de control de un programa; un programa expresado de esta manera se denomina trampolín, o en estilo trampolín ; convertir un programa a estilo trampolín se denomina trampolín. Los programadores pueden usar funciones trampolín para implementar llamadas a funciones recursivas de cola en lenguajes de programación orientados a la pila . [ 1 ]
- En Java , el término «trampolín» se refiere al uso de reflexión para evitar el uso de clases internas , por ejemplo, en los oyentes de eventos. El tiempo de espera que supone una llamada a reflexión se compensa con el espacio que requiere una clase interna. En Java, los trampolines suelen implicar la creación de un GenericListener para pasar eventos a una clase externa. [ 2 ]
- En Mono Runtime , los trampolines son pequeños fragmentos de código ensamblador escritos a mano que se utilizan para realizar diversas tareas. [ 3 ]
- Al conectar fragmentos de código con convenciones de llamada incompatibles , se utiliza un "trampolín" para convertir la convención del llamador a la convención del llamado.
- En los sistemas embebidos , los trampolines son fragmentos cortos de código que inician otros fragmentos de código. Por ejemplo, en lugar de escribir los manejadores de interrupciones completamente en lenguaje ensamblador, otra opción es escribirlos principalmente en C y usar un trampoline corto para convertir la convención de llamada de interrupciones del lenguaje ensamblador a la convención de llamada de C. [ 4 ]
- Cuando se pasa una función de devolución de llamada a un sistema que espera llamar a una función de C , pero se desea que ejecute el método de una instancia particular de una clase escrita en C++ , se utiliza un pequeño intermediario para convertir la convención de llamada a funciones de C a la convención de llamada a métodos de C++. Una forma de escribir dicho intermediario es usar un thunk . [ 5 ] Otro método es usar un oyente genérico . [ 2 ]
- En Objective-C , un trampolín es un objeto devuelto por un método que captura y reifica todos los mensajes que se le envían y luego "rebota" esos mensajes en otro objeto, por ejemplo, en la mensajería de orden superior . [ 6 ]
- En el compilador GCC , trampoline se refiere a una técnica para implementar punteros a funciones anidadas cuando la opción está habilitada. [ 7 ] El trampoline es un pequeño fragmento de código que se construye sobre la marcha en la pila cuando se obtiene la dirección de una función anidada. El trampoline establece el puntero de enlace estático, que permite que la función anidada acceda a las variables locales de la función contenedora. El puntero de función es entonces simplemente la dirección del trampoline. Esto evita tener que usar punteros de función "gordos" para funciones anidadas que contienen tanto la dirección del código como el enlace estático. [ 8 ] [ 9 ] [ 10 ] Sin embargo, esto entra en conflicto con el deseo de hacer que la pila no sea ejecutable por razones de seguridad.
-ftrampolines - En el lenguaje de programación esotérico Befunge , un trampolín es una instrucción para saltarse la siguiente celda en el flujo de control .
Pilas sin ejecución
Algunas implementaciones de trampolines provocan la pérdida de pilas de no ejecución (pilas NX). En la Colección de Compiladores GNU (GCC), en particular, una función anidada construye un trampoline en la pila en tiempo de ejecución y luego llama a la función anidada a través de los datos de la pila. El trampoline requiere que la pila sea ejecutable.
En GCC, las pilas de no ejecución y las funciones anidadas son mutuamente excluyentes. Si se utiliza una función anidada durante el desarrollo de un programa, la pila NX se pierde silenciosamente. GCC muestra una -Wtrampolinesadvertencia para alertar sobre esta situación.
El software diseñado utilizando un ciclo de vida de desarrollo seguro a menudo no permite el uso de funciones anidadas debido a la pérdida de pilas NX. [ 11 ]
Véase también
Referencias
- ↑ Baker, Henry G. (septiembre de 1995). "CONS Should Not CONS Its Arguments, Part II: Cheney on the MTA" ACM SIGPLAN Notices . 30 (9): 17– 20. doi : 10.1145/214448.214454 . S2CID 20720831. Archivado del original el 11 de noviembre de 2016.
- 1 2 Muller, Hans (31-01-2005). "Aserting Control Over the GUI: Commands, Defaults, and Resource Bundles" . today.java.net . Trampolines . Recuperado el 06-11-2015 .
- ↑ "Trampolines" . Mono Project. 8 de octubre de 2022.
- ↑ Link, Joseph M. (1 de septiembre de 2001). "Trampolines for Embedded Systems: Minimizing interrupt handlers latency" . Dr. Dobb's Journal . Archivado del original el 27 de mayo de 2018. Consultado el 26 de mayo de 2018 .
- ↑ Stangvik, Einar Otto (16 de agosto de 2006). "Thunking en Win32 con C++" . Archivado del original el 15 de octubre de 2012.
- ↑ Weiher, Marcel (2004). "Mensajería de orden superior (HOM)" (PDF) . Archivado (PDF) del original el 27 de mayo de 2018. Recuperado el 26 de mayo de 2018 .
- ↑ fuz (18-11-2011). "Implementación de funciones anidadas" . StackOverflow . Archivado del original el 29-03-2016 . Recuperado el 26-05-2018 .
- ↑ "Trampolines para funciones anidadas" . Usando la colección de compiladores GNU (GCC) . 2018 [2002]. 18.11. Archivado del original el 27-05-2018 . Recuperado el 26-05-2018 .
- ↑ "Funciones anidadas" . Usando la Colección de Compiladores GNU (GCC) . 2018 [2002]. 6.4. Archivado del original el 27-05-2018 . Recuperado el 26-05-2018 .
- ↑ Breuel, Thomas M. (2013). "Cierres léxicos para C++" (PDF) . Archivado (PDF) del original el 12-12-2017 . Recuperado el 26-05-2018 .
- ↑ Walton, Jeffrey; Manico, Jim; Wall, Kevin (2018-03-02) [2013]. "Refuerzo de la cadena de herramientas basada en C" . The Open Web Application Security Project (OWASP). Archivado del original el 27-05-2018 . Recuperado el 02-03-2018 .
- Terminología informática