Corrigiendo al programador

Cuando preparaba mi anterior artículo Bucles invertidos, pude sorprenderme muy agradablemente con el optimizador de Visual C++ 7.1 (2003).

El código:

1
2
3
4
unsigned int i;
for (i=0; i<100; i++)
{
}

Queda compilado a nada. Es evidente que el bucle no realiza ninguna operación, por lo que el optimizador del compilador, lo detecta, y lo elimina.

Más sorprendente es:

1
2
3
4
5
unsigned int i;
for (i=0; i<100; i++)
{
}
return(i);

Se transforma a código ensamblador así:

1
2
mov	eax, 100
ret

Lo que si lo volviéramos a transcribir en C, sería:

1
return(100);

Como vemos, el propio compilador ha detectado código escrito pobremente, para en la medida de lo posible, mejorarlo.

También se puede apreciar, que la calidad del código generado es más que buena, superior a la que la mayoría de programadores sería capaz de escribir manualmente.

Evidentemente hay algunos casos, pocos afortunadamente, en los que el optimizador "se pasa de listo", y rompe código que sin optimizar funcionaba correctamente, pero eso es algo que poco a poco se va solucionando.

Todo ello, a pesar que en cuanto a eficiencia, Visual C++ 2003, no es ni de lejos el mejor compilador de C/C++. Lo que todavía impresiona más.

Con el nuevo GCC 4, el inminente Visual C++ 2005, y el recién salido Intel C++ 9, los optimizadores serán cada vez más inteligentes.

4 comentarios en “Corrigiendo al programador”

  1. wow..
    acabo de descubrir tu blog.. y como pirado de la programación q soy toy impresioanado con tus ejemplos !
    te invito a que visites mi blog (que no es de programación) y comentes !
    saludos !

  2. GCC podría ser más rápido si quitáramos de en medio la gran portabilidad que ofrece, pero ya que es bastante bueno en cuanto a código generado y velocidad es algo que podemos aceptar. Cabe mencionar también que el GCC 4.3 contará con la opción -march=core2 (entre otras) para utilizarse con los procesadores más recientes de Intel ya que hasta ahora debe usarse una próxima a esta como -march=prescott.

    ¡Por cierto bueno tu blog!

  3. Ante todo, me alegra que te guste mi blog, yylex.

    Sobre la eficiencia de GCC, por supuesto que si solamente tuviera un generador de código para una arquitectura, podría llegar a ser muy eficiente.

    La 4.3 no la he probado, pero la 4.1 estaba lejos de Visual C++ 2005, y ya no digo de Intel C++ 9.

    Quizás en el futuro, las cosas cambien. Parece que Visual C++ 2008, no mejora demasiado en cuanto a calidad de código generado, e Intel C++ 10, tiene bastantes bugs, por lo que es una buena oportunidad.

Deja un comentario