Ing. Gracia María Gagliano Lenguajes de Programación 1 Lenguajes de programación Introducción En esencia, en un programa se reproduce el comportamiento de algún procedimiento que puede existir en el mundo real para solucionar determinado problema también real. Esa solución se implementa en una computadora por medio de un lenguaje especial, no natural, que designamos como lenguaje de programación. ¿Cómo se atraviesa el problema para plasmar su solución en un programa?. Partimos de considerar que, en mayor o menor medida la realidad es compleja, entonces para encontrar una manera de solucionar un problema real es necesario afrontar esa complejidad y llegar a dominarla. Un instrumento fundamental para ello es la abstracción. ¿Qué es la abstracción? El conocimiento que las personas tenemos de los objetos, las situaciones y los procesos del mundo real no lo obtenemos por el concreto contacto con ellos, sino por una representación mental que hacemos, de esa realidad. Para llegar a esto, incorporamos información a través de nuestros sentidos mediante técnicas como la observación y la interrogación (¿qué…?, ¿cuál…?, ¿a dónde….?, etc.), y por medio de una potente operación intelectual denominada abstracción, nuestra mente se concentra, sin que lo notemos, en captar los aspectos esenciales y básicos para el nivel de conocimiento que pretendemos. Ignora la información que sea irrelevante y resalta los detalles y cualidades que sean significativos. Entonces nuestro pensamiento, con las características que ha distinguido de la realidad, reconstruye el todo en su integridad. Podemos decir que hacer abstracción de algo supone identificar particularidades claves de ese algo, separarlas y quedarse con ellas como si fueran una totalidad y no una parte. La abstracción es uno de los procesos mentales más comunes que realizamos de manera rutinaria y usamos sin darnos cuenta. Constituye una herramienta indispensable en el razonamiento, la conceptualización, la comprensión y otras acciones mentales; le da al ser humano capacidad para deducir, para extrapolar lo aprendido a cualquier otra situación, para comparar o sacar conclusiones. Esta capacidad mental de aislar partes de un todo para reflexionar sobre ellas y/o comprenderlas resulta ser un elemento fundamental para la investigación científica, la lógica, e inclusive para la creatividad. Así es que la abstracción no se instala sólo en el campo del saber (la psicología, la filosofía, la informática, etc.) sino que también lo hace en otros ámbitos como, por ejemplo, el arte. Pero, ¿cuál es el medio de qué nos valemos los seres humanos para realizar esta construcción mental (abstracción)?. Recurrimos a una facultad propia y exclusiva de los seres humanos, el lenguaje. El lenguaje, como sistema de símbolos y reglas, aporta un conjunto infinito de palabras. Se constituye así no sólo en el más importante medio de comunicación humano sino también en el medio por el cual el hombre asocia significado a los contenidos de su pensamiento; es el lenguaje el que le permite construir un modelo abstracto de la realidad. Está tan vinculado al pensamiento humano, que su total carencia hace que no se encuentre en el hombre indicios de inteligencia. La abstracción en informática Vimos ya que el hombre, para conocer el mundo real, lo representa en su mente y por medio del lenguaje le asocia un significado. Pero el hombre no usa el lenguaje sólo para esto, sino también para comunicar a otro individuo lo que “tiene en su mente” utilizando, en este caso, el lenguaje oral o el escrito. Como resultado del proceso de comunicación el individuo receptor “arma en su mente” otra representación de la realidad, que es, igualmente válida. En general un lenguaje de programación tiene el mismo comportamiento, solo que el receptor es una computadora, por ello es una de las principales herramientas en el proceso de desarrollo de software (fig.1). Ing. Gracia María Gagliano Lenguajes de Programación Proceso de abstracción Modelo abstracto Mundo real [en una mente humana] Lenguaje 2 Modelo abstracto equivalente [en una mente humana] Modelo abstracto equivalente [en una computadora] fig.1 El “mundo real” que el programador enfrenta es el enunciado de una situación problemática que de por sí ya es una abstracción de la realidad, pues es una descripción en la que se han dejado de lado algunos detalles no esenciales tal que termina siendo un conjunto de cuestiones que se plantean para ser resueltas. Al buscar la solución crea, en su mente, una abstracción del problema resultando así mucho más fácil su abordaje, para encontrar un método que describa el proceso de solución. Encontrado el método, es decir, paso a paso “lo qué hay que hacer”, lo implementará en un programa mediante un lenguaje de programación. Ejemplo: HECHO REAL En un seminario sobre “Teoría de los lenguajes” que tiene un cupo de 100 asistentes se registran apellido, edad e importe pagado en concepto de inscripción (no todos pagan igual valor) por los presentes al mismo. ENUNCIADOS A RESOLVER PROBLEMA 1: Teniendo como dato el apellido de cada asistente a un seminario se quiere determinar cuántos no asistieron sabiendo que el cupo era de 100. PROBLEMA 2: Calcular la edad promedio de los asistentes a un seminario a partir de la edad de cada uno de ellos. PROBLEMA 3: Calcular el importe promedio pagado por los asistentes a un seminario a partir del valor pagado por cada uno de ellos. fig.2 Ing. Gracia María Gagliano Lenguajes de Programación 3 En la descripción de un proceso, cuanto más se puede aislar la esencia del problema significa que mayor es el nivel de abstracción alcanzado. Por todo esto podemos decir que un programa es una descripción abstracta de un procedimiento que existe o puede existir en el mundo real y que los lenguajes de programación son las herramientas mediante las cuales los programadores pueden implementar esos modelos abstractos. Por lo tanto es, por medio de un lenguaje de programación que se puede representar, en la computadora, el proceso de solución de un problema. Evidentemente la abstracción es clave para diseñar un buen programa. ¿Qué es un lenguaje de programación? Proceso de solución de un problema Lenguaje de programación Máquina fig.3 Si nos enfocamos en los elementos individuales que lo constituyen, podemos ver que no se trata de un lenguaje natural, sino de un idioma artificialmente creado y que esos elementos constituyen un conjunto finito y corresponden a instrucciones y expresiones de significado claro y preciso. Si nos enfocamos en su funcionamiento podemos ver que se trata de un programa. Por lo tanto, responde a la descripción abstracta de un proceso. En este proceso, que se refiere a la manera de indicarle a la computadora que haga determinadas tareas entran en juego por un lado, las tareas en sí y por el otro, la máquina (hardware) subyacente a ellas. Los dos elementos afectaron a la construcción de los lenguajes desde los inicios de la informática ya que la evolución de la tecnología de las computadoras tuvo como consecuencia una ampliación en su campo de uso, aunque ello trajo aparejado un aumento en la complejidad de las soluciones. Sin olvidar que, máquina-tareas a realizar, se interrelacionan e influencian entre sí, nos referiremos a continuación al peso que, cada uno de ellos de manera individual ha tenido y tiene en el diseño de un lenguaje de programación. Lenguajes de programación y máquina De acuerdo con cuánto le permitan al programador abstraerse del funcionamiento de la máquina, los lenguajes han evolucionado desde los llamados lenguajes de máquina (en los inicio de la informática, cuando John von Neumann tiene la idea del “programa almacenado”) hasta los lenguajes de alto nivel pasando por los de bajo nivel. Los lenguajes de máquina simbolizaban, con cadenas de 1 y 0 (formas de representar los estados de las señales eléctricas), a las direcciones de memoria y las operaciones a realizarse sobre ellas, sin distinción aparente. Cada modelo de procesador tenía su lenguaje de máquina ya que los enunciados a usar en un programa hacían referencia exclusiva a sus atributos. Es decir, las instrucciones del lenguaje eran las instrucciones del procesador. Así el aspecto real de un programa pudo haber sido: 10101011 00001010 00001011 00001101 10101011 00001101 00001100 00001101 00001110 00001101 00000011 00001101 00000000 00000000 00000000 00000000 ........... ........... Los circuitos electrónicos del procesador eran capaces de interpretar el significado de cada una de esas secuencias de bits y llevar a cabo las acciones que codifican. Ing. Gracia María Gagliano Lenguajes de Programación 4 Con los lenguajes de bajo nivel se incorpora un mecanismo de abstracción. El programador no necesita conocer el código de máquina, porque las posiciones de memoria y operaciones a realizar sobre ellas se representan por nombres simbólicos (palabras y letras del idioma ingles). De cualquier manera, sigue teniendo que pensar y recordar la secuencia de operaciones elementales del procesador (una tarea sencilla como sumar dos números puede necesitar varias operaciones del procesador). El lenguaje se denomina ensamblador. Así el aspecto real de un programa podría ser: SUM #10, #11, #13 SUM #13, #12, #13 DIV #13, 3, #13 FIN En este ejemplo de programa las palabras representan instrucciones y los # seguidos de números indican las direcciones de memoria a cuyo contenido se desea acceder. El programa se introducen en la memoria de la computadora con la ayuda de un teclado y cada letra se almacena en una posición, como una combinación particular de unos y ceros. Se creó un programa especial que al ejecutarse actúa sobre el código ensamblador y lo “reescribe” en lenguaje de máquina. Este programa que traduce se denomina programa ensamblador. De cualquier forma, el lenguaje sigue atado a la máquina. Con los lenguajes de alto nivel se alcanza, en gran medida, independencia de los procesadores, ya que los elementos de estos lenguajes son palabras propias del humano que no hacen referencia a ningún procesador en particular. Una instrucción en lenguaje de alto nivel se corresponde con una secuencia de operaciones realizables en determinadas posiciones de memoria, es decir, con ella el programador hace abstracción de cómo hará la máquina para ejecutarla. Por ejemplo: por algún requerimiento del problema puede ser necesario obtener el resultado de agregar el valor 8 al valor 25; un enunciado que se corresponda con esta actividad humana en lenguaje natural podría ser: “sumar 8 y 25” o “add 8 and 25” o “aggiungere 8 e 25” o “ajouter 8 et 25“, etc. Expresada en un lenguaje de alto nivel, la instrucción será por ejemplo: wr = 8 + 25;, pero también podría ser wr := 8 + 25;. En ninguno de los dos casos es relevante cuáles serán las operaciones y las celdas de memoria que intervendrán, la tarea es la misma. El símbolo es distinto por qué corresponden a distintos lenguajes de programación, es simplemente una cuestión de codificación. En este caso se creó también un programa especial que al ejecutarse actúa sobre el código de alto nivel y lo “reescribe” en lenguaje de máquina. Es el programa traductor, que como veremos luego se puede presentar en dos formas según lo permita el diseño del lenguaje. Contando con estos recursos el programador puede ahora, ubicarse más cerca del dominio del problema y alejarse completamente de la máquina. No necesita conocer las formas de representación interna de los valores y puede concentrar su atención, en la solución global del problema. Lenguajes de programación y problema Con los lenguajes de alto nivel, encontramos que el eje de la atención se desplazó al problema. Con el aumento en el grado de dificultad de las situaciones que debían solucionarse en forma automática se produjo una gran evolución en la manera de abordar los problemas en busca de una solución. Todo esto se vio reflejado en el desarrollo de los lenguajes de programación pues, indefectiblemente, tuvieron que acompañar el cambio y adaptarse al tipo de mecanismo de abstracción aplicable a los problemas. Mientras que el trabajo fundamental del programador es el de construir abstracciones que permitan tratar con eficiencia la complejidad del mundo real, el de los lenguajes de programación es proporcionar herramientas que sirvan para construir estas abstracciones. Es así que al diseñarse un lenguaje se tiene en cuenta el estilo de programación (o modelos computacional llamado también paradigma) al que se ajustará. Ing. Gracia María Gagliano Lenguajes de Programación 5 Podríamos decir que cada lenguaje “apoya” a una técnica de programación, la cual determina las estructuras semánticas (ideas) que el lenguaje debe poder expresar; por ejemplo, no serán las mismas para el diseño estructurado de programas que para el enfoque orientado a objetos. De cualquier forma, no podemos hablar de una separación estricta, existen lenguajes de programación que soportan más de un paradigma. Características de un lenguaje de programación El lenguaje de programación tiene la capacidad de especificar, de forma precisa, cuáles son los datos que debe trabajar un equipo informático, de qué modo deben ser conservados o transferidos dichos datos y qué instrucciones debe poner en marcha la computadora ante ciertas circunstancias. Podemos resumir que permiten: - definir un proceso que ejecutará una computadora - hacer abstracción de la máquina, se ajusta más al problema - construir nuevas abstracciones que se adapten al dominio del problema Existen herramientas muy usadas que tienen sólo algunas de las características de los lenguajes de programación, por lo cual se los encuadra como lenguajes informáticos y no de programación. Es el caso del HTML que se entiende como un sistema que permite ordenar y etiquetar diversos documentos dentro de una lista. La abstracción ofrecida por los lenguajes de programación Alejados ya de la máquina, los lenguajes siguieron evolucionando de la mano de la complejidad de los problemas que se pretendían resolver automáticamente. Brindan variados recursos al programador, para que, al diseñar el programa “ignore” distintos detalles del funcionamiento interno de la computadora. Trataremos ahora estas abstracciones, categorizándolas en dos grandes grupos: las que tienen que ver con los datos que deberán procesarse, abstracción de datos, y las que tienen que ver con el orden en que se ejecuten las acciones que corresponden al proceso, abstracción de control. Tanto en un caso como en el otro no mencionaremos las abstracciones que han incorporado los nuevos lenguajes de programación (encapsulado de datos, mecanismo de clases de los lenguajes orientados a objetos, mecanismos que permitan la ejecución agregan otras abstracciones que resultan apropiadas al tipo de problema con los que se puede trabajar Abstracción de datos: haremos una distinción entre las que tienen que ver con los valores en sí, y las que tienen que ver con la organización de los valores. - Abstracciones básicas: se refieren a la “representación” de las características del valor de un dato (del precio de un producto, del largo de una embarcación, de la edad de una persona, etc.) en cuanto a los patrones de bits que lo deben codificar, las direcciones de las celdas de memoria que se utilicen y las operaciones que con ellos se pueda realizar. Todo esto queda resumido en lo que, en los lenguajes se ha dado en llamar, tipo de dato. Proveen de palabras especiales con las que se identifica cada uno de los tipos, tal que, el programador se abstrae de conocer los detalles de implementación en el hardware de los valores a procesar. Por ejemplo, en el lenguaje C, los enunciados: float pr,largo; char ton; indican que los identificadores pr y largo se refieren a respectivas posiciones de memoria que contienen representaciones en punto flotante, que sus valores corresponderán a números que pueden incluir valores fraccionarios y que soportarán las operaciones aritméticas tradicionales y la comparación de su valor. En tanto que ton se refiere a símbolos Ing. Gracia María Gagliano Lenguajes de Programación 6 del alfabeto, de los números o de puntuación reconocidos en la notación ASCII y que tendrán a la comparación como una operación permitida. En Pascal, lo mismo se representaría: var largo, pr: real; ton: char; En los lenguajes de alto nivel más antiguos o de primera generación (FORTRAN I, ALGOL, etc.) los datos que se podían manipular eran puramente matemáticos, porque respondían a aplicaciones científicas y de ingeniería. Al extenderse el campo de acción de la programación hacia otras áreas, fue necesario trabajar con otros datos y, por lo tanto, con valores de otro tipo que se incorporarían como básicos a los lenguajes. Es el caso de los valores lógicos y de los caracteres. El programador estaba limitado a usar las abstracciones que proveía el lenguaje. - Abstracciones de organización: se refieren a la “representación” de datos más complejos, son los que se corresponden con una colección de valores de datos relacionados entre sí (nombre de una ciudad, datos personales de un estudiante, etc.). Para la abstracción de estos conjuntos, el concepto fundamental es el de dato estructurado. Los lenguajes incluyen como propias, algunas formas de organización o estructuras de datos, tales como arreglos, registros, cadenas entre otras, cada una de las cuales presenta características exclusivas del agrupamiento. Con algunos lenguajes se pueden definir las estructuras de datos como si fueran tipos, con las mismas posibilidades de manejo que los tipos básicos, pero con los rasgos y cualidades específicas que el programador requiera. Al contar con estos recursos, el programador tuvo la posibilidad de pensar en distintas formas de organizar los grupos de valores que fuera necesario manipular. Se hizo sumamente importante en la etapa de diseño de la solución del problema, detectar la o las estructuras más apropiadas para cubrir las necesidades del tratamiento de los datos ajustando las exigencias del problema a las posibilidades que ofrecen estas herramientas. Los lenguajes que se fueron inventando (que serían luego encuadrados en generaciones) incluyeron progresivamente, no sólo estas abstracciones sino que fueron incorporando la posibilidad de permitir al programador definir nuevas abstracciones de datos más específicas. - Abstracciones unitarias: se refieren a la posibilidad de trabajar, en determinados lugares del programa, con agrupamiento de código en forma de archivo. Las abstracciones de datos unitarias son la base del mecanismo de las bibliotecas estándar, de los paquetes o de las clases (en los lenguajes orientados a objeto). Abstracción de control: - Abstracciones básicas: son las que sintetizan en una sola instrucción, expresada en un único enunciado, a varias acciones de máquina. El mecanismo que usa la máquina, para realizar un cálculo (aritmético, lógico, de concatenación, etc.) involucra varias acciones que son distintas a las que tienen que ver con el traslado de valores de una localización a otra de la memoria. Sin embargo, el programador no se ocupa de ello, el lenguaje tiene un único enunciado llamada sentencia de asignación que combinada o no con algún símbolos especial, resume el accionar interno del hardware. Por ejemplo, en lenguaje C: x = ‘M’; activa una determinada cadena de bits en una dirección de memoria. z = 4 + w recupera el valor almacenado en una dirección de memoria y lo agrega a otro valor, activándose en una dirección de memoria distinta, la cadena de bits que representa al resultado. Ing. Gracia María Gagliano ex = imp; Lenguajes de Programación 7 copia (o traslada) el valor almacenado en una dirección a otra. En lenguaje Fortran: x = ‘M’ z = 4 + w ex = imp En lenguaje Pascal: x := ‘M’; z := 4 + w; ex := imp; - Internamente, la máquina almacena también en posiciones de memoria, a cada una de las instrucciones. Estas posiciones son consecutivas, de tal manera que, cuando se lo requiera, se ejecutarán automáticamente una después de la otra, salvo que una de esas instrucciones de máquina sea la que indica un salto en la secuencia. En ese caso, lo que hace, es transferir el control a la posición específica de memoria donde se encuentra otra instrucción que, de alguna forma, se ha etiquetado para ese fin (mediante un nombre o un número. En un lenguaje de programación el enunciado que viene a resumir este accionar, es la sentencia goto (ir a…). Se considera que, salvo para necesidades especiales, esta sentencia no es una forma útil de abstracción porque en realidad, con ella el programador no se libera de “pensar” en el accionar de la máquina para mantener el control sobre las instrucciones. Los lenguajes actuales tienen esta sentencia pero habilitada sólo para situaciones puntuales de la programación. Abstracciones estructuradas: son las que describen el orden en el cual las acciones van a ser ejecutadas. El hardware dispone de mecanismos que implementan la secuencialidad en la ejecución de las instrucciones de máquina, mediante un contador de programa que se incrementa con cada instrucción llevada a cabo. El contador puede ser modificado por una instrucción especial, tal que se provoque un cambio en el flujo de las acciones pues se estaría transfiriendo el control a una posición especificada, distinta que la próxima en la secuencia. Así es que se puede provocar una división en el flujo de instrucciones o una reiteración de las ya ejecutadas. Las abstracciones que proveen los lenguajes para que el programador no tenga que manipular con estas acciones, son las denominadas estructuras de control y corresponden a enunciados de selección simple (if-then-else en la mayoría de los lenguajes) de selección múltiple (case en Pascal, switch en C) y a los bucles o ciclos (for, while, dowhile en C o for, while, repeat-until en Pascal, o do, do while en Fortran)). Otro mecanismo para controlar el flujo durante la ejecución de un programa, aunque bastante más complejo a nivel de máquina, es el subprograma. Se trata de un recurso que se puede trabajar de dos maneras distintas, una es la que se denomina subrutina (o procedimiento) y la otra función. Consiste en un agrupamiento de acciones que resuelven un problema determinado, tiene sus propios datos y responde a un algoritmo específico. Se comporta como una unidad de programa independiente, pero asociada al programa principal de tal manera, que puede intercambiar explícitamente valores con él. Es así que el subprograma es llamado desde el Ing. Gracia María Gagliano - Lenguajes de Programación 8 programa principal. En esa circunstancia, se establece una conexión de paso (parámetros) para intercambiar información y se transfiere el control a la unidad de programa invocada. El subprograma es una abstracción muy especial que distingue entre la definición y el uso de la acción abstracta. Debe ser diseñado por el programador y puede ser usado cuando sea necesario, como si fuera una única acción. Durante su diseño, el programador se concentra solamente en el “cómo debe trabajar” (implementa la abstracción) e incluso debe identificar el proceso con un nombre. Cuando lo pone en uso, se concentra en el “qué hace”, ignorando los detalles de su real implementación (usa la abstracción). En esta doble abstracción se sintetiza no sólo la operatoria (en el cuerpo del subprograma) sino un mecanismo complejo que incluye la información referida al estado del programa en el punto de la invocación y al proceso de transferencia del control hacia y desde el subprograma (en la llamada). Abstracciones unitarias: son las que permiten reunir procedimientos que resuelven situaciones individuales, lógicamente vinculadas. Es, en esencia, lo mismo que describimos para la abstracción de datos de nivel unitario, sólo que aquí el enfoque está en las operaciones. Este tipo de abstracción de control provee herramientas para la programación en paralelo. El hardware actual, al tener varios procesadores, puede ejecutar varios procesos a la par. Los lenguajes modernos han incorporado entonces, mecanismos de control específicas como son los hilos o los task, Implementación de un lenguaje Se refiere a la manera de convertir o traducir a lenguaje de máquina un programa escrito en un lenguaje de programación. Es, en definitiva, lo que va a permitir que se ejecute un programa para una determinada combinación hardware-software. La conversión se realiza a través de un traductor, que no es más que un programa que recibe a otro programa escrito en un determinado lenguaje. El proceso de conversión se puede realizar de dos maneras: - mediante interpretación (el traductor se llama intérprete): convierte y ejecuta el programa. El programador no percibe la conversión a lenguaje de máquina, parece que se ejecuta directamente. - mediante compilación (el traductor se llama compilador): la actividad final del proceso de traducción es la generación de un nuevo código, se construye una secuencia de instrucciones en lenguaje de máquina que representan a los enunciados del programa fuente, el producto final es el programa objeto. Este sufrirá otros tratamientos para terminar en un programa ejecutable. La traducción consiste, esencialmente, en tres actividades básicas que llevan a cabo tanto los compiladores como los intérpretes: análisis léxico, análisis sintáctico y semántico. En el análisis léxico se reconocen las entidades elementales que se representan con las distintas cadenas de símbolos (identificadores, palabras reservadas y constantes), en el sintáctico se analiza la estructura gramatical de un enunciado y se reconoce el papel de cada uno de sus componentes y en el análisis semántico se analiza el significado. Aspectos generales del diseño de un lenguaje de programación El lenguaje provee de las primitivas a partir de las cuales se construirán los programas. Como cada primitiva es una estructura semántica y tiene una representación sintáctica abordaremos estas dos cuestiones. Relacionados con la semántica Ing. Gracia María Gagliano Lenguajes de Programación 9 La semántica de un lenguaje de programación abarca el significado de cada primitiva individual y de las estructuras compuestas por ellas. El significado al que nos referimos, guarda estricta vinculación con los conceptos que se requieren para la solución del problema, ya que el lenguaje debe ser capaz de expresarlos. Esos conceptos (o ideas) corresponden a una estructura semántica. En general, ocurre lo mismo que en un lenguaje natural. Una idea se puede expresar mediante una sola palabra o, algunas veces, combinando varias para formar un enunciado o párrafo. Pero, mientras que en esta clase de lenguajes un enunciado puede tener un significado ambiguo e inclusive pueden tener múltiples significados, en un lenguaje de programación no es tan así, la ambigüedad es, en general, inaceptable. El significado de cada primitiva es preciso, aunque en algunos casos ocurre que, al combinarlas para formar estructuras semánticas más complejas, surgen leves diferencias según la interpretación que se haga del enunciado (ambigüedad). En ese caso al diseñar el lenguaje se adoptarán reglas determinadas de uso para la estructura. Relacionados con la sintaxis La sintaxis de un lenguaje de programación abarca tanto el diseño del texto del programa en cuanto a la ubicación de los enunciados (formato fijo o formato libre, en los lenguajes modernos) como a la notación para representar la semántica de las primitivas individuales y de las combinadas. En general, desde la sintaxis también se viene a reforzar la manera como se resuelven las posibles ambigüedades de la semántica; es el caso, por ejemplo, del uso de paréntesis para asociar diversos componentes de un enunciado. Ing. Gracia María Gagliano Lenguajes de Programación 10 Bibliografía Louden, Kenneth C. (2004) - Lenguajes de Programación principios y práctica 2da.edición Ed. Thomson Brookshear, J.Glenn (1995) – Introducción a las Ciencias de la Computación 4ta.edición Addison Wesley iberoamericana Ruiz Limon, Ramón - Historia y Evolución del Pensamiento Científico ISBN-13: 978-84-690-6369-9 Nº Registro: 07/44311 Ghezzi, Carlo y Jazayeri, Mehdi (1997) - Programming Language Concepts 3ra.edición