Soporte para IL en C#

30/01/2005 - 18:25 por Alejandro Serrano | Informe spam
A veces resulta necesario expresar algunas construcciones en lenguage
intermedio directamente. Esto no se puede hacer con C# de la misma
manera que se hace con el lenguaje ensamblador en C o C++. Pero después
de todo, IL es el ensamblador de .NET, ¿no?
Sé que algunos otros compiladores como F# poseen esta característica,
que yo particularmente encuentro muy útul. Así pues, me gustaría
proponer una extensión a C# que s eparecería a algo así:

unsafe int __il
{
ldarg.0
ldarg.1
add
}

Que correspondería al código en F#:

(# "ldarg.0
ldarg.1
add" : int )

El código debería marcarse como no verificable con "unsafe", así como
marcar el tipo de lo que se devolverá. Así nos evitaríamos tener que
usar Reflection para estos menesteres, que resulta muy complejo (y feo a
la vista), así como mucho menos eficiente.

He puesto esta sugerencia en el "MSDN Product Feedback". Puden verla en
http://lab.msdn.microsoft.com/Produ...te;BK20847

¡¡Vota si te parece bien!!

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
30/01/2005 - 19:10 | Informe spam
Alejandro,

La idea en principio me parece buena, me recuerda la posibilidad de escribir
ensamblador en línea de Delphi y muchas variantes de C/C++...
Mis posibles "objeciones" (habría que pensar más sobre el asunto):
a) ¿no haría eso al lenguaje más "dependiente" aún de la plataforma .NET?
Aunque en buena medida ya lo es, indudablemente...
b) seguridad. ¿no abrirá esto más "agujeros" potenciales de los que
introduce el actual "unsafe code"?
c) sintaxis. Yo buscaría una nueva palabra reservada que no empiece por los
dos subrayados. Todo el mundo parece estarse apartando de ese estilo
últimamente (Managed Extensions de VC++, Borland C++...).
d) tampoco me gusta del todo lo de tener que especificar el tipo, cosa que
se justifica más en un lenguaje funcional. Si se pudieran definir bloques de
código IL, me gustaría que la sintaxis fuera al estilo de por ejemplo
unchecked { ... }. La otra posibilidad sería que sólo se pudieran definir
METODOS enteros de código IL.

Slds,

Octavio


"Alejandro Serrano" escribió en el mensaje
news:
A veces resulta necesario expresar algunas construcciones en lenguage
intermedio directamente. Esto no se puede hacer con C# de la misma manera
que se hace con el lenguaje ensamblador en C o C++. Pero después de todo,
IL es el ensamblador de .NET, ¿no?
Sé que algunos otros compiladores como F# poseen esta característica, que
yo particularmente encuentro muy útul. Así pues, me gustaría proponer una
extensión a C# que s eparecería a algo así:

unsafe int __il
{
ldarg.0
ldarg.1
add
}

Que correspondería al código en F#:

(# "ldarg.0
ldarg.1
add" : int )

El código debería marcarse como no verificable con "unsafe", así como
marcar el tipo de lo que se devolverá. Así nos evitaríamos tener que usar
Reflection para estos menesteres, que resulta muy complejo (y feo a la
vista), así como mucho menos eficiente.

He puesto esta sugerencia en el "MSDN Product Feedback". Puden verla en
http://lab.msdn.microsoft.com/Produ...te;BK20847

¡¡Vota si te parece bien!!
Respuesta Responder a este mensaje
#2 Alejandro Serrano
30/01/2005 - 19:28 | Informe spam
En algunas cosas tienes razón
a) Esto haría muy dependiente de la plataforma, pero como tu mismo
dices, ya lo es. El uso de "IL" podría plantearse como una extensión del
lenguaje sólo para el uso con CLI. Aún así, el propio estandar de C# lo
vincula con .NET.
b) En mi opinión no crea agujeros, pues en cualquier caso puedes
escribir codigo IL y compilarlo con ILASM. Aunuqe habría que meditar si
es posible saber cuando un bloque de IL hace cosas potencialmente
peligrosas o no.
c) La sintaxis de __ la he puesto debido a que en su momento se
especificó que cualquier nueva adición de palabra clave al lenguaje
estuviese precedida de este símbolo. Aunque yo creo que esto es lo de
menos...
d) Especificar el tipo creo que es necesario para que el compilador sepa
que tipo se devuelve, que muchas veces no puede obtenerse directamente.
Aunque podría sobreentenderse en algunos contextos como:

int suma = unsafe __il { /*blablabla*/}

Los métodos enteros de IL serían también otra buena opción, y no eres el
primero en plantearla. Qué tal algo como:?

public __il int Suma (int a, int b)
{
ldarg a
ldarg b
add
ret
}

Aún así, habría que comprobar algunas cosas del IL que se pueden hacer
fácilmente:
- Que no se haga referencia a un argumento no existente
- Que haya verificación de tipo
Pero todo esto puede hacerse con PEVerify.

Si te gusta la idea podemos seguir conversando. Mi e-mail es


Octavio Hernandez wrote:
Alejandro,

La idea en principio me parece buena, me recuerda la posibilidad de escribir
ensamblador en línea de Delphi y muchas variantes de C/C++...
Mis posibles "objeciones" (habría que pensar más sobre el asunto):
a) ¿no haría eso al lenguaje más "dependiente" aún de la plataforma .NET?
Aunque en buena medida ya lo es, indudablemente...
b) seguridad. ¿no abrirá esto más "agujeros" potenciales de los que
introduce el actual "unsafe code"?
c) sintaxis. Yo buscaría una nueva palabra reservada que no empiece por los
dos subrayados. Todo el mundo parece estarse apartando de ese estilo
últimamente (Managed Extensions de VC++, Borland C++...).
d) tampoco me gusta del todo lo de tener que especificar el tipo, cosa que
se justifica más en un lenguaje funcional. Si se pudieran definir bloques de
código IL, me gustaría que la sintaxis fuera al estilo de por ejemplo
unchecked { ... }. La otra posibilidad sería que sólo se pudieran definir
METODOS enteros de código IL.

Slds,

Octavio


"Alejandro Serrano" escribió en el mensaje
news:

A veces resulta necesario expresar algunas construcciones en lenguage
intermedio directamente. Esto no se puede hacer con C# de la misma manera
que se hace con el lenguaje ensamblador en C o C++. Pero después de todo,
IL es el ensamblador de .NET, ¿no?
Sé que algunos otros compiladores como F# poseen esta característica, que
yo particularmente encuentro muy útul. Así pues, me gustaría proponer una
extensión a C# que s eparecería a algo así:

unsafe int __il
{
ldarg.0
ldarg.1
add
}

Que correspondería al código en F#:

(# "ldarg.0
ldarg.1
add" : int )

El código debería marcarse como no verificable con "unsafe", así como
marcar el tipo de lo que se devolverá. Así nos evitaríamos tener que usar
Reflection para estos menesteres, que resulta muy complejo (y feo a la
vista), así como mucho menos eficiente.

He puesto esta sugerencia en el "MSDN Product Feedback". Puden verla en
http://lab.msdn.microsoft.com/Produ...te;BK20847

¡¡Vota si te parece bien!!





Respuesta Responder a este mensaje
#3 Rodrigo Corral [MVP]
31/01/2005 - 09:56 | Informe spam
Parece que la politica de microsoft en este aspecto es evitar que se escriba
codigo IL directamente. De hecho hace poco en una presentación sobre C++/CLI
de Herb Sutter se comentaba que una de las metas en el diseño de C++/CLI era
evitar que hubise necesidad de escribir código IL. Vamos que si necesitas
ese nivel de optimización para eso esta C++ y la posibilidad de generar
assemblies CLSCompliant.


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
#4 Octavio Hernandez
31/01/2005 - 18:20 | Informe spam
Hola, Rodrigo!

Muy bien lo de Sutter, ¿verdad?

Slds - Octavio

"Rodrigo Corral [MVP]" escribió en el mensaje
news:
Parece que la politica de microsoft en este aspecto es evitar que se
escriba codigo IL directamente. De hecho hace poco en una presentación
sobre C++/CLI de Herb Sutter se comentaba que una de las metas en el
diseño de C++/CLI era evitar que hubise necesidad de escribir código IL.
Vamos que si necesitas ese nivel de optimización para eso esta C++ y la
posibilidad de generar assemblies CLSCompliant.


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org

Respuesta Responder a este mensaje
#5 Rodrigo Corral [MVP]
31/01/2005 - 18:44 | Informe spam
Jjejejeje... si si es en la que tu me pasaste donde lo lei!!!

Oye de donde la bajaste? Lo recuerdas?


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida