Técnica de programación mediante saltos indirectos
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 hacia afuera, o rebota, de ahí el término trampolín . Tienen muchos usos:
- Trampoline se puede utilizar 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 pasen a un fragmento de código trampolín que inicializará los procesadores y esperará a que el sistema operativo comience a programar subprocesos en ellos.
Programación de alto nivel
- Tal como se utiliza en algunas implementaciones de Lisp , un trampolín es un bucle que invoca iterativamente funciones que devuelven thunk ( estilo de paso de continuación ). Un único trampolín es suficiente para expresar todas las transferencias de control de un programa; un programa expresado de esta manera se denomina trampolined, o en estilo trampolined ; convertir un programa al estilo trampolined se denomina trampolining. Los programadores pueden utilizar funciones trampolined para implementar llamadas a funciones recursivas de cola en lenguajes de programación orientados a pila . [1]
- En Java , trampoline se refiere al uso de la reflexión para evitar el uso de clases internas , por ejemplo, en los detectores de eventos. La sobrecarga de tiempo de una llamada de reflexión se intercambia por la sobrecarga de espacio de una clase interna. Los trampolines en Java generalmente implican 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 interconectar fragmentos de código con convenciones de llamada incompatibles , se utiliza un trampolín para convertir la convención del que llama en la convención del llamado.
- En los sistemas integrados , los trampolines son fragmentos cortos de código que inician otros fragmentos de código. Por ejemplo, en lugar de escribir controladores de interrupciones completamente en lenguaje ensamblador, otra opción es escribir controladores de interrupciones principalmente en C y usar un trampolín corto para convertir la convención de llamada de interrupciones del lenguaje ensamblador en la convención de llamada de C. [4]
- Al pasar una devolución de llamada a un sistema que espera llamar a una función C , pero uno quiere que ejecute el método de una instancia particular de una clase escrita en C++ , se utiliza un trampolín corto para convertir la convención de llamada de función de C a la convención de llamada de método de C++. Una forma de escribir un trampolín de este tipo es utilizar un thunk . [5] Otro método es utilizar un listener genérico . [2]
- En Objective-C , un trampolín es un objeto devuelto por un método que captura y consolida todos los mensajes que se le envían y luego "rebota" esos mensajes en otro objeto, por ejemplo en mensajería de orden superior . [6]
- En el compilador GCC , trampolín se refiere a una técnica para implementar punteros a funciones anidadas cuando la opción está habilitada. [7] El trampolín es un pequeño fragmento de código que se construye sobre la marcha en la pila cuando se toma la dirección de una función anidada. El trampolín establece el puntero de enlace estático, que permite que la función anidada acceda a las variables locales de la función envolvente. El puntero de función es entonces simplemente la dirección del trampolín. Esto evita tener que usar punteros de función "gordos" para funciones anidadas que llevan tanto la dirección del código como el enlace estático. [8] [9] [10] Esto, sin embargo, 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 saltar la siguiente celda en el flujo de control .
Pilas sin ejecución
Algunas implementaciones de trampolines provocan una pérdida de pilas de no ejecución (pila NX). En la Colección de compiladores GNU (GCC), en particular, una función anidada crea un trampolín en la pila en tiempo de ejecución y luego llama a la función anidada a través de los datos en la pila. El trampolín requiere que la pila sea ejecutable.
Las pilas de no ejecución y las funciones anidadas son mutuamente excluyentes en GCC. Si se utiliza una función anidada en el desarrollo de un programa, la pila NX se pierde silenciosamente. GCC ofrece una -Wtrampolines
advertencia para alertar sobre la condició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 no debería CONS en sus argumentos, parte II: Cheney sobre la MTA" ACM SIGPLAN Notices . 30 (9): 17–20. doi :10.1145/214448.214454. S2CID 20720831. Archivado desde el original el 11 de noviembre de 2016.
- ^ ab Muller, Hans (31 de enero de 2005). "Afirmar el control sobre la interfaz gráfica de usuario: comandos, valores predeterminados y paquetes de recursos". today.java.net . Trampolines . Consultado el 6 de noviembre de 2015 .[1]
- ^ "Trampolines". Proyecto Mono. 8 de octubre de 2022.
- ^ Link, Joseph M. (1 de septiembre de 2001). "Trampolines para sistemas integrados: minimización de la latencia de los controladores de interrupciones". Diario del Dr. Dobb . Archivado desde el 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 desde el original el 15 de octubre de 2012.
- ^ Weiher, Marcel (2004). "Higher Order Messaging (HOM)" (PDF) . Archivado (PDF) desde el original el 27 de mayo de 2018. Consultado el 26 de mayo de 2018 .
- ^ fuz (18 de noviembre de 2011). "Implementación de funciones anidadas". StackOverflow . Archivado desde el original el 29 de marzo de 2016 . Consultado el 26 de mayo de 2018 .
- ^ "Trampolines para funciones anidadas". Uso de la colección de compiladores GNU (GCC) . 2018 [2002]. 18.11. Archivado desde el original el 27 de mayo de 2018. Consultado el 26 de mayo de 2018 .
- ^ "Funciones anidadas". Uso de la Colección de compiladores GNU (GCC) . 2018 [2002]. 6.4. Archivado desde el original el 27 de mayo de 2018. Consultado el 26 de mayo de 2018 .
- ^ Breuel, Thomas M. (2013). "Cierres léxicos para C++" (PDF) . Archivado (PDF) desde el original el 12 de diciembre de 2017 . Consultado el 26 de mayo de 2018 .
- ^ Walton, Jeffrey; Manico, Jim; Wall, Kevin (2018-03-02) [2013]. "Endurecimiento de la cadena de herramientas basada en C". Proyecto de seguridad de aplicaciones web abiertas (OWASP). Archivado desde el original el 2018-05-27 . Consultado el 2018-03-02 .