Wednesday, April 2, 2008

¿Qué diablos es LayerD?

Si ingresaron a esta página por error, o porque alguien más le paso el link pero nunca antes habían escuchado sobre el proyecto LayerD, nunca visitaron su sitio web, o si visitaron su sitio web pero no entendieron nada y no quieren leer durante horas para saber que diablos es esto del proyecto LayerD, intentaré explicarlo en esta entrada lo más sintético posible.

Desde que inicie el proyecto LayerD en su forma actual alrededor del 2002 siempre se me complico a la hora de explicarlo, sus alcances y su razón de ser. De hecho me ha resultado casi imposible poder ponerlo todo de una forma coherente y creíble en un paper de 10 páginas.

He escuchado de todo cada vez que una persona lee algo de la página del proyecto y me cuenta lo que opina o lo que entendió.

Cosas como:
- LayerD es un traductor de código.
- LayerD te permite escribir un programa en .NET y ejecutarlo en una JVM.
- LayerD es un procesador de templates.
- LayerD es basura.
- No entiendo cual es el sentido de hacer tanto lío!!
- LayerD es como .NET pero sirve para Java.
- Que es LayerD es lo mismo que LayerD D++?
- LayerD es un traductor de lenguajes.

La verdad que al escuchar cada una de esas "conclusiones" me daba cuenta lo mal explicado - o lo difícil que es explicarlo en ocasiones - y la verdad es que explicar que es LayerD de una manera sencilla depende del nivel de conocimientos. Si pregunta un estudiante de ingeniería en sistemas o un programador aficionado que sólo a usado lenguajes como Java, .NET, C++, Visual Basic, la respuesta es de una forma. Si pregunta un programador experimentado en lenguajes dinámicos como Lisp, Ruby, Python, Smalltalk la respuesta es más sencilla en cierto punto. Si pregunta una persona con experiencia y conocimientos en meta-programación, lenguajes dinámicos, programación declarativa, intencional u orientación al lenguaje entonces la respuesta es más fácil.

Por tanto voy a responder a la pregunta de ¿Qué diablos es LayerD? teniendo en cuenta estas clasificaciones.

Y si quieren una respuesta lo más escueta posible y exacta la respuesta es:
  • LayerD es un framework que permite desarrollar software realmente abstracto.

Ahora las respuestas para las clasificaciones anteriores, aunque quizás no sea mala idea leerlas a todas:

  • Si conoces sobre meta-programación, programación declarativa, MOPs, paradigmas como orientación al lenguaje y programación intencional: LayerD es un framework compuesto por múltiples lenguajes de alto nivel - los cuales aislan de una sintaxis en particular - y un lenguaje intermedio común denominado lenguaje Zoe el cual posee capacidades de meta-programación completas en tiempo de compilación y una generación de código modularizada. Las capacidades de meta-programación del lenguaje intermedio Zoe permiten desarrollar fácilmente DSLs, nuevas construcciones semánticas y programar cualquier tipo de análisis y transformación en tiempo de compilación utilizando un árbol sintáctico abstracto marcado semánticamente. Los múltiples lenguajes de alto nivel como entrada además de permitir aislar al programador de alto nivel de una sintaxis en particular permiten utilizar de forma sencilla "skins" de lectura teniendo en cuenta que el lenguaje común intermedio (Zoe) es xml. La generación de código es completamente modular y es posible "enchufar" módulos para integrar diferentes runtimes ya sean nativos, maquinas virtuales, interpretes, etc. Por todas estas características LayerD permite utilizar múltiples paradigmas - aunque esta basado en orientación a objetos - y además desarrollar software multiplataforma real.
  • Si conoces sobre lenguajes dinámicos como Smalltalk o Lisp: LayerD posee multiples lenguajes de alto nivel, por tanto se puede programar con diversas sintaxis. Sin embargo, todos los lenguajes de alto nivel generan el mismo código intermedio: código en lenguaje Zoe. El lenguaje Zoe posee en tiempo de compilación - esto es mientras se esta compilando, no en tiempo de ejecución - características "similares" a los lenguajes dinámicos que te permiten examinar y modificar el programa que se esta compilando - obvio que de forma controlada - permitiendo realizar muchas de las cosas que se pueden hacer con un lenguaje dinámico pero mientras se compila el programa, luego en tiempo de ejecución se usa un runtime nativo y estático - a no ser que no querramos - por lo tanto no tiene penalidades de performance en tiempo de ejecución. A diferencia del común de los compiladores la generación de código e importación de tipos esta modularizada, por tanto enchufando modulos para diferentes runtimes puedo utilizar todo lo que ya existe en runtimes existentes como .NET, Java o el API nativa de un sistema operativo. Todas estas herramientas - más otras características - nos otorgan un balance entre la flexibilidad de los lenguajes dinámicos y el rendimiento de los lenguajes estáticos. En LayerD es relativamente sencillo programar lenguajes de dominio especifico, extensiones semánticas y técnicas de programación orientada a aspectos y declarativa. Como el árbol sintáctico en tiempo de compilación posee información semántica es posible realizar multitud de análisis en él.
  • Si es un estudiante o programador en lenguajes "populares" como Java, C++, Visual Basic, C# y no conoce demasiado sobre lenguajes dinámicos o funcionales o meta-programación y paradigmas como la programación declarativa u orientada al lenguaje: Es usted la clase de persona a la cual le costará más llegar a entender LayerD pero por sobre todo llegar a comprender la clase de cosas que es posible programar con esta tecnología. Pero no se impaciente. En primer lugar en LayerD se puede programar en varios lenguajes de alto nivel, y cualquier empresa o persona puede desarrollar su lenguaje de alto nivel para LayerD, esto es comparable a .NET donde se poseen multiples lenguajes y todos generan código intermedio para el mismo runtime - ok JIT compiler jeje. En LayerD todo programa compila a un lenguaje intermedio denominado Zoe, dicho lenguaje posee un compilador modular al cual se le pueden programar "funciones adicionales" y se puede seleccionar la generación e integración con diversos runtimes como una JVM o un .NET runtime o directamente generar código nativo para un sistema operativo y plataforma de hard. Las "funciones adicionales" que se pueden programar en el lenguaje central a LayerD - y por tanto ser compartido por los lenguajes de alto nivel - pueden pensarse como nuevas estructuras semánticas. Por ejemplo, digamos que nuestro lenguaje de alto nivel posee nativamente un ciclo for común, pero no un ciclo for automático para colecciones, en LayerD se puede extender el compilador central para incluir un ciclo for para colecciones. Otro ejemplo, si deseo una instrucción que me permita ejecutar de forma concurrente - en hilos separados - una serie de instrucciones simplemente programo una extensión para el lenguaje Zoe - el lenguaje intermedio común - y utilizo esta nueva funcionalidad en cualquier lenguaje LayerD de alto nivel.
Es difícil decir si estas explicaciones son suficientes, por las dudas enumero algunas de las cosas que nos permite hacer LayerD al programar:

  • Utilizar un sólo lenguaje de alto nivel y hacer programas para diferentes runtimes como JVM, .NET o código nativo.
  • Hacer programas multiplataforma, es decir programas que escribo una vez y compilo para diferentes runtimes. Por ejemplo, un programa que compile nativamente para .NET, Java y código nativo sin ningún cambio en el código fuente.
  • Implementar Lenguajes de Dominio Especifico, como lenguajes para describir interfaces gráficas, lenguajes para describir modelos de entidades con sus relaciones y que implementen automáticamente todo el acceso a datos, lenguajes para chequear reglas de negocios, generar web-services, etc.
  • Hacer análisis de código en tiempo de compilación emitiendo errores, advertencias y notificaciones al programador.
  • Forzar reglas semánticas más estrictas a los programadores de alto nivel mediante una extensión para el compilador. Por ejemplo forzar a cumplir la arquitectura en capas o no utilizar campos públicos.
  • Realizar cualquier proceso de meta-programación durante el proceso de compilación.
  • Crear programas que se corrigen a si mismos durante la compilación y corren en tiempo de ejecución sin penalidades ni errores.
  • Me permite utilizar mis componentes desde diferentes lenguajes de alto nivel con diferentes sintaxis.
  • Permite utilizar una sintaxis para escribir los programas y otras diferentes para leerlos.
  • Permite reutilizar todo el código existente, no se deben volver a escribir librerías!!! se puede usar lo que ya existe en .NET, Java o la plataforma a la cual apuntemos nuestro software.
  • Permite desarrollar "librerías activas", esto es librerías que analizan la forma en la que son usadas en el programa cliente y corrigen su utilización o emiten advertencias y consejos, por que no, librerías que chequean vía Internet la compatibilidad con el programa escrito.
  • Permite desarrollar herramientas RAD de forma independiente al entorno de programación, como herramientas de refactoring o templates de código.
Tal vez, encuentre todo esto como exagerado pero a lo largo de los post en éste blog iré mostrando ejemplos de cada uno de los tópicos y le proporcionare las herramientas básicas para que usted mismo pueda realizarlo.

En estos días sólo tendrá acceso a los binarios de LayerD si es mi amigo :-), si no lo es tendrá que esperar unas semanas, prometo - y siempre trato de cumplir mis promesas - que para fin de mes publicare los binarios que tenga del proyecto LayerD, así en mayo ya podremos empezar con los ejemplos y uds. seguirlos.

No están publicados aún porque se encuentran en desarrollo, sin embargo para su tranquilidad le cuento que ya lo estamos usando en un proyecto de producción real y funcionan lo suficientemente bien como para "dejarse usar". Los fuente se iran liberando en la comunidad open source de a poco, la razón de no liberarlos ahora es muy sencilla, no quiero liberar código que no tenga cierta mínima calidad y nivel de avance en cuanto a la funcionalidad.

De acuerdo a su nivel de conocimiento puede tener mucho que aprender - o no - para explotar LayerD al máximo, sin embargo para empezar a usarlo y beneficiarse de a poco de las técnicas de meta-programación, orientación a aspectos, programación declarativa y custom DSLs no debe aprender nada fundamentalmente nuevo, ya que podrá utilizar todo lo que ya conoce en su plataforma ya sea .NET o Java.

Saludos!

2 comments:

Unknown said...

Interesante la propuesta de LayerD, una de las preguntas que surjen tras leer este material, es para que se podria utilizar LayerD. Cuando me refiero al: "para que?" no me refiero a la posibilidad de colocar reglas semánticas estrictas para forzar a cumplir la arquitectura en capas u otra "feature" de LayerD sino a 'para que?' dentro de la industria de software se podria utilizar.
Por otra parte existe algun caso de exito del framework?

Alexis Ferreyra said...

César, gracias por el comentario. Tu pregunta sobre "para que usar LayerD en la industria del software" me resulta muy interesante y no por ello sencilla de responder. El fin último de LayerD es permitir a la industria del software escribir un soft hoy y reutilizarlo dentro de mucho tiempo (decadas) sin cambios, o al menos extender el tiempo de vida de un soft a lo máximo que lo permita su diseño original. Hoy en día implementas un software y en general su tiempo de vida esta límitado al software de base o middleware que usas porque no existe una forma sencilla de transformar y reutilizar código de una manera automatizada. Otra cosa para la cual se puede usar LayerD en la industria es para integrar herramientas, al usar LayerD no necesitas tener analizadores de código separados, herramientas de refactoring separadas, versiones de código diferente para diferentes plataformas, podes tener una versión única de alto nivel y componentes que la adaptan a los detalles de las plataformas (hoy en día se puede hacer eso tambien pero es mucho más trabajo). Pensemos por ejemplo en los trabajos que se estan llevando a cabo en la actualidad para hacer a los lenguajes "mainstream" más fáciles de usar para programar en entornos concurrentes - fundamentalmente aprovechar procesadores de muchos núcleos -, en general se deben programar nuevos compiladores y actualizar los entornos, con LayerD no son necesarios nuevos compiladores o entornos basta con una extensión para el lenguaje intermedio y a lo sumo un nuevo modulo de salida. Otra aplicación en la industria es la posibilidad de empezar a utilizar de manera más masiva paradigmas como la programación declarativa - en el pasado se han intentado muchas veces cosas similares no siempre con éxito.
En cuanto a tu pregunta sobre si existe un caso de éxito del framework te comento que a pesar de ser las herramientas sumamente incipientes el primer caso de éxito será el proyecto "JANUS" que ambos conocemos muy bien jeje. En el cual estamos aplicando una buena dosis de programación orientada al lenguaje (o declarativa como quieran llamarla).
Finalmente, quiero decir que LayerD otorga muchas posibilidades y herramientas que "en teoría" deberían ayudar abrir muchas puertas y posibilidades, pero es difícil decir lo que ocurra y será muy interesante ver el feedback de la gente cuando empiece a experimentar con ello. Bueno espero estos comentarios respondan al menos en parte tu pregunta, la verdad que hablar sobre las aplicaciones de LayerD en la industria requiere de por si todo un articulo, pronto expandiré este tema en el blog, pero me gustaría hacerlo con ejemplos prácticos y no en abstracto.