Pregunta principal: ¿Por qué los optimizadores de programas generales o incluso los especializados no forman parte de nuestra vida cotidiana?¿Por qué las optimizaciones de todo el programa no son más frecuentes ahora?
empecé a pensar en esto después de leer SuperCompilers, de White paper LLC, que discute su método de "supercompiling" o metacompiling fuente de un programa de (generalmente) lograr una versión más rápida que hace la misma funcionalidad que el programa original. Básicamente, pasan por la ejecución de un programa y vuelven a compilar en el mismo idioma de destino. Al hacer esto, ocurren optimizaciones naturales; por ejemplo, una función de búsqueda binaria general podría estar especializada en la búsqueda binaria de una matriz de 100 elementos, si el programa de entrada utiliza matrices de 100 elementos con frecuencia.
Partial Evaluation es quizás un tipo más estrecho de optimización de todo el programa, donde la fuente del programa se reduce/evalúa en función de un conjunto fijo de entrada dejando abierta la entrada desconocida para su evaluación en tiempo de ejecución. Por ejemplo, una función general x^y, si se da que y = 5, se puede reducir a x^5 o tal vez algo así como (x * x) * (x * x) * x.
(Me disculpo por mis descripciones crudos de estas dos técnicas)
optimizaciones del programa Históricamente enteros, como los dos anteriores sería demasiado intensivo de memoria para llevar a cabo, pero con nuestras máquinas tienen gigas de memoria (o usar algo como la nube), ¿por qué no hemos visto muchos evaluadores parciales de código abierto y cosas así? He visto algunos, pero hubiera pensado que esto sería una parte regular de nuestra cadena de herramientas.
- ¿Es miedo (programador por temor a la transformación de su código al introducir errores)?
- ¿No vale la pena (es decir, para las aplicaciones web el cuello de botella es E/S, y este tipo de optimización parece estar ahorrando tiempo de CPU)?
- ¿Es este tipo de software tan difícil para escribir?
- ¿O es mi percepción de simplemente incorrecta?
Potente optimizador * * en todas partes. El optimizador estático de los compiladores de la línea principal no solo hace una reescritura AST considerable, sino que el optimizador de los compiladores JIT utiliza la especialización de casos. No ha habido una revolución porque estas cosas sucedieron de manera incremental. – dmckee
¿Las optimizaciones del compilador/intérprete superan la necesidad de una herramienta independiente? Un ejemplo que he visto en el caso de los lenguajes interpretados es la evaluación parcial de la fuente del intérprete con la fuente de un programa para crear una versión compilada de ese programa. Eso debería eliminar efectivamente (teóricamente) todos los gastos generales de la interpretación del lenguaje. –