Sergio's Blog

Abstracción sintactica

March 19, 2010

le coq

Le Coq - Joan Miro

Recordemos algunas nociones básicas.

La misión del desarrollador de software consiste en escribir programas que sean faciles de entender. Un programa es facil de entender cuando esta escrito como un conjunto sencillo de relaciones entre conceptos. Como estos conceptos pueden ser a su vez complejos, el programador retiene de ellos unicamente la información necesaria para entender sus relaciones con los demás conceptos. Cada concepto del programa principal es representado por otro pedazo del programa, escrito de manera similar. Este mecanismo de reducción del nivel de detalle de una parte del programa se conoce como abstracción.

Si en un programa existen pedazos de código muy similares, el programador debe preguntarse si no existe un concepto implicito que merezca ser representado por una abstracción.

Los dos tipos de abstracción mas conocidos son tal vez el procedimiento, que captura una serie de acciones, y los tipos de datos, que representan la entidades sobre las cuales un programa actua. Los diferentes tipos de abstracción permiten reducir la complejidad de los programas de diferentes maneras. Cada lenguaje de programación ofrece sus propios mecanismos de abstracción según el estilo de programación que promueven, por ejemplo funcional u orientado a objetos.

Railway Crossing

Railway Crossing - Leger

La abstracción sintactica permite regrupar formas sintacticas similares. Para explicar a que me refiero con “formas sintacticas similares” daré un ejemplo. En el lenguaje java, en las versiones anteriores a 1.5, la manera mas familiar de iterar sobre un arreglo era escribir algo asi:

<br /> int[] arreglo = {1,2,3};

for (int i = 0; i < arreglo.length ; i++){<br /> int var = arreglo[i];<br /> doSomethingWith(var);<br /> }<br />

Al escribir código como este muchas veces, es obvio que hay algo que puede generalizarse. Java 1.5 ofrece la siguiente forma de escribir esto mismo:

int[] arreglo = {1,2,3};<br />

for (int var : arreglo){<br /> doSomethingWith(var);<br /> }

La ganancia en legibilidad es enorme cuando se tiene en cuenta el enorme número de iteraciones sobre un arreglo que pueden aparecer en un programa. Como java no ofrece soporte a la abstracción funcional, los programadores de java tuvimos que esperar hasta que los encargados de el lenguaje ofrecieran esta nueva forma de iterar sobre un arreglo, sin poder hacer nada al respecto. En un lenguaje como lisp que permite la abstracción sintactica el programador podría haber creado su propia versión de “for”, de considerarlo necesario. En lisp esto se hace gracias a un poderoso sistema de macros.

Veamos otro ejemplo, basado en common lisp pero explicado en pseudo código. Si imaginamos una librería que permita escribir lineas de texto a un archivo, su uso en un lenguaje tradicional se parecerá a esto:

<br /> variable stream = open("archivo");<br /> try {<br /> print(stream, "hello");<br /> print(stream, "world");<br /> }<br /> finally {<br /> close(stream);<br /> }<br />

Luego de escribir código parecido al anterior muchas veces, podemos imaginar lo conveniente que sería reducir lo anterior a una forma mas pura, algo parecido a esto:

<br /> with-open-file (stream "archivo") {<br /> stream.print("hello world");<br /> }

que “esconda” los detalles de captura de excepciones y de cerrar el stream al final de su uso.

En lisp existe un macro que hace exactamente eso. Pero el punto aquí no es que lisp soporte esta sintaxis sino que, de no existir, el programador podria introducirla sin ningun problema.


Written by Sergio G.