martes, 22 de junio de 2010

Programación de Computadores: Ayer, Hoy, Mañana

Aunque ya estamos acostumbrados a los impresionantes despliegues tecnológicos necesarios para que las modernas computadoras personales nos ayuden, pocas personas conocen cómo se logra que estas máquinas puedan funcionar.

Por un lado tenemos el equipo electrónico, compuesto de pastillas (chips) hechos de materiales especialísimos, llamados superconductores. La electrónica ha avanzado meteóricamente en los últimos veinte años, hasta el punto de que ahora cada dos años esperamos que la memoria de computador aumente al doble su capacidad, al mismo tiempo que se reduce a la mitad su precio.

Por otro lado tenemos que el computador puede ser programado. Esta cualidad ha permitido que el computador, a diferencia de otras máquinas, pueda ser aplicado a una gran diversidad de actividades. Veamos por qué.

Mediante un programa es posible hacer que el mismo computador sirva para muy diferentes propósitos. La programación permite reutilizar el mismo equipo en diferentes aplicaciones. Lo más usual es que los computadores personales modernos se usen como procesadores de palabras y como hojas de cálculo. Pero además se usan para jugar o para crear nuevos programas. Su aplicación más productiva es en el mundo de los negocios, en donde el computador puede efectuar muchas de las tareas burocráticas necesarias en nuestras sociedades modernas. Es esta aplicación la que recibe el nombre genérico de Sistemas de Información.

¿Cómo programamos un computador? Mediante un lenguaje de programación. Estos lenguajes, que generalmente son muy secos y parsimoniosos, permiten crear un programa que al ser cargado en la memoria del computador produce los resultados que un usuario de la máquina necesita. Por ejemplo, escribo este artículo usando un programa (llamado procesador de palabras) que está cargado en la memoria de la máquina. Este programa fue escrito usando el lenguaje de computador Assembler 8088, con partes algunas escritas en el lenguaje C.

El reto principal que encaramos los programadores es lograr que los grandes adelantos en electrónica se traduzcan en programas cada vez mejores. Desgraciadamente, no hemos tenido mucho éxito, por muy diversas razones. (Cada vez es más caro contratar a un programador, mientras que es más barato comprar equipo: el "fracaso" lo es sólo cuando comparamos los avances en programación respecto a los avances en manufactura de computadores).

Tal vez la más importante es que en programación todavía no hemos podido reutilizar completamente programas, o sus partes. A diferencia del mundo de los semiconductores, el universo de discurso del programador es mucho más ostil y diverso: al crear sistemas de información el programador debe lidiar con personas y modos de ser diferentes. Después de todo, a ningún gerente puede parecerle bien que el programdor le diga cómo debe ser su empresa, lo que obliga al programador a hacer un programa especializado para cada empresa, y también para cada gerente.

Pero ya hemos sido capaces de categorizar la mayoría de las necesidades informáticas de una empresa. Para esto hemos creado las herramientas de programación de Cuarta Generación, que permiten, en el 90% de los casos, producir los programas para un sistema de información de una forma expedita y correcta. Ejemplos de lenguajes de cuarta generación los son Paradox y RBase, en el mundo de las micro computadores, o LINC y DMS en el rango de las mega máquinas.

Podemos decir entonces que el problema de los sistemas de información está "suficientemente" resuelto. Todavía no es posible que las computadoras ayuden al gerente en todo lo que necesita, pero en general se obtienen buenos resultados.

Sin embargo, las aplicaciones de computadores no se limitan únicamente a este campo. Existen una gran cantidad de desafíos tecnológicos que no han sido adecuadamente resueltos. En los últimos veinte años dos tipos de tecnología para programación han sido desarrolladas: programación lógica y programación por objetos.

La programación lógica tiene sus raíces en el Cálculo de Predicados, que es una teoría matemática que permite, entre otras cosas, lograr que un computador pueda hacer deducciones inteligentes. El ejemplo clásico es el de Sócrates, que es humano, y como todo humano es mortal, entonces Sócrates debe ser mortal. En programación lógica, este programa se escribe así:
[Humano(x) -> Mortal(x), Humano(Sócrates)] ==> Mortal(Sócrates)

Japón asustó al mundo desarrollado hace unos años con su proyecto de la Quinta Generación, que usa lenguajes de programación lógica para lograr grandes avances en el campo de la Inteligencia Artificial aplicada. La verdad es que han logrado grandes avances, pero no tan impresionantes como los que uno espera. (Todavía recuerdo una de las películas de la serie de Viaje a las Estrellas, en que Scotty toma el "ratón" (mouse) de una computadora MacIntosh y le habla, con resultado nulo: las computadoras todavía no hablan, ni tampoco pueden ver. Con costos algunas tienen patas para caminar...).

La verdad es que lenguajes de programación lógica son lenguajes de gran utilidad en laboratorios de investigación, pero no han encontrado todavía muchos seguidores en las industrias.

La otra moda en programación de computadores es la programación por objetos, que es descrita por sus seguidores como el primer intento exitoso para reutilizar componentes de programas. Desgraciadamente, en ésto de los lenguajes los programadores nos volvemos fanáticos. Lo digo con conocimiento de causa, pues he sido fanático de varios lenguajes a través de mi vida: Fortran, Pascal, Prolog y ahora C++. Mi experiencia me ha demostrado que no existe una panacea, sólo soluciones que pueden ser aplicadas a problemas específicos, o a una gama de problemas específicos.

La programación por objetos (conocida como OOP) nació hace más de veinte años en el lenguaje Simula, que sirve para simular sistemas que, por su complejidad, no pueden ser analizados matemáticamente. Por ejemplo, la simulación se usa mucho para determinar el efecto que tendría el poner o quitar un semáforo en una calle, o el sustituir un puente por una rotonda.

Además, otro objetivo de la OOP es crear programas altamente reutilizables, hasta el punto de que se habla de "chips" de programación. La electrónica ha progresado mucho gracias a la reutilización de componentes, lo que ha llevado a los programadores a pensar que el mejorar el de reutilización de componentes de programas reditará iguales dividendos al construir nuevos programas.

La gran desventaja de estas nuevas tecnologías es que es muy difícil que sean asimiladas. Como docente dedicado a la enseñanza de la programación, he encontrado gran reticencia en los programadores de adoptar esta nueva tecnología, pues, después de todo, con las herramientas actuales ya pueden hacer su trabajo. Lo que la programación por objetos promete es aumentar el grado de modularización de un sistema computacional, lo que es un requisito indispensable para dominar la complejidad de los nuevos programas. Sin programación por objetos será cada vez más difícil producir programas.

Lo malo es que la programación por objetos no es una solución total. Es relativamente fácil encontrar ejemplos en que OOP no es solución. Lo que sucede es que la complejidad de los problemas es cada vez mayor, lo que exige cada vez mejores herramientas para resolverlos.

Este es el el dilema de nuestro mundo actual: el progreso exige cada vez más realizaciones tecnológicas y los avances tecnológicos son como la plata: nunca alcanzan.

La tendencia actual es ha crear cada vez más común lenguajes especializados para cada aplicación. Por ejemplo, la primera hoja de cálculo no tenía capacidad de graficación: hacer gráficos no es nada fácil, a menos que uno cuente con un lenguaje adecuado para ello. Las hojas de cálculo más recientes cuentan con un sofisticado lenguaje para producir gráficos.

¿Qué nos depara el futuro? En el futuro contaremos además con componentes computacionales inteligentes que nos permitan comunicarnos más fluidamente con los computadores. Llegará el día en que podamos decirle a la máquina: "mirá, alistame una cena para 25 personas, y contratame a un buen conjunto. Fijate, eso sí, en que algunos no pueden comer chancho, y no se te olvide que el postre tenga gelatina roja. Ah, mirá: no se te olvide hacer las invitaciones y las llamadas por teléfono".

Más adelante en el futuro, veremos máquinas que puedan autoprogramarse junto a otras máquinas. Esto permitirá crear máquinas que puedan trabajar junto a otras en forma armoniosa. Cuando una nueva máquina llegue, simplemente hablará con las viejas para ponerse de acuerdo en cómo pueden cooperar todas. Y también cada máquina sabrá cuando necesite reparación, o cómo repararse sóla.

En ese mundo utópico futuro, ¿qué haremos nosotros? Pues nacer, crecer, reproducirnos, divertirnos y morir, como Dios manda.

La reutilización es un concepto básico para las mejoras tecnológicas; los ingenieros siempre decimos que no debemos "reinventar la rueda". O sea que los nuevos avances tecnológicos descansan sobre los viejos. La nueva tecnología debe mejorar a la vieja, haciendo uso de los principios básicos que ya han sido descubiertos.

No hay comentarios:

Publicar un comentario