Lenguajes, lenguas y dialectos

o García Morales

Case Reas y Ben Fry, en su libro Processing. A Programming Handbook for Visual Designers and Artists sugieren Como los lenguajes humanos, los lenguajes de programación pueden ser agrupados en conjuntos relacionados

Esta conexión podría sugerir una conexión más fuerte, pero no es así. El desarrollo de los lengua­jes de programación nada o poco tiene que ver con sus parientes humanos. De hecho, los len­guajes de programación se parecen mucho más entre sí, son muchos menos y, se puede decir sin herrar demasiado, que tienen casi las mismas raíces; a diferencias de las lenguas.
Se estima que, en las casi 200 naciones del globo, se hab­lan más de 5000 lenguas y 41000 dialectos mientras que existen sólo unos cientos lenguajes de programación dife­rentes producidos por menos de una cuarta parte de todas las naciones.
Según la Wikipedia un lenguaje de programación es un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones, y es utilizado para controlar el comportamien­to físico y lógico de una máquina.

Los ciento y un lenguajes de programación

Mucho han cambiado las cosas desde que IBM lanzó el primer computador personal pero, probablemente, el cambio de mayor impacto en todo este tiempo es que, debido al acelerado desarrollo de la electrónica, las comunicaciones y la informática (lo que hoy se da en llamar TIC, Tecnolo­gías de la Información y Comunicaciones), ha puesto en manos de cualquier ciudadano de a pie, el computador distri­buido más potente del mundo: internet. Cualquier computador tiene varios Giga hertzios de frecuencia en su reloj, o varios procesadores pero incluso, cuando ni aún así es suficiente, siempre se puede echar mano a miles, incluso millones, de computadores distribuidos por todo el mundo, dispuestos a compartir algún tiempo de proceso y garantizar la potencia de proceso requerida.
En el año 2004, O’Reilly diseñó un poster genial de la historia de los lenguajes de programación, donde muestra 50 años dorados, desde 1954 hasta 2004, en el ámbito de la programación (El poster se puede descargar en http:// oreilly.com/news/graphics/prog_lang_poster.pdf ). Por supues­to, no son todos los que están, ni están todos los que son (se­gún O’Reilly son los lenguajes de programación más impor­tantes); sin embargo, lo más interesante de este poster, es que muestra las derivaciones de los distintos lenguajes para crear otros (sus raíces). Por ejemplo, C#, se basa en C++ y Java2. C++, a su vez, se basa en C y Simula que, a su vez, vienen del Algol que proviene de Fortran y Fortran… es el primer lenguaje de programa­ción de alto nivel. Esta evolución evidencia las grandes similitudes y parentescos de la mayoría de los lenguajes entre sí. Los lenguajes se pueden relacionar en con­juntos según su nivel de abstracción, entorno de desarrollo, forma de ejecución o paradigma de programación.

Nivel de abstracción

El nivel de abstracción está relacionado con la capacidad del lenguaje de ocultar los detalles del ordenador. Los lenguajes de alto nivel están formados por elementos de lenguajes naturales, como el inglés. Sin embargo los lenguajes de bajo nivel interactúan con todas las especificidades del procesador (registros, operaciones, etc.). Las instrucciones del len­guaje de máquina son cadenas binarias (0 y 1) directamente legibles por la máquina (procesa­dor) o completamente incomprensibles (o in­tratables) para cualquier ser humano (Es im­portante tener en cuenta que todos los lengua­jes operan, finalmente, a nivel de código de máquina. La función última del compilador o intérprete es la conversión a lenguaje de máquina).

Entorno de desarrollo

Los lenguajes pueden ser textuales o visuales. El conjunto de símbolos y reglas sintácticas y se­mánticas que definen un lenguaje normalmente se pueden expresar textualmente. Sin embargo, los entornos visuales pretenden ayudar a aque­llos programadores que piensan espacialmente y prefieren organizar sus pensamientos como relaciones visuales entre elementos.

Forma de ejecución

Los lenguajes pueden ser compilados o in­terpretados. El compilador es un programa que traduce el código escrito con determina­do nivel de abstracción a código de máqui­na. Sin embargo los lenguajes interpretados no son compilados sino interpretados por otro programa mientras corre. Los lenguajes compilados son más rápidos mientras los programas interpretados pueden ser modifi­cados mientras corren. El refinamiento de tal intérprete ha derivado en máquina virtual. El lenguaje es pseudo compilado a un có­digo intermedio (byte code) que corre en la máquina virtual. Esta técnica facilita la por­tabilidad del código entre las diferentes ar­quitecturas o hardware.

Paradigma de programación

El paradigma de programación representa un enfoque particular o filosofía para la construcción del software. Según tal, los lenguajes pueden ser imperativos o procedimentales (es considerado el más común y está represen­tado, por ejemplo, por el C o por BASIC); funcionales (expresivos y matemáticamente elegantes; por ejemplo LISP); lógicos (cuya característica principal es la aplicación de las reglas de la lógica para inferir conclusiones a partir de datos; por ejemplo PROLOG); u orientado a objetos (este paradigma usa objetos y sus interacciones y está basado en varias técnicas, incluyendo herencia, modula­ridad, polimorfismo y encapsulamiento). Un lenguaje completamente orientado a objetos es Smalltalk.
Si bien puede seleccionarse la forma pura de estos paradigmas, a la hora de programar, en la práctica lo habitual es que se mezclen, dando lugar a la programación multiparadigma.

pilares del lenguaje

Ante el desafío de la realización de un pro­yecto una de las preguntas necesarias, tarde o temprano, es, cuál es el lenguaje adecuado. La respuesta no es fácil y depende de muchos factores. Según se baja el nivel de abstracción los programas son más específicos y difíciles de mantener. Depende del grupo de desarrollo condicionará el entorno (y con ello las herra­mientas de trabajo). ¿Compilado? ¿Interpre­tado? Los lenguajes interpretados son más adecuados para pruebas rápidas. Sin embargo, cuando se requiera toda la eficiencia, habrá que utilizar algún lenguaje compilado. Por último, cuál paradigma será el más adecuado. La res­puesta es: depende del problema.
Esto podría conducirnos a alguna con­clusión del estilo: Hay tantos lenguajes como problemas; e incluso, si el problema es muy complejo probablemente se necesite del uso de más de un lenguaje para abordarlo. Sin embargo la respuesta no es tan simple y es necesario agregar algunas variables más.

Reusabilidad

Un lenguaje se hace potente en la medida que crece; propiedad que finalmente se puede tra­ducir en un buen soporte (muchas funciones y mucha gente detrás resolviendo proble­mas). Las funciones se agrupan en librerías o bibliotecas de funciones. Su potencia depende de quién las mantenga y desarrolle (los proyectos de software libre son mante­nidos por un mayor número de personas sin presiones comerciales). Su interacción con el lenguaje depende de la tecnología software (incrustada junto con el código, dinámica­mente, distribuido, etc.). Desde este punto de vista ¿se podría considerar que C# es un C++ bien soportado?

Disponibilidad

Relacionada con el entorno (arquitectura hard­ware y software). Los lenguajes, y sus respectivos compiladores o intérpretes, están dispo­nibles para determinados entornos con, posi­blemente, ciertas restricciones de uso. Aún cuando, presuntamente, el lenguaje más ade­cuado para nuestro problema sea X, la indis­ponibilidad de las herramientas de desarrollo para el entorno seleccionado será motivo, más que suficiente, de rechazo. La disponibilidad se puede ver igualmente al revés. Suponga que el entorno de trabajo es un navegador web; la aplicación será utilizada vía HTTP. El lenguaje de desarrollo estará limitado por los lenguajes implementados por el navegador (y lo utilizo en modo genérico porque unos a otros convergen en la medida en que se ha­cen compatibles). De nada vale que sea más adecuado programarlo en LISP si luego no encontramos ningún navegador que permita incorporar un intérprete LISP o, lo que es más grave, si el navegador que utiliza la mayoría de los clientes, no lo tiene.

Durabilidad

El propio poster de O’Reilly muestra el ciclo de vida completo de los lenguajes que referen­cia (al menos hasta el 2004). Es fácil ver cómo muchos se convierten en otros y mueren. Qué pasa si la aplicación que queremos desarro­llar simplemente ponga a prueba el paso del tiempo. Qué pasa con aquellas aplicaciones que duran. Cómo elegir un lenguaje duradero. Por muchos lenguajes que existan pocos han resistido al paso del tiempo. Un buen ejemplo de ello es el lenguaje C. De hecho, se podría hacer en C absolutamente todo lo que en C++ con muy poco esfuerzo. ¿Qué es lo que ha hecho a C tan resistente? Probablemente la conjunción de un buen diseño del lenguaje, la gran disponibilidad de herramientas y li­brerías y una buena desconexión con la en­trada/salida.

Pocos son más

Un buen amigo dice que los lenguajes son necesarios para garantizar la variedad (tam­bién para dar de comer a los informáticos) y probablemente tenga algo de razón; pero los lenguajes no son lenguas, ni razas, ni socie­dad, sino instrumentos para programar los pro­cesadores de propósitos generales y garantizar determinado funcionamiento. Sacaremos ma­yor rendimiento a un lenguaje con un dominio perfecto de su sintaxis, reutilizando códigos y fortaleciéndolo.
Supongamos por un momento que dispo­nemos de las herramientas necesarias, para cualquier entorno; para elegir libremente el lenguaje adecuado. Suponga que podemos dividir en tres el nivel de abstracción de las aplicaciones; algo así como bajo, medio y alto. El nivel bajo requiere de un control absoluto del hardware, traducible en código máquina (lenguaje ensamblador) o C, que nos permitirá hacer el mismo trabajo (incluso incluir partes críticas del código en lenguaje ensamblador) con un nivel de abstracción mayor. Para nivel medio el C sería también un excelente candi­dato, incluso si se quiere emplear el paradigma de programación orientado a objetos pero C no es interpretado. Para muy alto nivel probable­mente sería recomendable LISP, con cierto solapamiento con C.
LISP es un lenguaje funcional (utiliza las propiedades matemáticas de las funciones) y multiparadigma, de alto nivel; simbólico (utiliza el símbolo como unidad fundamental) de procesamiento de listas (LISt Procesing); muy flexible (utiliza la misma estructura para datos y código; una de las características de LISP es la posibilidad de tratar las propias funciones como datos (50 años después resulta que es posible considerar XML, tan de moda para el intercambio de datos entre verlo como una máquina virtual susceptible de correr en entornos de bajo nivel de abs­tracción. Como hemos supuesto una buena reusabilidad se da por hecho un buen sopor­te para todo tipo de aplicaciones: web, SOA, imagen y sonido, compiladores, procesa­dores de texto, entornos multiplataforma, matemáticas, etc. y, lo que es más importan­te, un buen soporte de la comunidad de soft­ware libre.

Concluyendo

La diversificación de los lenguajes de pro­gramación es necesaria en la medida que introduzca nuevos paradigmas, debilite la dependencia con los sistemas operativos (potencie multiprocesamiento, distribución y con ello la generalización de entornos de operación), y otras muchas razones. No así la transmisión de sintaxis, o la imposición de determinados usos o tecnologías por razones comerciales; con la excusa de fa­cilitar el trabajo del programador, etcétera. Los ejemplos utilizados en este artículo pretenden demostrar que muchos de los lenguajes más antiguos (como LISP y C) si­guen siendo igual de potentes y útiles, y po­co o nada tienen que envidiar a los últimos de moda; sin embargo la diversificación de los entornos o herramientas no es tan con­siderada como la de los lenguajes. Si con­siderásemos los lenguajes como criaturas y los entornos… vitales, es fácil establecer la conexión. Desde ese punto de vista, po­tenciando el entorno, probablemente en el poster de O’Reilly, 50 años después, las fle­chas serían más largas y menos conectadas entre sí. Sin embargo la naturaleza sigue su curso. ¿Cuál será la próxima bestia?

Quote of the Day:
After three days, fish and guests stink.
–John Lyly