ciclos, gotos y “scopes”

marzo 23, 2009
By

Hola gente.

Leyendo las RSS de visual studio, topé con este post de Eric Lippert en MSDN, y me pareció algo interesanto, todos conocemos como funcionan los loops por detrás, los gotos o saltos son por supuesto la forma de hacerlo. Pero hay caja negra aqui y esto me recordó un “bateo” en IL cuando Ledesma y yo estabamos trabajando en C#ACAL (Including Assertions in .NET Assemblies).

Lippert menciona que C# no permite “saltar” dentro de un ciclo, y cito “because doing so would skip all of the code that is necessary to ensure the correct behaviour of the loop” no es que yo quiera hacerlo pero en la traducción de codigo legado a C# esto ha sido un problema, mucho codigo antiguo funciona de esta forma y la traducción entonces se convierte en una tarea casi manual, y ademas, nunca ha quedado en claro que es “all of the code that is necessary“.  De nuevo, no que yo quiera que se pueda pero uno siempre quiere el por qué de las cosas. Asi que que ahi va.

Vamos primero a la “caja negra” de nuevo, los que han chocado con IL  saben que hay “cositas” que no tenemos en C# que son posibles y que nadie se pregunta porque aun no llegan arriba, tambien hacemos cosas arriba que no tenemos idea de como se hacen abajo hasta ver el IL(y  que no siempre es algo trivial de leer).  Y ahi entra C#acal  y la posible respuesta a mi entender, cuando Erich estaba programando la generacion a IL del proxy etc, un bug nos tuvo un tiempito con dolor de cabeza, como era directo a IL no habian errores lindos ni nada.

Pues saben que pasaba? En IL un TRY-CATCH-FINALLY comienza y termina con la pila  como estaba, por que? la respuesta parecia simple, hay un scope ahi y esta pensado para que nada quede cuando el try-catch entra en la parte del “catch”, otro scope. en fin. tenemos estos fragmentos de codigo “scopes” y las cosas antes y despues tienen que lucir iguales en el caso del try-catch.

Ojala el compilador de IL hubiera si mas explícito entonces, habria que ver si es esto lo mismo que pasa en los ciclos pues no puedo hacer esto:

goto L1;
{
L1: int a;
}

Se salta siempre hacia fuera y el error muy claro “No such label ‘L1′ within the scope of the goto statement “, Lipert deja abierto que se puede en otros lenguajes, no especifica si son lenguajes que generan IL, pero si pasa lo mismo con cualquier scope que con el try-catch. No creo que sea posible.

si lo fuera, con un poquito mas de trabajo, los que traducen codigo legado a .NET se hubieran ahorrado mucho tiempo y dinero. Claro que en ese punto, al menos yo, preferiria que esto fuera una de esas “cositas” que se queda abajo sin llegar a C#, y nada que conviertan de BASIC a IL :)

Deja un comentario

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

*