sábado, 25 de octubre de 2008

Desarrollo de software multiplataforma


El Software Multiplataforma


Desde el advenimiento de los sistemas operativos basados en GNU/Linux, los programadores se han dado cuenta que programar para un sistema operativo específico es una pérdida de tiempo. Considerando que los sistemas operativos tipo Unix son cada vez más populares, tales como GNU/Linux, Macintosh y otros, es mejor para un programador dominar aquellas herramientas de programación que le permitan portar sus programas entre varias plataformas sin tener que invertir mucho tiempo en reescribir el programa.
Se entiende por software multiplataforma a aquel software que tiene versiones para varios sistemas operativos y arquitecturas de hardware. Una definición más extensa se puede leer en la wikipedia, en http://es.wikipedia.org/wiki/Multiplataforma .

Para los usuarios no relacionados a la actividad informática las computadoras solo funcionan con Windows y los procesadores son Intel o AMD. Los usuarios que por su trabajo necesitan usar otros sistemas operativos y arquitecturas saben que exiten sistemas operativos como Unix, Linux, Mac OS, y que estos pueden funcionar hasta en otra clase de procesadores.

Aunque parezca sorprendente, muchos desarrolladores de programas también desconocen la existencia de otros sistemas operativos y de otras plataformas de hardware. Solo desarrollan programas para Windows, y conocen solo las herramientas de desarrollo de Microsoft.

Este desconocimiento por parte de usuarios y desarrolladores de la existencia de otros tipos de computadoras y programas es causa y consecuencia del predominio de Windows en el mercado de computadoras.

Sin embargo, y acompañando el auge de los sistemas operativos basados en GNU/Linux, el desarrollo de software orientado a múltiples plataformas se revela como criterio de diseño
fundamental en la ingeniería de software, aún cuando la plataforma principal no sea GNU/Linux.

Compiladores multiplataforma

La herramienta "primera" para crear programas de computadoras son los compiladores. Estos programas son los que permiten crear otros programas. Sin ellos, programar sería un proceso muy lento e ineficiente. Sugiero al lector interesado visitar http://es.wikipedia.org/wiki/Compiladores para una descripción más extensa de lo que son los compiladores.

Por su naturaleza, cada compilador está íntimamente ligado al tipo de hardware y al sistema operativo para el que está diseñado. Por lo tanto, escribir compiladores multiplataforma es la tarea más difícil en la ingeniería de software, ya que el compilador debe resolver de una manera autoconsistente y correcta todas las diferencias entre plataformas, de manera que al programador le queden ocultas todas estas diferencias.

Pese a la cantidad de sistemas operativos y arquitecturas de hardware vigentes, existe un compilador, o más bien una suite de compiladores, que ha tenido éxito en una gran cantidad de hardware y sistemas operativos. De hecho, debe ser el compilador más exitoso en la historia de la computación. Se trata de la suite GCC, desarrollado por la Free Software Foundation como primer paso para la creación del sistema GNU. Más información en http://es.wikipedia.org/wiki/Colecci%C3%B3n_de_compiladores_GNU .

La suite GCC es usada por la mayoría de los sistemas operativos tipo Unix, y puede crear programas para más de 40 tipos de CPU, incluídos microcontroladores. Tambien funciona en Windows, y es capáz de crear aplicaciones para Windows desde otras plataformas. Esto dá cuenta del éxito del diseño multiplataforma de GCC.

Escribir una vez, compilar en cualquier lado

La ventaja principal de usar compiladores multiplataforma es que el programador debe escribir el programa una sola vez. Cada vez que necesite una versión para una plataforma en particular, solo deberá recompilarlo usando la versión de compilador específica para esa plataforma a partir del mismo código fuente.

Llevando el diseño multiplataforma al extremo, algunos compiladores están desarrollados a tal punto que es posible compilar un programa destinado a una plataforma desde otra plataforma muy distinta. Por ejemplo, aplicaciones como Firefox pueden ser compiladas desde Linux para generar una versión que funciona en Windows. Este proceso se llama crosscompiling. Se puede aprender sobre el tema en la wikipedia, en http://en.wikipedia.org/wiki/Cross_compiler .

En contraste, los programadores de Visual Basic (o Visual Studio) encuentran imposible crear aplicaciones para Linux, Macintosh, u otro sistema operativo usando el mismo código fuente, ya que las herramientas que usan solo compilan programas para los sistemas operativos Windows.


Diferencias entre plataformas

Si bien los compiladores se encargan de abstraer la mayoría de los detalles internos del sistema operativo para el que se escribe, algunas veces es necesario que el programador haga llamadas al sistema que no están contempladas en el compilador. Esto es común, pero solo en casos de relativa importancia, tales como consultas sobre localización de los directorios para archivos temporales, directorios del usuario, etc.

Windows, siempre windows

De los sistemas operativos de uso más común, el único que no cumple con lineamientos estándares es el sistema operativo Windows. En todas sus versiones, está diseñado deliberadamente para excluír o al menos dificultar la aplicación y el uso de estándares y herramientas de desarrollo multiplataforma. De hecho, desde los tiempos de DOS Microsoft incluye en sus sistemas funcionalidades no documentadas, con el único propósito de otorgar ventaja a sus propios productos de software frente a productos de desarrolladores independientes. Aún cuando los programadores siempre supieron esto y hasta documentaron extraoficialmente las funcionalidades ocultas, es ilegal hacer uso de ellas. Un sitio aquí dá cuenta de ello.

Sin embargo, los desarrolladores de compiladores han sido ingeniosos y han logrados sortear los obstáculos técnicos y campos minados legales inherentes a la arquitectura de los sistemas operativos WIndows.

Interfaces gráficas

Para el usuario de las herramientas de desarrollo de Microsoft, no existe una división entre el sistema operativo y la interfaz gráfica. Este deliberado error de concepto funciona como obstáculo para la migración de programas desde Windows a otros sistemas operativos.

En sistemas tipo Unix (GNU/Linux, Mac OS, BSD) la separación entre sistema operativo e interfaz gráfica es fundamental. Este aspecto de modularidad de Unix devino en el desarrollo de múltiples herramientas de software para la implementación de interfaces gráficas. Si bien esta diversidad resultó ser una desventaja en los comienzos del desarrollo de Unix como estación de trabajo, hoy en día muchas de esas tecnologías convergen en lo que hoy conocemos como Servidor X, http://es.wikipedia.org/wiki/Sistema_X_Window en la wikipedia.

Con el Servidor X quedaron resueltos los problemas de estandarización de los mecanismo para programar aplicaciones gráficas. Pero todavía queda una capa de software a resolver: los widgets, u objetos de control gráficos.

Los widgets u objetos de control gráficos

Al decir widget, nos referimos a los elementos gráficos de un programa tales como botones, barras de scroll, contenedores de texto, menúes, etc.

Como es de esperar en la tradición del desarrollo del software libre, existen muchas implementaciones de widgets. Las más populares son las que proveen las bibliotecas Gtk y las bibliotecas Qt. Como toda buena herramienta de programación, las bibliotecas Gtk y Qt son multiplataforma.

En cuanto a widgets, Windows no deja de ser una excepción. Posee su propia colección de widgets, exclusiva de Windows. En contraste, las bibliotecas Gtk y Qt están escritas de manera que ocultan al desarrollador la plataforma final. Incluso al crear una aplicación para Windows, todas las llamadas e interacciones con widgets Gtk o Qt hacen una traducción en tiempo de ejecución para conectarse y usar los widgets de Windows.

Crear aplicaciones que usan Gtk o Qt es crear aplicaciones multiplataforma que además pueden ser compiladas para Windows.

Para conocer más sobre Gtk y Qt, leer http://es.wikipedia.org/wiki/GTK%2B y http://es.wikipedia.org/wiki/Qt_(biblioteca) .

Manos a la obra

Resumiendo lo dicho en párrafos anteriores, lo que necesitamos para crear una aplicación multiplataforma es:
  • Un compilador multiplataforma
  • Una colección de widgets multiplataforma
  • Un entorno de desarrollo
Mi compilador y colección de widgets favoritos

Hasta ahora solo he mencionado a GCC como herramienta para la creación de programas multiplataforma. Si bien el lenguaje C es el más difundido para la creación de sistemas operativos, existen alternativas tan útiles y efectivas como la suite GCC para la creación de aplicaciones gráficas.

¿Es posible encontrar una herramienta que reúna al mismo tiempo un compilador y una biblioteca de widgets para la creación de software multiplataforma? Si, y se llama Freepascal.

En rigor, Freepascal no provee de una biblioteca de widgets, pero ofrece todas las herramientas y artefactos de computación necesarios para la creación de conjuntos de widgets usando el compilador, sin necesidad de bibliotecas externas.

La biblioteca de widgets más popular escrita para usar el compilador Freepascal, es la herramienta Lazarus. Lazarus provee, al mismo tiempo, una biblioteca de widgets y un entorno de desarrollo.

Para conocer más sobre Freepascal y Lazarus, leer en http://es.wikipedia.org/wiki/Free_Pascal y http://es.wikipedia.org/wiki/Lazarus .

Freepascal y Lazarus permiten desarrollar aplicaciones del tipo :
  • Drivers, daemons y otros programas de sistema
  • Aplicaciones de consola
  • Aplicaciones gráficas. Lazarus puede conectarse a Gtk, Qt y a otros widgets multiplataforma. De hecho, Lazarus recurre a estas bibliotecas para la creación de los widgets. De esta forma es posible elegir el widget final en tiempo de compilación.
  • Aplicaciones web. Freepascal provee de herramientas para la creación de aplicaciones CGI.
  • Aplicaciones CGI en la forma de módulos Apache
  • Conexión a bases de datos locales y externas, embebidas o de la forma cliente-servidor. Como provee de un conector ODBC, Freepascal puede conectarse virtualmente a casi todas las bases de datos.
  • Aplicaciones cliente-servidor mediante conexiones de red UDP.

Conclusión

Solo hay una forma de escribir código fuente: orientado a múltiples plataformas.



Adenda

Las técnicas de programación multiplataforma se conocen desde hace 40 años. ¿Por qué la computación dejó de lado todo ese conocimiento? ¿Por qué los programadores redescubren hoy la programación multiplataforma? La respuesta a estas preguntas se exploran en este blog, en la entrada "Desarrollo de Software Multiplataforma II".