Archive for November, 2007

AOP, reflexión (reflection), Cecil

El proyecto pigmeo se divide en varios subproyectos. La piedra angular del compilador (pigmeo-compiler uno de los subproyectos) es su paradigma: la programación orientada a aspectos. Utilizando las clases del namespace System.Reflection de .NET podemos modificar directamente los binarios de .NET. Como System.Reflection es algo engorroso utilizaré un librería intermedia: Cecil. Es GPL así que no hay ningún problema en utilizarla. El usuario final obviamente no tendrá que preocuparse por Cecil, reflexión ni AOP ya que sólo se utiliza desde pigmeo-compiler, y no desde pigmeo-framework (el framework utilizado por los usuarios finales).

Cecil está muy bien organizado y permite acceder a todas las clases, métodos, instrucciones en lenguaje intermedio (CIL)… mediante una jerarquía bien estructurada. El gran problema de Cecil es que no tiene absolutamente nada de documentación, solo unos pocos ejemplos, y ni siquiera está documentado el código fuente mediante XML (muy útil para ver la descripción de clases y objectos en el autocompletado del entorno de desarrollo), por lo que te encuentras con cientos o incluso miles de clases y funciones con nombres extraños y sin ningún tipo de explicación, así que acceder a algunas partes del ejecutable que se está intentando modificar resulta prácticamente imposible.

Cecil se utilizará para la primera parte del compilador: el frontend. El frontend lee el ejecutable de .NET y genera OTRO ejecutable con el mismo programa pero organizado de una manera totalmente diferente, parecida al bajo nivel (o más bien “desorganización”) del lenguaje ensamblador. Por ejemplo las clases estáticas con sus propiedades también estáticas funcionan como variables globales en C y C++, son accesibles desde cualquier parte del programa. Estas propiedades estáticas en el frontend se cambian de nombre a uno válido para el programa ensamblador, y se agrupan en una sola clase que más tarde en el backend específico para la arquitectura de destino se convertirán de golpe a variables globales en lenguaje ensamblador. La idea es que a partir del ejecutable de .NET generado por el compilador de C#, VB.NET o el lenguaje que sea, se genere un segundo ejecutable de .NET tan válido como el primero pero estructurado de manera que sea mucho más fácil convertirlo a lenguaje ensamblador, eliminando la complicada estructura original del ejecutable y además optimizando el código para todas las arquitecturas, es decir, optimizaciones que son válidas para cualquier arquitectura de destino, y no dependen de ninguna en particular. Las optimizaciones específicas para cada arquitectura se procesarán en el backend.

Por si a alguien le parece extraño que diga “ejecutable de .NET” que sepa que el compilador del lenguaje de alto nivel utilizado (C#, VB.NET,C++/CLI, nemerle…) lo que genera no es código máquina, sino un “.exe” que aunque comparte la extensión de los ejecutables nativos de Windows NO lo es, sino que es un archivo que contiene, entre otras cosas, el código en lenguaje intermedio (CIL) que para ser ejecutado debe ser interpretado por una máquina virtual o CLR (Microsoft .NET, mono, Portable .NET…).

No me extiendo más, porque para eso está la documentación para desarrolladores.

, ,

1 Comment


Hola Mundo

Mi primer mensaje a dos semanas de comenzar el concurso… que nadie se piense que lo he dejado de lado, es que estos días me ha pillado muy ocupado. Ya he terminado, me he estado organizando y ya está todo listo para empezar. La idea global del desarrollo del proyecto está lista (aunque seguro que cambio bastantes cosas según voy avanzando) y me acabo de registrar en la forja de rediris.

Todo lo que haga (sobre todo la documentación) lo publicaré en la web oficial del proyecto: http://en.pigmeo.org
En http://es.pigmeo.org está la versión en español para más adelante traducirlo todo tranquilamente, pero de momento todo lo publicaré en la web en inglés, tengo que centrarme en picar código y documentar, y no en traducir.

Sobre la forja: intentaré utilizar la menor cantidad de recursos posibles de rediris porque seguramente tras terminar el concurso migre a un sitio más “internacional”. Espero que esto no influya demasiado en la calificación final. Cosas como documentación para usuarios, documentación para desarrolladores, lista extendida de características, enlaces a todas las partes del proyecto (foros, listas de correo…) y demás cosas iran publicadas directamente en el sitio web oficial.

No Comments