Optimización de código: un código más eficiente

En los primeros tiempos de la informática, programar exigía utilizar lenguajes muy próximos a la plataforma de ejecución. El código máquina o el lenguaje ensamblador permiten un control muy fino del proceso de ejecución: cómo se asignan los registros del procesador, cómo se almacenan los datos y se accede a la memoria, … Así es posible exprimir la máxima eficiencia de una plataforma, aunque el precio a pagar es la falta de portabilidad y el mayor coste de desarrollo y mantenimiento del código. Afortunadamente, hoy en día podemos utilizar lenguajes de programación de alto nivel, que abstraen estos detalles de la plataforma y nos permiten ser más productivos resolviendo problemas más complejos en menos tiempo. Sin embargo, con esta transición hemos perdido algo de eficiencia… ¿o no? Quizás tampoco tanta, porque los compiladores incorporan técnicas que permiten mejorar el rendimiento del código generado. La optimización de código es el conjunto de fases de un compilador que transforman un fragmento de código en otro fragmento con un comportamiento equivalente y que se ejecuta de forma más eficiente, es decir, usando menos recursos de cálculo como memoria o tiempo de ejecución. Es importante destacar que: La condición de tener un “comportamiento equivalente” es bastante onerosa, ya que incluye también situaciones de error donde el comportamiento debe ser el mismo. Pongamos como ejemplo una instrucción como “x = y / y“. La tentación es substituir esta expresión por “x =1“, pero es necesario garantizar que la variable y no puede ser igual a 0, porque entonces el código podría tener un comportamiento diferente según el lenguaje (p.ej. división por cero). También es fundamental garantizar que el código no será menos eficiente...