viernes, 18 de noviembre de 2011

Lenguaje D?

Un abre bocas!...:

El lenguaje de programación D, si he de ser sincero lo he encontrado por pura casualidad, mientras fisgoneaba los Drivers de MongoDB; me quedo sonando el asunto hasta que decidí indagar un poco al respecto... Veamos así es como lo describe Andrei Alexandrescu en su libro "The D Programming Language": 
"D es un lenguaje que intenta hacer siempre lo correcto dentro de las limitaciones que eligió: acceso a los recursos de computación de alto rendimiento a nivel del sistema y similitud sintáctica con lenguajes derivados de C!..."
En cuanto a la Wikipedia esto es lo que encontramos:
"D es un lenguaje de programación de uso general desarrollado por Walter Bright cuya primera versión apareció en 1999. Se origina como un rediseño de C++, con un enfoque más pragmático, pero no es un lenguaje puramente derivado del anterior. D ha mantenido algunas características de C++ y también está influido por otros conceptos de otros lenguajes como Java, C# y Eiffel... "
Bueno pero a ciencia cierta que tiene de particular D,... que lo hace atractivo?... no es más que otro lenguaje o si?... Bueno en lo personal diré que el solo echo de mezclar soporte de código Ensamblador con características de alto nivel (Pj: Arreglos Asociativos y Manejo dinámico de cadenas) ya es suficiente como para dejarme con la boca abierta!. 


Aunque claro D posee muchos otros atributos interesantes como el echo de ser Realmente multiplataforma, ya que su compilador se distribuye de forma Equitativa para sistemas Linux, MacOsx, FreeBSD y Windows lo que garantiza que podemos generar versiones de nuestra aplicación para diferentes sistemas operativos sin cambiar una sola linea de código. Además de que su soporte para ensamblador permite escribir Drivers, Componentes de Sistema e incluso Sistemas Operativos (Como buen hijo de C); igualmente esta el asunto de poder correr la aplicación al vuelo con rdmd para chequear errores como si fuera un script, el manejo dinámico de memoria, soporte para metaprogramación (esto si que mola), generador de documentación, soporte para GUI (actualmente estable con GTK).... y bueno la lista sigue, pero no viene al caso listar todos sus atributos; para eso esta su pagina oficial: www.d-programming-language.org/ o este articulo realmente bueno aunque algo antiguo: http://juanjoalvarez.net/es/detail/2007/apr/25/el-lenguaje-de-programacion-d/.

Ahora si después de las presentaciones vayamos al grano: como instalarlo y un par de ejemplos. En cuanto a su instalación diré que lo mas sencillo es ir a la pagina oficial y descargar el paquete mas adecuado para el SO que se tenga (El paquete de Ubuntu sirve bien en Debian) y luego seguir el procedimiento habitual de instalación; naturalmente hoy en día no basta con solo el compilador estándar, hay que como mínimo contar con una librería gráfica... pues a todas estamos en la era de los gráficos; actualmente hay muchos proyectos dedicados a esto sin embargo el mas maduro y estable es GTKD que permite usar las siempre comedidas librerías GTK de forma sencilla, para conseguirlas basta con ir a la pagina oficial de la comunidad SL de D y buscar el proyecto GTKD: http://www.dsource.org/projects/gtkd, existen paquetes para Algunas distribuciones Linux y algunos binarios además de los fuentes para compilarlas en caso de tener un sistemas poco "Común". En mi caso Debian 6 AMD 64, los paquetes precompilados funcionan de maravilla, tal vez luego edite el post para explicar como compilarlo!, aunque no es nada difícil.

Ahora veamos dos ejemplos tomados de la documentación oficial; primero que todo el clásico "Hola Mundo" con un par de mejoras:

import std.stdio;

void main(string[] args)
{
    writeln("hello world");
    writefln("args.length = %d", args.length);

    foreach (index, arg; args)
    {
        writefln("args[%d] = '%s'", index, arg);
    }
}

Bien, esto si que trae recuerdos... tiempos aquellos en que C dominaba el mundo de la programación, sin embargo saltan algunos detalles a la vista que paso a detallar:

  • Linea 1: import no include?, primera diferencia con C, el motivo se debe probablemente al echo de que C/C++ realizaba una "Inclusión" de librerías y código extra al compilar la aplicación, recordemos que las librerías de C/C++ son archivos "Sueltos" no estructuras ordenadas como los paquetes de JAVA... por otro lado la notación std.stdio nos recuerda igualmente al java.paquete y es precisamente eso, esta instrucción permite importar los servicios estándar de entrada y salida disponibles en el paquete std, algo mucho mas potente y ordenado que el include de C/C++.
  • Linea 3: Definición de una función (la principal en este caso), en D las funciones tienen tipo así que por eso se antepone la palabra void (sin dato de retorno) al nombre de la función, la nostalgia de C ataca de nuevo pero desaparece al ver los parámetros que recibe la función, donde solían estar un entero y un terrorífico doble apuntador a carácter "char **argv" ahora solo queda una elegante declaración de arreglo de tipo string (cadena de caracteres) que le permite al programa recibir datos del entorno de ejecución, algo realmente útil y necesario. Esta linea define el punto de arranque del programa y si debe llamarse main igual que en C o Java.
  • Lineas 4 - 9 - 11 - 12: Son los marcadores de estructura {} comunes en la mayoría de los lenguajes, se usan para delimitar el ámbito de un estructura (for, if, while), de una función, clase o interfaz.
  • Lineas 5 - 6 - 9: writeln y writefln  son funciones que operan sobre la salida estándar (Pantalla) y sirven para mostrar (Imprimir) un mensaje en dicha salida, la única diferencia entre una y otra es la capacidad de imprimir el mensaje con formato, Color, decimales, distribución, desplegado de variables.
  • Linea 8: Este foreach recuerda mucho a PHP, y tiene la misma función; es una de esas milagrosas ventajas de alto nivel que ofrece D, permite iterar sobre un arreglo obteniendo uno a uno todos sus elementos en forma de pares (clave, valor); en este caso permite listar todos los argumentos con los que fue invocado el programa.
Para compilarlo basta con:
$dmd hello.d
O podemos ejecutarlo al vuelo (sin compilar) para probar su funcionamiento usando el comando:
$rdmd hello.d

Bueno eso es todo por el primer ejemplo, ahora vamos con el Hola Mundo Gráfico usando las librerías GTK:

import gtk.MainWindow;
import gtk.Label;
import gtk.Main;

void main(string[] args)
{
  Main.init(args);
  MainWindow win = new MainWindow("Hello World");
  win.setDefaultSize(200, 100);
  win.add(new Label("Hello World"));
  win.showAll();
  Main.run();
}

La simpleza de GTK en lenguaje D resulta sencillamente refrescante, veamos con mas detalle cada linea:
  • Lineas 1 - 2 - 3: Se usan para importar los recursos de GTK necesarios para la aplicación, en este casi una Ventana principal, una etiqueta (Label) y el recurso Main que controla el hilo de ejecución de la aplicación; Nótese que estos también siguen la notación Paquete.Recurso.
  • Lineas 5 - 6 - 13: Cumplen el mismo papel que en el caso anterior.
  • Linea 7: Inicia los servicios de GTK, es decir activa las funciones de control de recursos de la librería gráfica y queda a la espera de inicio de la ejecución. Es de notar que este método de la clase Main recibe como parámetro los argumentos que obtiene la función principal del entorno de ejecución, esto es vital para el control de ejecución.
  • Linea 8: Se crea un objeto de la clase MainWindow, la cadena de caracteres que recibe como argumento sera el titulo de la ventana, es importante resaltar que el objeto se crea mediante el operador new que reserva los recursos necesarios e inicializa el objeto en la variable win.
  • Linea 9: Se fija el tamaño de la ventana principal a 200 por 100 píxeles, el lenguaje D usa el operador Punto (.) para acceder a los métodos y atributos de un objeto.
  • Linea 10: El método add agrega un nuevo componente gráfico (botones, etiquetas, cajas de texto) a la ventana principal, en este casi se le pasa como parámetro un nuevo objeto de la clase Label a saber una etiqueta que muestre el mensaje "Hello World", resulta interesante el echo que se permite desplegar operaciones en las llamadas a métodos incluso si estas son creaciones de nuevos objetos, aunque no existe una variable que recoja el resultado devuelto por el operador new, se crea efectivamente una nueva instancia de Label que se almacena como un componente hijo de win.
  • Linea 11: La llamada a este método permite que tanto la ventana principal como todos sus componentes se hagan visibles, hasta este punto ningún elemento se visualiza, es recomendable que se llame a este método solo cuando todos los componentes hayan sido agregados y configurados apropiadamente.
  • Linea 12: Esta nueva llamada a la clase Main transfiere el control de flujo del programa al entorno de las librerías GTK y solo lo devuelve al hilo principal cuando se hayan liberado (Destruido) todos los recursos asignados a las clases GTK (Ventanas, botones, etc) esto ocurre habitualmente cuando se cierra la ventana principal de la aplicación. Es aquí donde realmente inicia la ejecución de la aplicación.
Bueno eso ha sido todo por ahora, como dice el titulo solo un "abre bocas...", lo que si es seguro es que volveré a escribir sobre este lenguaje que pinta cada vez mejor, hasta la próxima.....Paz y Suerte...........黒オオカミ

No hay comentarios:

Publicar un comentario