Un optimizador de código objeto , a veces también conocido como optimizador de post-paso o, para pequeñas secciones de código, optimizador de mirilla , forma parte de un compilador de software . Toma la salida del paso de compilación del lenguaje fuente (el código objeto o archivo binario ) e intenta reemplazar secciones identificables del código con código de reemplazo que sea más eficiente algorítmicamente (generalmente, mejora la velocidad).
Ejemplos
El primer "optimizador COBOL" fue desarrollado por Capex Corporation a mediados de los años 70 para COBOL . Este tipo de optimizador dependía, en este caso, del conocimiento de las "debilidades" del compilador estándar COBOL de IBM y, de hecho, reemplazaba (o parcheaba ) secciones del código objeto con código más eficiente. El código de reemplazo podía reemplazar una búsqueda de tabla lineal con una búsqueda binaria, por ejemplo, o, a veces, simplemente reemplazar una instrucción relativamente lenta con una conocida más rápida que, por lo demás, era funcionalmente equivalente dentro de su contexto. Esta técnica ahora se conoce como reducción de fuerza . Por ejemplo, en el hardware IBM/360 , la CLIinstrucción era, dependiendo del modelo en particular, entre el doble y el 5 veces más rápida que una CLCinstrucción para comparaciones de un solo byte. [1] [2]
Ventajas
La principal ventaja de volver a optimizar los programas existentes era que el stock de programas de cliente ya compilados ( código objeto ) podía mejorarse casi instantáneamente con un esfuerzo mínimo, reduciendo los recursos de CPU a un costo fijo (el precio del software propietario ). Una desventaja era que las nuevas versiones de COBOL, por ejemplo, requerirían un mantenimiento (pagado) al optimizador para atender posibles cambios en los algoritmos COBOL internos. Sin embargo, dado que las nuevas versiones de los compiladores COBOL coincidían con frecuencia con actualizaciones de hardware , el hardware más rápido normalmente compensaba con creces el hecho de que los programas de aplicación volvieran a sus versiones preoptimizadas (hasta que se lanzara un optimizador compatible).
Otros optimizadores
Algunos optimizadores binarios realizan compresión de archivos ejecutables , lo que reduce el tamaño de los archivos binarios mediante técnicas de compresión de datos genéricas , lo que reduce los requisitos de almacenamiento y los tiempos de transferencia y carga, pero no mejora el rendimiento en tiempo de ejecución. La consolidación real de módulos de biblioteca duplicados también reduciría los requisitos de memoria.
Algunos optimizadores binarios utilizan métricas de tiempo de ejecución ( creación de perfiles ) para mejorar introspectivamente el rendimiento utilizando técnicas similares a los compiladores JIT .
Acontecimientos recientes
Los "optimizadores binarios" desarrollados más recientemente para varias plataformas, algunos de los cuales afirman ser novedosos pero, sin embargo, utilizan esencialmente las mismas técnicas (o similares) descritas anteriormente, incluyen:
COBRA: Un marco de optimización binaria en tiempo de ejecución adaptativo para aplicaciones multiproceso [9]
Optimizador de ejecutables Spike (núcleo Unix) [10]
Optimización del software "SOLAR" en tiempo de enlace y tiempo de ejecución [11]
Dynimize: virtualización del rendimiento de la CPU [12]
BOLT: optimizador post-enlace construido sobre el marco LLVM . Utilizando perfiles basados en muestras, BOLT mejora el rendimiento de aplicaciones del mundo real incluso para binarios altamente optimizados creados con Optimización Dirigida por Retroalimentación y Optimización de Tiempo de Enlace . Para los compiladores GCC y Clang , BOLT acelera sus binarios hasta en un 20,4% sobre FDO y LTO, y hasta en un 52,1% si los binarios se crean sin FDO y LTO. [13]
^ "Copia archivada" (PDF) . Archivado desde el original (PDF) el 11 de julio de 2010. Consultado el 7 de enero de 2010 .{{cite web}}: CS1 maint: copia archivada como título ( enlace )
^ Evans, Michael (1982-12-01). "Ingeniería de software para el entorno COBOL". Comunicaciones de la ACM . 25 (12): 874–882. doi : 10.1145/358728.358732 . S2CID 17268690.
^ "IBM Automatic Binary Optimizer for z/OS - Overview" (Optimizador binario automático de IBM para z/OS: descripción general). www.ibm.com . 2015. Archivado desde el original el 18 de octubre de 2020. Consultado el 15 de mayo de 2020 .
^ "Servicio de nube de prueba IBM Automatic Binary Optimizer for z/OS". optimized.ibm.com . 2020. Archivado desde el original el 19 de enero de 2021 . Consultado el 27 de octubre de 2021 .
^ "El optimizador de código binario". Archivado desde el original el 22 de julio de 2010. Consultado el 7 de enero de 2010 .
^ Duesterwald, E. (2005). "Diseño e ingeniería de un optimizador binario dinámico". Actas del IEEE . 93 (2): 436–448. doi :10.1109/JPROC.2004.840302. S2CID 2217101.
^ Xu, Chaohao; Li, Jianhui; Bao, Tao; Wang, Yun; Huang, Bo (13 de junio de 2007). "Optimizaciones de memoria basadas en metadatos en traductores binarios dinámicos". Actas de la 3.ª conferencia internacional sobre entornos de ejecución virtual - VEE '07 . Association for Computing Machinery. págs. 148-157. doi :10.1145/1254810.1254831. ISBN978-1-59593630-1. S2CID 15234434. Archivado desde el original el 27 de octubre de 2021. Consultado el 27 de octubre de 2021 a través de ACM Digital Library.
^ "Copia archivada" (PDF) . Archivado (PDF) desde el original el 19 de abril de 2009. Consultado el 7 de enero de 2010 .{{cite web}}: CS1 maint: copia archivada como título ( enlace )
^ Kim, Jinpyo; Hsu, Wei-Chung; Yew, Pen-Chung (2007). "COBRA: Un marco de optimización binaria en tiempo de ejecución adaptativo para aplicaciones multiproceso". Conferencia internacional sobre procesamiento paralelo de 2007 (ICPP 2007) . pág. 25. doi :10.1109/ICPP.2007.23. ISBN978-0-7695-2933-2. Número de identificación del sujeto 15079211.
^ "Copia archivada" (PDF) . Archivado desde el original (PDF) el 11 de septiembre de 2010. Consultado el 7 de enero de 2010 .{{cite web}}: CS1 maint: copia archivada como título ( enlace )
^ "Optimización del software "SOLAR" en tiempo de enlace y tiempo de ejecución". Archivado desde el original el 14 de febrero de 2016.
^ "Descripción general del producto Dynimize". dynimize.com . Archivado desde el original el 2021-10-25 . Consultado el 2021-04-26 .
^ Panchenko, Maksim; Auler, Rafael; Nell, Bill; Ottoni, Guilherme (16 de febrero de 2019). "BOLT: un optimizador binario práctico para centros de datos y más allá". Simposio internacional IEEE/ACM de 2019 sobre generación y optimización de código (CGO) . págs. 2–14. arXiv : 1807.06735 . doi :10.1109/CGO.2019.8661201. ISBN .978-1-7281-1436-1.S2CID 49869552 .