Sunday, February 27, 2011

Sobre la expresividad de los lenguajes de programación


En todos estos años de cómputo, he visto todo género de lenguajes de programación, desde los más simples -como Pilot- hasta los verdaderamente complejos (por su espantosa notación, por ejemplo), como Lisp o Haskell.

Hay una gama extraordinaria de lenguajes de programación. Cada uno con su propia filosofía. Por ejemplo, Forth está orientado al stack, y hay que pensar en esos términos cada vez que se quiere generar código para este tipo de lenguajes. Los hay, desde luego, unos más expresivos que otros y he ahí el parámetro para poder valorar si vale la pena utilizar uno u otro lenguaje de programación. Aunque claro, hay más parámetros en esta evaluación.

Por ello, lenguajes como Java, C, C++, C# y Pascal (ya sea Delphi, Turbo Pascal u otro que se denomine así, basándose en el librito de Niklaus Wirth "Pascal User's Manual and Report"), tienen una capacidad expresiva más o menos parecida. Es decir, el lenguaje tiene contempladas una serie de estructuras de datos que lo hacen fuerte expresivamente, esto es, nos permiten expresar nuestras ideas en el mundo de la programación de computadoras.

Por ejemplo, los lenguajes mencionados tienen capacidades para crear arreglos, dinámicos y estáticos, listas ligadas, apuntadores, etc. Esto nos permite crear programas que no utilicen toda la memoria disponible de la máquina, sino que utilicen, solamente cuando lo necesitan, la cantidad de memoria necesaria. Igualmente, hay espacio para variables globales y locales, variables tipo variant, paso por valor o por referencia, así como creación de funciones y procedimientos, etc.

Un programa popular que ilustra esto es Photoshop. Cuando uno quiere trabajar con una imagen muy grande, o hacer una transformación gráfica que requiere de mucha memoria, el programa de Adobe buscará hacerse de dicho almacenamiento para realizar la tarea encomendada. Si de pronto el sistema nota que no le alcanzará la memoria, entonces usará parte del almacenamiento en disco duro como "memoria virtual". Esto habla del poder del programa gráfico de Photoshop: hace las cosas muy bien, muy rápido y además, no se amedrenta ante imágenes gigantescas. Sin pestañear trabaja con ellas con todos los recursos que la computadora tenga a la mano.

Pero el caso de Photoshop es solamente para ilustrar la necesidad de que los lenguajes de programación sean expresivos en ese sentido. Un caso espantoso de lo contrario es el lenguaje BASIC. Al ser uno de los primeros lenguajes de programación, es claro que tuvo N transformaciones hasta convertirse en el monstruo de mil cabezas que es, por ejemplo la versión de BASIC llamada Visual BASIC, de Microsoft. Pero si hablamos de la versión original de BASIC, ésta adolecía de estructuras de datos. A lo más tenía arreglos estáticos y todas las variables, todas, eran globales. Añádase la falta de estructura para el código en donde cada línea (numerada) era una etiqueta, y bajo las órdenes de la instrucción GOTO, se hacía un código spaguetti muy difícil de entender. Hoy día los amantes de Visual BASIC me dirán que todo eso quedó en el olvido y que su lenguaje cumple con las capacidades expresivas de C o Pascal. Probablemente sí. Pero hay un  hecho entonces a considerar: Visual BASIC no es fácilmente portable a otras plataformas.

Y todo esto viene a cuento porque estoy programado en algo llamado PicBasic Pro (PBP), un lenguaje de programación para microcontroladores Pic, basado en el ancestral BASIC. La verdad es que me siento como atado de pies y manos para expresar lo que quiero que haga mi código. Hagan de cuenta que tengo un automóvil que por alguna extraña razón, solamente puede dar vuelta a la derecha y yo quiero dar vuelta a la izquierda. ¿La solución? Dar  tres vueltas de 90 grados a la derecha para salir hacia la izquierda. Si tuviésemos un automóvil así, sería ridículo salir a la calle con él. Pues bien, así me siento cuando tengo que usar el PBP.

Y que conste, con todo y todo, el PBP es una gran ayuda para aquel que quiera programar microcontroladores con un lenguaje de alto nivel, quitándose el enfado de tener que usar el ensamblador de dicho circuito. Tiene algunas virtudes, pero es deplorable en expresividad. Y no es culpa del PBP, sino de la definición del mismo. Sí, resulta muy fácil moverse y programar algunas cosas sencillas. No obstante, es como el coche del volante imperfecto, que nos impide movernos fácilmente hacia donde queramos.

La moraleja es simple: Antes de ponerse a estudiar un lenguaje de programación, analice su poder expresivo. Esto es lo que puede ser la diferencia entre aprender a programar bien o quizás, a tener que darle la vuelta a las cosas porque el lenguaje escogido carece de las estructuras de datos importantes, que hoy en día se antojan elementales.

5 comments:

Nucleo 51 said...

Gracias, me ayuda a enfocarme hacia el camino correcto de escoger mi primer lenguaje a prender.

Creo que python cumple con esto , o me equivoco?.


Saludos.

Morsa said...

Sí, Python es una buena opción.

saludos

WESITOS said...

yo uso el ensamblador para programar PICS, he usado C y Basic, pero con ensamblador, aunque es muy talachudo, uno tiene el control total del PIC, incluso los pulsos del reloj.

Si quiero realizar comunicación síncrona, con C no se tiene completamente el control, y usando las instrucciones de C, en la compilación se genera un código gigantesco, usando mucha memoria.

Por eso creo que en el caso del ensamblador, es el mas adecuado para los PIC's; se han agregado a traves del tiempo y con nuevos PIC's, nuevas instrucciones que simplifican un poco el programa, lo hacen mas facil de entender y depurar

Y coincido en que hay que elegir un lenguaje pensando en el uso que se le va a dar. Saludos Morsa !!!

Eduardo Joel said...

hola morsa! , bueno no se si me podrias ayudar a definir en nuestro contexto de la informatica, que vedria a ser "expresivo" y tb la "expresividad"

Morsa said...

Eduardo Joel,

Lo dice el artículo en sí, pero trataré de explicarme mejor:

Imagina un lenguaje para comunicarte con otros seres humanos. Imagina que solamente tienes una palabra para decir algo. Eso limita las posibilidades de tus formas de pensamiento. La riqueza de un lenguaje permite expresar ideas, en ocasiones muy complejas e incluso, con una vaguedad que a veces es difícil definir. Si limitamos un lenguaje a unas serie de palabras, digamos 30, 40, 50... Entonces tendrás que expresar tus ideas en esos términos.

En los lenguajes de computadora no solamente estás limitado a una serie de comandos o instrucciones, sino que además, de acuerdo al lenguaje que uses, podrás crear una serie de estructuras de datos, las cuales te permitirán hablar de las ideas por expresar en los programas, de mejor o peor manera.

Por eso era la gráfica que ilustra el artículo. Imagina que tienes un auto que sólo da vuelta -digamos- a la izquierda. ¿Qué pasa si queremos dar vuelta a la derecha? Pues tendremos que dar tres vueltas a la izquierda para poder dar vuelta a la derecha. La limitación de este extra`no volante te obliga al recurso de dar tres vueltas de 90 grados para dar la vuelta contraria.

Así, la expresividad se define como la capacidad de decir ideas en cómputo, ayudado a través de las estructuras de datos que el lenguaje que uses tiene.

Otro ejemplo: en la universidad iberoamericana tenían un estacionamiento para profesores, pero había unos 20 lugares apartados para que los directores de área tuviesen siempre estacionamiento, pues no había nunca suficientes lugares para todos. ¿Es eso una buena estrategia? No, porque no hay exceso de lugares. Así, mejor estrategia es dar lugares en la medida que se necesitan hasta que se agoten los espacios.

Traducción a cómputo: es mejor, dado que la memoria RAM de los sistemas es limitada, el dar acceso a este recurso cuando se necesita. Así, si quieres tener una lista con 100,000 nombres, no es buena idea apartar 100,000 lugares de memoria, sino que es mejor que en la medida que los necesites, se te dé el espacio. Para ello, las estructuras dinámicas pueden ayudarte.

Hay lenguajes que no tienen o que tienen poco desarrolladas estas estructuras dinámicas. BASIC es un ejemplo clásico de eso, aunque las versiones modernas han implementado esta idea. Lo malo es que no lo tienen todos los BASICs y hay que considerar qué versión de este lenguaje a usar.

Por ello, los lenguajes más expresivos son los que tienen estructuras de datos dinámicas, que tienen un conjunto de instrucciones poderosas, que incluso, permite crear nuevas instrucciones que le dan más poder expresivo al lenguaje, para -efectivamente- poder expresar ideas en programación.

saludos