No uses goto, que yo lo usaré (III). Ganador[es]

Bueno, en la entrada anterior lancé un reto. Al principio estuve tentado de declararlo desierto, ya que todos os habéis centrado en la sentencia swtich, cuya mejor implementación a bajo nivel o bien utiliza gotos a mansalva o bien hace llamadas de tipo call, y muchas veces combinaciones de las mismas (y para ser justos con todos, ni me acordé cuando puse el reto).

Pero una relectura del tema hace que no pueda declararlo desierto, ya que las tres entradas en las que se ha puesto algún ejemplo directo aportan algo nuevo al tema. La de Luis Guerrero es demoledora en cuanto a la justificación de los goto, mientras que las de SergioE quizás sea la más “pura” en el sentido de que fuerza un goto con una construcción bastante sencilla. Y la de Eduard Tomàs es interesante porque nos demuestra que el Reflector no es lo que uno espera…

De todos modos mi idea no era esa, mi idea era que alguien pudiera demostrar que el compilador de C# va más allá de ser un mero traductor de código fuente a MSIL, que es lo que yo opino y hasta el momento nadie ha conseguido convencerme de lo contrario.

Casi estoy pensando en lanzar un nuevo reto a ver si alguien es capaz de encontrar un código que sea convenientemente optimizado por el compilador de C#, pero ciertamente es algo que no vale la pena ya que mañana Microsoft cambiará algo del mismo y lo expuesto no será más que tiempo perdido. Quedémonos, pues, en que el compilador de C# no es muy bueno y que el jitter no le va muy a la zaga sin ser tan pésimo… aunque suficiente en general para las tareas típicas de .NET.

Y por supuesto, no se confundan, a veces el goto es bueno, pero evitémoslo siempre que podamos.

2 comentarios sobre “No uses goto, que yo lo usaré (III). Ganador[es]”

  1. «De todos modos mi idea no era esa, mi idea era que alguien pudiera demostrar que el compilador de C# va más allá de ser un mero traductor de código fuente a MSIL, que es lo que yo opino y hasta el momento nadie ha conseguido convencerme de lo contrario.»

    Está documentado que al recorrer un array con un foreach o un bucle de 0 a Length-1 el compilador genera código que no verifica los límites del array, si lo recorres de una forma «no garantizada» genera código para comprobar que indexas dentro y sino genera una excepción.

    De todas formas, que yo sepa, la mayoría de las optimizaciones las hace el Jitter

  2. Como bien dice Pablo Alarcon, el compilador de C# no hace ninguna optimización importante, es el JIT el que se encarga de hacer las optimizaciones finales para la plataforma.

    Por ejemplo una cosa buena que tiene el JIT es que conoce la plataforma donde se ejecuta y es capaz de emitir instrucciones x86 teniendo en cuenta el procesador, esto es, si por ejemplo tenemos un procesador con sse3 pues emitirá este tipo de instrucciones, en compilaciones de c++ esto no es posible porque no puedes asumir que el cliente tiene el mismo procesador.

Responder a pabloalarcongarcia Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *