Back

 

Introducción

Correo

E-mail

La computadora, a diferencia de otras herramientas que en general apoyan el esfuerzo físico de los humanos, fue inventada para facilitar el trabajo intelectual. Si el hombre tiene algún problema, por ejemplo "sumar dos y dos", el diseñador define el algoritmo que resuelve el problema, el programador lo codifica en un lenguaje de programación, el cual la computadora es capaz de "entender", luego la computadora ejecuta el algoritmo expresado como programa en el lenguaje de programación en cuestión, y listo. La máquina le entrega al hombre la respuesta "4", sin que éste tuviera que esforzar sus neuronas.

¿Cuál es el papel del lenguaje de programación en este proceso? Es muy importante, el lenguaje de programación es el medio de comunicación entre el hombre y la máquina. El modelo general de las computadoras, desde que fue esbozado por von Neumann, no ha cambiado mucho, mientras que la invención humana para proponerse nuevos problemas a resolver, usando la computadora, parece no tener límites.

En consecuencia, los lenguajes de programación tienen que adaptarse a éstas crecientes necesidades y aumentar la expresividad para poder resolver problemas muy diversos y cada vez más complejos. Además, tienen que ofrecer cierta eficiencia en la ejecución. Es un logro difícil de alcanzar y por lo tanto, se requiere una búsqueda constante de nuevos lenguajes para ello.

Aquí se expone un breve panorama de los más importantes tipos de lenguajes de programación.

Lenguajes Imperativos. En este tipo de lenguajes, cuyo origen está ligado a la propia arquitectura de von Neumann, la arquitectura consta de una secuencia de celdas, llamadas memoria, en la cual se pueden guardar en forma codificada, lo mismo datos que instrucciones; y de un procesador, el cual es capaz de ejecutar de manera secuencial una serie de operaciones, principalmente aritméticas y booleanas, llamadas comandos. En general, un lenguaje imperativo ofrece al programador conceptos que se traducen de forma natural al modelo de la máquina.

Los lenguajes imperativos más destacados de la historia han sido: FORTRAN, Algol, Pascal, C, Modula-2, Ada.

Lenguajes Funcionales.  Una función convierte ciertos datos en resultados. Si supiéramos cómo evaluar una función, usando la computadora, podríamos resolver automáticamente muchos problemas. Así pensaron algunos matemáticos, que no le tenían miedo a la máquina, e inventaron los lenguajes de programación funcionales.

Aprovecharon la posibilidad que tienen las funciones para manipular datos simbólicos, y no solamente numéricos, y la propiedad de las funciones que les permite componer, creando de esta manera, la oportunidad para resolver problemas complejos a partir de las soluciones a otros más sencillos. También se incluyó la posibilidad de definir funciones recursivamente.

El lenguaje funcional más antiguo, y seguramente el más popular hasta la fecha, es LISP.  En la década de los 80 hubo una nueva ola de interés por los lenguajes funcionales, añadiendo la tipificación y algunos conceptos modernos de modularización y polimorfismo, como es el caso del lenguaje ML.

Lenguajes Lógicos.  El conocimiento básico de las matemáticas se puede representar en la lógica en forma de axiomas, a los cuales se añaden reglas formales para deducir cosas verdaderas (teoremas) a partir de los axiomas. Algunos matemáticos, a finales de siglo XX y principios de XXI, encontraron la manera de automatizar computacionalmenté el razonamiento lógico que permitió que diera origen a los lenguajes lógicos.

También se conoce a estos lenguajes, y a los funcionales, como lenguajes declarativos, porque el programador, parar solucionar un problema, todo lo que tiene que hacer es describirlo vía axiomas y reglas de deducción en el caso de la programación lógica y vía funciones en el caso de la programación funcional.

En los lenguajes lógicos se utiliza el formalismo de la lógica para representar el conocimiento sobre un problema y para hacer preguntas que, si se demuestra que se pueden deducir a partir del conocimiento dado en forma de axiomas y de las reglas de deducción estipuladas, se vuelven teoremas. Así se encuentran soluciones a problemas formulados como preguntas.

El PROLOG es el primer lenguaje lógico y el más conocido y utilizado. También en este caso, las aplicaciones a la Inteligencia Artificial mantienen el lenguaje vivo y útil.

Lenguajes Orientados a Objetos.  A mediados de los años 60 se empezó a vislumbrar el uso de las computadoras para la simulación de problemas del mundo real. Pero el mundo real está lleno de objetos.

Así es que a dos noruegos, Dahl y Nygaard, se les ocurrió el concepto de objeto y sus colecciones, llamadas clases de objetos, que permitieron introducir abstracciones de datos a los lenguajes de programación.  A ellos también les debemos el concepto de polimorfismo introducido vía procedimientos virtuales.

Todos estos conceptos fueron presentados en el lenguaje Simula 67, desde el año 1967. En los años 80 hubo una verdadera ola de propuestas de lenguajes de programación con conceptos de objetos encabezada por Smalltalk, C++, Modula-3, Ada 95 y terminando con Java.

Lenguajes Concurrentes, Paralelos y Distribuidos.  La necesidad de ofrecer concurrencia en el acceso a los recursos computacionales se remonta a los primeros sistemas operativos.  Por ejemplo, mientras un programa realizaba una operación de entrada o salida otro podría gozar del tiempo del procesador para sumar dos números.

Cuando los procesadores cambiaron de tamaño y de precio, se abrió la posibilidad de contar con varios procesadores en una máquina y ofrecer el procesamiento en paralelo, es decir, procesar varios programas al mismo tiempo. Esto dio el impulso a la creación de lenguajes que permitían expresar el paralelismo. Finalmente, llegaron las redes de computadoras, que también ofrecen la posibilidad de ejecución en paralelo, pero con procesadores distantes, lo cual conocemos como la programación distribuida.

Históricamente encontramos en la literatura soluciones conceptuales y mecanismos tales como: semáforos, regiones críticas, monitores, envío de mensajes (CSP), llamadas a procedimientos remotos (RPC), que posteriormente se incluyeron como partes de los lenguajes de programación en Concurrent Pascal, Modula, Ada, OCCAM, y últimamente en Java.

El diseño de un lenguaje de programación es siempre un compromiso, en el cual un buen diseñador tiene que tomar en cuenta: el nivel de abstracciones deseado, la arquitectura del hardware, y el rango propuesto de las aplicaciones.

Si queremos construir sistemas a niveles cada vez más abstractos, con hardware cada vez más complicado y con aplicaciones cada vez más ambiciosas, el trabajo para los diseñadores de lenguajes existe para un buen rato.

Como se pudo apreciar en el texto anterior, los lenguajes se dividen en diferentes tipos pero,  en este trabajo no se analiza la evolución de cada tipo, sino se tomo una muestra de los diferentes lenguajes que fueron surgiendo en el paso de la historia.

© 2002, Aletse Producciones, S.L. Reservados todos los derechos

1