Enciclopedia de Conocimientos Fundamentales
UNAM ˜ SIGLO XXI


regreso








5.1.3 Abstracción en computación

En computación, aun más que en las demás áreas del conocimiento, la abstracción es fundamental; juega un papel muy especial debido, entre otras cosas, a su naturaleza dual. Por un lado, la computación tiene como meta construir, al igual que la ingeniería: construir máquinas, programas y sistemas que realicen cómputo. Por otro lado, al igual que la física, pretende observar la naturaleza (real o imaginaria) y entender los procesos de cómputo que ahí se realizan. Por lo tanto, la abstracción se lleva a cabo en dos direcciones opuestas.

El pintor puede y debe abstraer muchos detalles al crear su pintura.
Toda buena composición es sobre todo un trabajo de abstracción.
DIEGO RIVERA.

Abstracción para construcción

Para la construcción de objetos de cómputo, la abstracción se usa de diversas maneras:

Especificación de problemas | Al resolver un problema, lo primero que hay que hacer es especificarlo. Esto es, dar un modelo general del comportamiento de cualquier solución a éste. Una solución al problema podría ser un algoritmo, cuyo comportamiento satisface la especificación dada. El algoritmo representa entonces otro modelo, que incluye más detalles que los del modelo de la especificación del problema. Se requiere de técnicas para verificar que el algoritmo satisface la especificación.

Lenguajes de programación | Al programar el algoritmo en algún lenguaje, por ejemplo Scheme, se tendrá un tercer modelo, con más detalles aún. Un lenguaje es muy preciso, tanto en su sintaxis como en su semántica. Por ejemplo, si el lenguaje requiere que cada vez que se abra un paréntesis se deba cerrar, y se olvida cerrar uno, el programa ya no corre. Mientras que un algoritmo es más cercano al lenguaje natural, con la correspondiente flexibilidad y posibles ambigüedades.

Semántica | Pero, ¿cómo saber cuál es la semántica de cada instrucción de Scheme? Es decir, una instrucción no es más que una secuencia de símbolos, como "(+ 3 x)". Es necesario explicar el significado de esta secuencia. En palabras se puede explicar que el efecto de la instrucción es sumarle al valor de x el número 3. Se ve entonces que se está pensando en una asociación de la secuencia de símbolos a un efecto, en algún modelo de cómputo. Así que se requiere de abstracción para definir el significado de un lenguaje de programación, relacionando dos modelos, el del lenguaje con el de su ejecución. Toda una rama de la computación se dedica al estudio de cómo especificar el significado de un lenguaje de programación.

Lenguajes de distintos niveles | Y ahí no termina la historia. Las instrucciones que puede ejecutar una computadora no son directamente las de Scheme; obviamente, existen muchos otros lenguajes de programación. El programa en Scheme se debe implementar en las instrucciones de máquina, que pertenecen al lenguaje que el chip procesador de la computadora sabe ejecutar en hardware. Pero estas instrucciones son demasiado simples; por ejemplo, se refieren directamente a localidades de la memoria, y no a variables cuyos nombres puede elegir el programador. Así que se usa un lenguaje intermedio, llamado ensamblador, que facilita la tarea de escribir un programa en lenguaje de máquina.

Independencia de plataformas | Es deseable que una vez escrito un programa en Scheme, se pueda ejecutar en cualquier computadora, y cada una puede tener un procesador de otra marca, con diferentes instrucciones de máquina. El lenguaje de programación Java ganó popularidad muy rápidamente porque proveía de un modelo intermedio de computadora, llamado máquina virtual, de manera que un programa escrito en Java se tradujera en uno más detallado que corriera en esta máquina virtual, y luego se encargara uno de traducir la máquina virtual a cada plataforma de cómputo diferente. El costo es una pérdida en eficiencia, ya que no se puede traducir directamente el programa en Java a una máquina específica y aprovechar sus peculiaridades, pero la ganancia es que se pueden desarrollar programas que corran en cualquier computadora.

Reusar componentes | Y se podría seguir y seguir con esta historia, ya que los programas y computadoras modernas han llegado a niveles de complejidad tan enormes, que se usan más y más capas, tanto hacia arriba como hacia abajo. Hacia arriba se usan construcciones útiles a muchos programas: por ejemplo, ya que todos usan elementos de la interfaz de usuario similares —como ventanas, ratón, menús...—, se utilizan herramientas que evitan tener que programarlas cada vez, o bibliotecas de soluciones a problemas comunes a diversas situaciones, como podría ser un módulo para ordenar objetos.

Domar la complejidad | Hacia abajo se requiere abstracción para manejar la enorme complejidad del hardware moderno de una computadora. Por ejemplo, en realidad la memoria está organizada en capas; las memorias más grandes son las más baratas, pero más lentas; las más rápidas son más caras, así que son más pequeñas. Se requieren complejos sistemas de administración de la memoria, que se encargan de mover los datos de una capa a la otra, de la manera más transparente posible para el programador. El sistema debe proveer un modelo que le permita abstraerse de los detalles sobre cómo se hace esto.

Abstracción para análisis

Al igual que en la física, durante la observación de un fenómeno en la naturaleza se abstraen detalles y se produce un modelo que incluye las características esenciales de interés. Las dos maneras más comunes de definir modelos de cómputo es mediante máquinas  y con lenguajes. Con frecuencia se desea diseñar ambos tipos para modelar el mismo fenómeno, ya que cada uno tiene sus propias ventajas. Entonces se usa la herramienta para razonar acerca de abstracciones a fin de que ambos modelos sean equivalentes. Más adelante se verá cómo es posible definir distintos modelos de cómputo, unos más poderosos que otros, unos equivalentes a otros en algún sentido, y en otro no. Lo que conduce una vez más al problema central de la abstracción: con dos modelos dados, en este caso de máquinas de cómputo, cómo razonar acerca de su relación.

Desde los inicios de la computación moderna se ha usado abstracción para analizar fenómenos relacionados con el cómputo. La "prueba de Turing" es el nombre con el que se conoce la propuesta que hizo Alan Turing en 1950 para estudiar la pregunta de si las máquinas pueden pensar. En su artículo "Computing Machinery and Intelligence" (disponible en internet), propone considerar la pregunta: "¿pueden las máquinas pensar?".

Se debe comenzar con definiciones de los términos "máquina" y "pensar", para lo cual Turing toma una posición similar a la de Descartes, en la que en lugar de adentrarse en discusiones acerca de lo que es la inteligencia, simplemente considera que algo es inteligente cuando se comporta como si lo fuera. Es decir, usa las nociones de abstracción que se han mencionado para proponer un experimento como el "juego de la imitación": una persona, el interrogador, se encuentra en un cuarto completamente aislado, sólo con un teclado típico de letras y números para escribir preguntas dirigidas a los otros dos participantes del juego, y una pantalla donde observa las respuestas a sus preguntas. Uno de esos participantes es una persona, y el otro es una computadora. El objetivo del interrogador es adivinar cuál de los otros dos participantes es la persona y cuál la computadora. La única interacción entre el interrogador y los participantes es mediante las preguntas tecleadas y las respuestas escritas en la pantalla. Si la computadora logra engañar al interrogador, se decide que es inteligente.

La prueba de Turing ha sido el centro de muchas discusiones en filosofía, ciencias cognitivas e inteligencia artificial, en muchos libros y artículos escritos durante los últimos 50 años. Independientemente de las discusiones al respecto, de la validez e implicaciones de la prueba, provee un bello ejemplo de cómo se usa la abstracción en computación. Se considera una "caja negra" con entradas y salidas, y se define un comportamiento válido para la caja, en términos de la relación que las entradas y las salidas deben guardar: si la entrada es tal, la salida debe ser tal o cual, etc. Una implementación de la caja se considera correcta si, y sólo si, a cualquier entrada corresponde una salida válida. Cómo está construida, cómo lo logra, lo que hay adentro de la caja se ignora.

Esto es similar a las discusiones acerca de si las computadoras saben jugar ajedrez, el rey de los juegos. Desde siempre, las personas que presumían de grandes capacidades mentales se medían por su habilidad para jugarlo. Existen interesantes discusiones filosóficas al respecto, pero el hecho es que hoy en día ya hay programas a los que ninguna persona "normal" les puede ganar un solo partido (únicamente un profesional del ajedrez puede hacerlo).


Inicio de página