jueves, enero 17, 2008

SILLY

No, no estoy llamando "tonto" a nadie: es el nombre que se me ocurrió para el lenguaje de descripción de escenas de XSight RT, y significa, simplemente, Small Instantiation Language... claro, añadiéndole el sufijo de los adverbios ingleses.
El caso es que se trata de un lenguaje orientado a la creación de objetos; de ahí lo de Instantiation. Resulta también que hay un gran números de circunstancias en los que esa "categoría" de minilenguajes resulta útil. ¿Quiere otro ejemplo? Ahí tiene la generación de compiladores. Freya utiliza GOLD: un sistema que recibe una gramática y produce una tabla de análisis sintáctico. Pero es más común el uso de sistemas como Yacc y Bison, que permiten asociar instrucciones en C/C++/C# a la gramática. Hace poco encontré este otro generador, de Wayne Kelly, de la Queensland University of Technology. Incluye el código fuente completo del generador, en C#, y es un código limpio y legible.
Tengo, desde hace un tiempo, la idea de ensayar el uso de un lenguaje tipo SILLY con un generador de compiladores para .NET. Como el análisis sintáctico suele utilizarse para crear, en paralelo, un Arbol de Sintaxis Abstracta (AST), el lenguaje se especializaría en la creación de objetos. Algunas ideas sencillas:
  • Nada de operador new. Cuando un nombre de tipo se usa como función, significa la construcción de una instancia.
  • El lenguaje soportaría inicializadores de objetos... al estilo Freya, claro. Es decir, se podrían inicializar campos y propiedades del objeto creado usando una sintaxis similar a la de los parámetros con nombre.
  • Cada "no terminal" de la gramática tendría un tipo de datos asociado.
  • Cada "regla", o "producción", tendría una expresión asociada, de un tipo derivado del tipo asociado al no terminal.
Veamos un ejemplo sencillo:
<Exp> ::=          : AstExp
<Exp> '+' <Term> : AstBinary($Exp, '+', $Term)
<Term> : $Term
La primera línea advierte que las expresiones van asociadas a nodos de la clase AstExp. En la segunda, cada vez que se detecta una suma, se crea un nodo AstBinary a partir de los nodos de las partes constituyentes. La tercera línea indica que se copie, simplemente, el nodo asociado al término. Este es, naturalmente, el caso más sencillo y frecuente. También es frecuente el uso de listas, por lo que esta variante de SILLY debería soportarlas:
<VarGroup> ::=         : List[AstVar]
<VarGroup> ',' <Var> : $VarGroup + { $Var }
<Var> : { $Var }
Es decir, las llaves se utilizarían para delimitar literales de listas, y el signo + significaría "unión", o concatenación de listas.
Ahora mire un "invento" curioso, asociado a la regla sintáctica correspondiente al operador existencial de Freya:

<Exp> ::= : AstExp
'*' IN <Exp> : if $Exp is AstRange
then AstBin($Exp.Lo, "<=", $Exp.Hi)
else AstExists($Exp)
Para empezar, observe que he mostrado una expresión condicional, no una instrucción condicional. Lo interesante es lo que ocurre en la rama then de la expresión: como esa rama se evalúa cuando $Exp es un AstRange, cambiamos el tipo declarado para $Exp de esa rama para abajo (en el árbol de expresiones); por eso permitimos las referencias a las propiedades Lo y Hi (low y high), definidas para AstRange. Creo que un convenio de este tipo ahorraría mucho trabajo y sería muy útil en lenguajes de propósito general... aunque tengo que pensarlo un poco más, antes de dar el recurso por bueno.
Naturalmente, se permitiría expresiones let/where, y quizás sería necesario algún "aplicador" para actuar sobre elementos de una lista. El "compilador" tendría que encargarse también de algo que podemos clasificar como inyección de código: se supone que, a la vez que se construye el árbol sintáctico, los nodos de éste deben irse asociando a intervalos o rangos de texto dentro del código fuente. A los nodos devueltos en cada reducción, por ejemplo, se les podría asociar automáticamente al rango determinado por el texto reducido. Pero habría casos más complicados:
<Exp> ::=            : AstExp
<Exp> IS NOT <Ref> : AstNeg(AstCast($1, $3))
El nodo AstNeg es el inmediatamente devuelto por la reducción, por lo que es fácil asignarle un rango. En cambio, el nodo AstCast se esconde dentro del nodo principal. Una solución laboriosa sería indicar explícitamente la asignación del rango:
AstNeg(AstCast($1, $3, Range := @1 + @3))
Este es un ejemplo de los inicializadores de objetos ya mencionados. Observe que @1 se refiere al rango asociado al primer nodo de la regla. Otra solución más elegante sería permitir que el compilador dedujese dicha asignación, a partir de los parámetros detectados en la llamada al constructor AstCast.
¿Qué le parece?

Etiquetas: , ,

6 Comments:

Blogger Ramón Argelys said...

Hola soy Ramon Garcia de Republica Dominicana soy fanatico de todos tus articulos, libros, blogs, etc...
Pido excusa de ante mano porque se que esta no es la mejor manera de comunicarse o conocerse, ademas porque no es un comentario propiamente dicho sobre el blog, pero se que te gustan los desafios y problemas a resolver por programacion actualmente estoy intenando desarrollar una aplicacion que use una terminal Verifone Omni 3750 para comunicarlo con una aplicacion hecha en delphi con base de datos Interbase cualquier ayuda sera ultil por favor en el lenguaje que sea puede ser de utilidad

Gracias y saludos!!! Suerte y exito, a la espera de "La cara oculta de C#3.0"

miércoles, enero 30, 2008 9:34:00 p. m.  
Blogger Ian Marteens said...

Hola, Ramón:

Hombre, es más sencillo si me escribes a cualquiera de las direcciones de email.

terminal Verifone Omni 3750

Lo más importante: ¿qué sistema operativo ejecuta la terminal?

jueves, enero 31, 2008 10:04:00 p. m.  
Blogger Andrés Ortíz said...

Hola Ian

Oyeme por qué nunca se te ve dando charlas en eventos de Microsoft, por qué no has sido nominado o no eres MVP? Yo te he venido siguiendo la pist desde mis inicios con C++ Builder por tú libro The Dark Side of C++... que para mí gusto es uno de los mejores libros que me he podido leer, no solo de C++ sino de todo lo que he masticado de programación.

Lo primero que te digo es porque sería genial escucharte en webcasts, verte como más cercano a la comunidad, etc etc

Un abrazo y ojala se te pueda ver por ahi más famoso dentro de la comunidad .NET que le hace tanta falta un genio como el tuyo, que me encanta como habla de temas mucho más profundos que lo que uno ve a diario.

sábado, febrero 02, 2008 6:10:00 a. m.  
Blogger Ian Marteens said...

Oyeme por qué nunca se te ve dando charlas en eventos de Microsoft

Porque no me invitan.

por qué no has sido nominado o no eres MVP?

Supongo que porque, si implica más trabajo gratuito, no me interesa. Y porque sospecho que esto de los MVPs es un círculo más o menos cerrado de amiguetes que se apoyan entre sí... y la verdad es que yo soy un lobo solitario. Si para que me den el collar antipulgas tengo que pararme no ya en las dos patas traseras, sino además en las delanteras... pues la verdad, es demasiado para un servidor.

En algún momento, hace un par de años, pedí apoyo a Microsoft Ibérica para promocionar mi libro de C#. Me respondió un buen señor que eso era imposible: que a Microsoft sólo le interesaba promocionar los libros de Microsoft Press. Le pregunté entonces cómo se podía publicar en Microsoft Press, y más o menos me dio a entender que uno, pobre mortal, no estaba a la altura.

Creo que las cosas han cambiado un poco desde entonces: los libros de Krasis, por ejemplo, tienen la bendición de Microsoft... de lo cuál me alegro, por supuesto. Ya veremos cuando salga La Cara Oculta de C# 3.0. De momento, soy optimista.

A lo mejor es un problema del título. Si el libro se llamase The Sun Always Shines on Redmond, o Happinness is a Warm C# Project, quizás todo sería muy diferente.

martes, febrero 05, 2008 2:10:00 p. m.  
Blogger Junior said...

Saludos Ian,
Creo que deberia ser al contrario y que sean ellos los que esten interesados en que tú publiques para microsoft ya que ganarian tener uno de los mejores autores de libros de sus productos y viendolo desde mi punto de vista el mejor por que eres el unico que sabes combinar los temas más complejos con relajantes celebrales que ayudan mucho a entender mejor el tema tratado.

Un saludo de José R. Castellanos

jueves, febrero 07, 2008 3:09:00 a. m.  
Blogger Andrés Ortíz said...

Ian deberías tratar que MS te apoye. Yo si admiro tus escritos, y comparados con ciertos escritos, artículos , libros de .NET de la Press y demás casas editoriales, no te llegan ni al tobillo. Gracias por ser tan crítico y sigue escribiendo mucho más. Ojala algun dia pueda lucir uno de tus libros en mi estante!!

jueves, febrero 07, 2008 5:20:00 a. m.  

Publicar un comentario

<< Home