Universidad de Oriente Núcleo de Monagas Programación Orientada a Objetos Unidad I V 9.5 Historia de la Computación, Introducción a los lenguajes de programación y al proceso de compilación de programas Prof. Fabricio Bravo Guevara UNIDAD I 1. Historia de las Computación Uno de los primeros dispositivos mecánicos para contar fue el ábaco, cuya historia se remonta a las antiguas civilizaciones griega y romana. Este dispositivo es muy sencillo, consta de cuentas ensartadas en varillas que a su vez están montadas en un marco rectangular. Al desplazar las cuentas sobre varillas, sus posiciones representan valores almacenados, y es mediante dichas posiciones que este representa y almacena datos. A este dispositivo no se le puede llamar computadora por carecer del elemento fundamental llamado programa. Otro de los inventos mecánicos fue la Pascalina inventada por Blaise Pascal (1623 - 1662) de Francia y la de Gottfried Wilhelm von Leibniz (1646 - 1716) de Alemania. Con estas máquinas, los datos se representaban mediante las posiciones de los engranajes, y los datos se introducían manualmente estableciendo dichas posiciones finales de las ruedas, de manera similar a como leemos los números en el cuentakilómetros de un automóvil. La primera computadora fue la máquina analítica creada por Charles Babbage, profesor matemático de la Universidad de Cambridge en el siglo XIX. La idea que tuvo Charles Babbage sobre un computador nació debido a que la elaboración de las tablas matemáticas era un proceso tedioso y propenso a errores. En 1823 el gobierno Británico lo apoyo para crear el proyecto de una máquina de diferencias, un dispositivo mecánico para efectuar sumas repetidas. Mientras tanto Charles Jacquard (francés), fabricante de tejidos, había creado un telar que podía reproducir automáticamente patrones de tejidos leyendo la información codificada en patrones de agujeros perforados en tarjetas de papel rígido. Al enterarse de este método Babbage abandonó la máquina de diferencias y se dedico al proyecto de la máquina analítica que se pudiera programar con tarjetas perforadas para efectuar cualquier cálculo con una precisión de 20 dígitos. La tecnología de la época no bastaba para hacer realidad sus ideas. El mundo no estaba listo, y no lo estaría por cien años más. En 1944 se construyó en la Universidad de Harvard, la Mark I, diseñada por un equipo encabezado por Howard H. Aiken. Esta máquina no está considerada como computadora electrónica debido a que no era de propósito general y su funcionamiento estaba basado en dispositivos electromecánicos llamados relevadores. En 1947 se construyó en la Universidad de Pennsylvania la ENIAC (Electronic Numerical Unidad I, POO Página 2 Integrator And Calculator) que fue la primera computadora electrónica, el equipo de diseño lo encabezaron los ingenieros John Mauchly y John Eckert. Esta máquina ocupaba todo un sótano de la Universidad, tenía más de 18 000 tubos de vacío, consumía 200 KW de energía eléctrica y requería todo un sistema de aire acondicionado, pero tenía la capacidad de realizar cinco mil operaciones aritméticas en un segundo. El proyecto, auspiciado por el departamento de Defensa de los Estados Unidos, culminó dos años después, cuando se integró a ese equipo el ingeniero y matemático húngaro John Von Neumann (1903 - 1957). Las ideas de von Neumann resultaron tan fundamentales para su desarrollo posterior, que es considerado el padre de las computadoras. La EDVAC (Electronic Discrete Variable Automatic Computer) fue diseñada por este nuevo equipo. Tenía aproximadamente cuatro mil bulbos y usaba un tipo de memoria basado en tubos llenos de mercurio por donde circulaban señales eléctricas sujetas a retardos. La idea fundamental de von Neumann fue: permitir que en la memoria coexistan datos con instrucciones, para que entonces la computadora pueda ser programada en un lenguaje, y no por medio de alambres que eléctricamente interconectaban varias secciones de control, como en la ENIAC. Todo este desarrollo de las computadoras suele divisarse por generaciones y el criterio que se determinó para determinar el cambio de generación no está muy bien definido, pero resulta aparente que deben cumplirse al menos los siguientes requisitos: • La forma en que están construidas. • Forma en que el ser humano se comunica con ellas. Primera Generación En esta generación había un gran desconocimiento de las capacidades de las computadoras, puesto que se realizó un estudio en esta época que determinó que con veinte computadoras se saturaría el mercado de los Estados Unidos en el campo de procesamiento de datos. Esta generación abarco la década de los cincuenta. Y se conoce como la primera generación. Estas máquinas tenían las siguientes características: • Estas máquinas estaban construidas por medio de tubos de vacío. • Eran programadas en lenguaje de máquina. En esta generación las máquinas son grandes y costosas (de un costo aproximado de cientos de miles de dólares). En 1951 aparece la UNIVAC (NIVersAl Computer), fue la primera computadora comercial, que Unidad I, POO Página 3 disponía de mil palabras de memoria central y podían leer cintas magnéticas, se utilizó para procesar el censo de 1950 en los Estados Unidos. En las dos primeras generaciones, las unidades de entrada utilizaban tarjetas perforadas, retomadas por Herman Hollerith (1860 - 1929), quien además fundó una compañía que con el paso del tiempo se conocería como IBM (International Bussines Machines). Después se desarrolló por IBM la IBM 701 de la cual se entregaron 18 unidades entre 1953 y 1957. Posteriormente, la compañía Remington Rand fabricó el modelo 1103, que competía con la 701 en el campo científico, por lo que la IBM desarrollo la 702, la cual presentó problemas en memoria, debido a esto no duró en el mercado. La computadora más exitosa de la primera generación fue la IBM 650, de la cual se produjeron varios cientos. Esta computadora que usaba un esquema de memoria secundaria llamado tambor magnético, que es el antecesor de los discos actuales. Otros modelos de computadora que se pueden situar en los inicios de la segunda generación son: la UNIVAC 80 y 90, las IBM 704 y 709, Burroughs 220 y UNIVAC 1105. Segunda Generación Cerca de la década de 1960, las computadoras seguían evolucionando, se reducía su tamaño y crecía su capacidad de procesamiento. También en esta época se empezó a definir la forma de comunicarse con las computadoras, que recibía el nombre de programación de sistemas. Las características de la segunda generación son las siguientes: • Están construidas con circuitos de transistores. • Se programan en nuevos lenguajes llamados lenguajes de alto nivel. En esta generación las computadoras se reducen de tamaño y son de menor costo. Aparecen muchas compañías y las computadoras eran bastante avanzadas para su época como la serie 5000 de Burroughs y la ATLAS de la Universidad de Manchester. Algunas de estas computadoras se programaban con cintas perforadas y otras más por medio de cableado en un tablero. Los programas eran hechos a la medida por un equipo de expertos: analistas, diseñadores, programadores y operadores que se manejaban como una orquesta para resolver los problemas y cálculos solicitados por la administración. El usuario final de la información no tenía contacto directo con las computadoras. Esta situación en un principio se produjo en las primeras computadoras personales, pues se requería saberlas Unidad I, POO Página 4 “programar” (alimentarle instrucciones) para obtener resultados; por lo tanto su uso estaba limitado a aquellos audaces pioneros que gustaran de pasar un buen número de horas escribiendo instrucciones, “corriendo” el programa resultante y verificando y corrigiendo los errores o bugs que aparecieran. Además, para no perder el “programa” resultante había que “guardarlo” (almacenarlo) en una grabadora de astte, pues en esa época no había discos flexibles y mucho menos discos duros para las PC; este procedimiento podía tomar de 10 a 45 minutos, según el programa. El panorama se modificó totalmente con la aparición de las computadoras personales con mejores circuitos, más memoria, unidades de disco flexible y sobre todo con la aparición de programas de aplicación general en donde el usuario compra el programa y se pone a trabajar. Aparecen los programas procesadores de palabras como el célebre Word Star, la impresionante hoja de cálculo (spreadsheet) Visicalc y otros más que de la noche a la mañana cambian la imagen de la PC. El sortware empieza a tratar de alcanzar el paso del hardware. Pero aquí aparece un nuevo elemento: el usuario. El usuario de las computadoras va cambiando y evolucionando con el tiempo. De estar totalmente desconectado a ellas en las máquinas grandes pasa la PC a ser pieza clave en el diseño tanto del hardware como del software. Aparece el concepto de human interface que es la relación entre el usuario y su computadora. Se habla entonces de hardware ergonómico (adaptado a las dimensiones humanas para reducir el cansancio), diseños de pantallas antirreflejos y teclados que descansen la muñeca. Con respecto al software se inicia una verdadera carrera para encontrar la manera en que el usuario pase menos tiempo capacitándose y entrenándose y más tiempo produciendo. Se ponen al alcance programas con menús (listas de opciones) que orientan en todo momento al usuario (con el consiguiente aburrimiento de los usuarios expertos); otros programas ofrecen toda una artillería de teclas de control y teclas de funciones (atajos) para efectuar toda suerte de efectos en el trabajo (con la consiguiente desorientación de los usuarios novatos). Se ofrecen un sinnúmero de cursos prometiendo que en pocas semanas hacen de cualquier persona un experto en los programas comerciales. Pero el problema “constante” es que ninguna solución para el uso de los programas es “constante”. Cada nuevo programa requiere aprender nuevos controles, nuevos trucos, nuevos menús. Se empieza a sentir que la relación usuario-PC no está acorde con los desarrollos del equipo y de la potencia de los programas. Hace falta una relación amistosa entre el usuario y la PC. Las computadoras de esta generación fueron: la Philco 212 (esta compañía se retiró del mercado en 1964) y la UNIVAC M460, la Control Data Corporation modelo 1604, seguida por la serie 3000, la IBM mejoró la 709 y sacó al mercado la 7090, la National Cash Register empezó a producir máquinas para proceso de datos de tipo comercial, introdujo el modelo NCR 315. La Radio Corporation of America introdujo el modelo 501, que manejaba el lenguaje COBOL, para procesos administrativos y comerciales. Después salió al mercado la RCA 601. Tercera generación Con los progresos de la electrónica y los avances de comunicación con las computadoras en la década de los 1960, surge la tercera generación de las computadoras. Se inaugura con la IBM 360 en abril de 1964. Unidad I, POO Página 5 Las características de esta generación fueron las siguientes: • Su fabricación electrónica está basada en circuitos integrados. • Su manejo es por medio de los lenguajes de control de los sistemas operativos. La IBM produce la serie 360 con los modelos 20, 22, 30, 40, 50, 65, 67, 75, 85, 90, 195 que utilizaban técnicas especiales del procesador, unidades de cinta de nueve canales, paquetes de discos magnéticos y otras características que ahora son estándares (no todos los modelos usaban estas técnicas, sino que estaba dividido por aplicaciones). El sistema operativo de la serie 360, se llamó OS que contaba con varias configuraciones, incluía un conjunto de técnicas de manejo de memoria y del procesador que pronto se convirtieron en estándares. En 1964 CDC introdujo la serie 6000 con la computadora 6600 que se consideró durante algunos años como la más rápida. En la década de 1970, la IBM produce la serie 370 (modelos 115, 125, 135, 145, 158, 168). UNIVAC compite con los modelos 1108 y 1110, máquinas en gran escala; mientras que CDC produce su serie 7000 con el modelo 7600. Estas computadoras se caracterizan por ser muy potentes y veloces. A finales de esta década la IBM de su serie 370 produce los modelos 3031, 3033, 4341. Burroughs con su serie 6000 produce los modelos 6500 y 6700 de avanzado diseño, que se reemplazaron por su serie 7000. Honey - Well participa con su computadora DPS con varios modelos. A mediados de la década de 1970, aparecen en el mercado las computadoras de tamaño mediano, o minicomputadoras que no son tan costosas como las grandes (llamadas también como mainframes que significa también, gran sistema), pero disponen de gran capacidad de procesamiento. Algunas minicomputadoras fueron las siguientes: la PDP - 8 y la PDP - 11 de Digital Equipment Corporation, la VAX (Virtual Address eXtended) de la misma compañía, los modelos NOVA y ECLIPSE de Data General, la serie 3000 y 9000 de Hewlett - Packard con varios modelos el 36 y el 34, la Wang y Honey - Well -Bull, Siemens de origen alemán, la ICL fabricada en Inglaterra. En la Unión Soviética se utilizó la US (Sistema Unificado, Ryad) que ha pasado por varias generaciones. Cuarta Generación Aquí aparecen los microprocesadores que es un gran adelanto de la microelectrónica, son Unidad I, POO Página 6 circuitos integrados de alta densidad y con una velocidad impresionante. Las microcomputadoras con base en estos circuitos son extremadamente pequeñas y baratas, por lo que su uso se extiende al mercado industrial. Aquí nacen las computadoras personales que han adquirido proporciones enormes y que han influido en la sociedad en general sobre la llamada “revolución informática”. En 1976 Steve Wozniak y Steve Jobs inventan la primera microcomputadora de uso masivo y más tarde forman la compañía conocida como la Apple que fue la segunda compañía más grande del mundo, antecedida tan solo por IBM; y esta por su parte es aún de las cinco compañías más grandes del mundo. En 1981 se vendieron 80000 computadoras personales, al siguiente subió a 1400000. Entre 1984 y 1987 se vendieron alrededor de 60 millones de computadoras personales, por lo que no queda duda que su impacto y penetración han sido enormes. Con el surgimiento de las computadoras personales, el software y los sistemas que con ellas de manejan han tenido un considerable avance, porque han hecho más interactiva la comunicación con el usuario. Surgen otras aplicaciones como los procesadores de palabra, las hojas electrónicas de cálculo, paquetes gráficos, etc. También las industrias del Software de las computadoras personales crece con gran rapidez, Gary Kildall y William Gates se dedicaron durante años a la creación de sistemas operativos y métodos para lograr una utilización sencilla de las microcomputadoras (son los creadores de los productos de Microsoft). No todo son microcomputadoras, por supuesto, las minicomputadoras y los grandes sistemas continúan en desarrollo. De hecho las máquinas pequeñas rebasaban por mucho la capacidad de los grandes sistemas de 10 o 15 años antes, que requerían de instalaciones costosas y especiales, pero sería equivocado suponer que las grandes computadoras han desaparecido; por el contrario, su presencia era ya ineludible en prácticamente todas las esferas de control gubernamental, militar y de la gran industria. Las enormes computadoras de las series CDC, CRAY, Hitachi o IBM por ejemplo, eran capaces de atender a varios cientos de millones de operaciones por segundo. Quinta Generación En vista de la acelerada marcha de la microelectrónica, la sociedad industrial se ha dado a la tarea de poner también a esa altura el desarrollo del software y los sistemas con que se manejan las computadoras. Surge la competencia internacional por el dominio del mercado de la computación, en la que se perfilan dos líderes que, sin embargo, no han podido alcanzar el nivel que se desea: la capacidad de comunicarse con la computadora en un lenguaje más cotidiano y no a través de códigos o lenguajes de control especializados. Unidad I, POO Página 7 Japón lanzó en 1983 el llamado “programa de la quinta generación de computadoras”, con los objetivos explícitos de producir máquinas con innovaciones reales en los criterios mencionados. Y en los Estados Unidos ya está en actividad un programa en desarrollo que persigue objetivos semejantes, que pueden resumirse de la siguiente manera: • Procesamiento en paralelo mediante arquitecturas y diseños especiales y circuitos de gran velocidad. • Manejo de lenguaje natural y sistemas de inteligencia artificial. El futuro previsible de la computación es muy interesante, y se puede esperar que esta ciencia siga siendo objeto de atención prioritaria de gobiernos y de la sociedad en conjunto. 2, ¿Qué es una computadora? Una computadora es un dispositivo capaz de realizar cálculos y tomar decisiones lógicas a velocidades hasta miles de millones de veces más rápidas que las alcanzables por los seres humanos. Por ejemplo, muchas de las computadoras personales actuales pueden realizar decenas de millones de sumas por segundo, y lo más sorprendente es que pueden hacer todo eso sin cometer errores, se imaginan a una persona provista de una calculadora cuánto tiempo le tomaría realizar el mismo cálculo 3, Componentes de una computadora Una computadora de cualquier forma que se vea tiene dos tipos de componentes: El Hardware (Parte Física) y el Software (Parte Lógica). 4. Hardware Llamamos Hardware a la parte física de la computadora, pues vienen a ser las partes que podamos percibir con el sentido del tacto. El hardware que compone a una computadora es muy complejo, pues una pequeña pieza puede contener millones de transistores. Ejemplo de Hardware podría ser la Tarjeta Madre, Memoria Principal, CPU, etc. 5. Partes del Hardware de una computadora El Hardware está compuesto por seis unidades o secciones básicas y son las siguientes: 1. Unidad de entrada. Que es la sección de recepción de la computadora: obtiene información (datos y programas de computadora) y lo coloca a disposición de las demás unidades para que sea procesada. La información se introduce por medio del teclado o del Mouse (ratón). Otros dispositivos pueden ser los escáneres, los lápices ópticos, las pantallas touch screen, cámaras, etc. Unidad I, POO Página 8 2. Unidad de salida. La computadora muestra las respuestas a través de esta unidad, estas respuestas son el resultado del procesamiento que realiza la computadora con los datos que hemos introducido. Por ejemplo mediante un dispositivo de entrada como el teclado, podemos escribir palabras la cuales las podremos observar por un dispositivo de salida como el monitor o la pantalla. Otros dispositivos de salida son también la impresora, los parlantes, tarjetas de video. 3. Unidad de memoria. También se la conoce como memoria RAM, es el almacén primario de la computadora por lo que es relativamente de baja capacidad. Esta memoria es la más importante de la computadora, porque guarda información necesaria para que la computadora pueda arrancar y funcionar, en otras palabras guarda información de todos los programas que se ejecutan en una computadora incluyendo al Sistema Operativo. 4. Unidad aritmética y lógica (ALU). Esta es la parte de la computadora en donde se realizan los cálculos como sumas, restas, multiplicación y división.. Aquí están también los mecanismos de decisión que permiten a la computadora, por ejemplo, comparar dos elementos de la unidad de memoria para determinar si son iguales o no. 5. Unidad central de procesamiento (CPU). Es el cerebro de la computadora, pues es el coordinador de la máquina y la parte encargada de supervisar el funcionamiento de las otras secciones. La CPU le dice a la unidad de entrada cuándo debe leerse información para introducirla en la unidad de memoria, le dice a la ALU cuando la información de la unidad de memoria debe utilizarse en los cálculos y le dice la unidad de salida cuando debe enviar la información que está en la unidad de memoria a ciertos dispositivos de salida. 6. Unidad de almacenamiento secundario. Esta es el almacén de largo plazo y de alta capacidad de la computadora. Los programas y datos que no están siendo utilizados por las otras unidades normalmente se colocan en dispositivos de almacenamiento secundario hasta que se necesiten, posiblemente horas, días, meses o incluso años después. El acceso es más lento comparado con el de la memoria primaria o memoria RAM. 6. Software Nos referimos con software a la parte lógica de la computadora, a los procedimientos que el hardware realiza inducidos por el software y este a su vez por nosotros. El software es como un traductor que hace que nuestras órdenes se conviertan en realidad, manipulando el hardware o la parte física. Unidad I, POO Página 9 El software está compuesto por programas de computadora. 7. Clasificación del software A los fines prácticos se puede clasificar al software en tres grandes tipos: o Software de sistema: Su objetivo es desvincular adecuadamente al usuario y al programador de los detalles del computador en particular que se use, aislándolo especialmente del procesamiento referido a las características internas de: memoria, discos, puertos y dispositivos de comunicaciones, impresoras, pantallas, teclados, etc. El software de sistema le procura al usuario y programador adecuadas interfaces de alto nivel, herramientas y utilidades de apoyo que permiten su mantenimiento. Ejemplo. Sistemas Operativos, Controladores de dispositivos, Herramientas de diagnóstico, Herramientas de Corrección y Optimización, etc… o Software de programación: Es el conjunto de herramientas que permiten al programador desarrollar programas informáticos, usando diferentes alternativas y lenguajes de programación, de una manera práctica. Incluye entre otros: Editores de texto, Compiladores, Intérpretes, Enlazadores, Depuradores, Entornos de Desarrollo Integrados (IDE). o Software de aplicación: Aquel que permite a los usuarios llevar a cabo una o varias tareas específicas, en cualquier campo de actividad susceptible de ser automatizado o asistido, con especial énfasis en los negocios. Incluye entre otros: Aplicaciones de Sistema de control y automatización industrial, Aplicaciones ofimáticas, Software educativo, Software empresarial, Bases de datos, Telecomunicaciones (p.ej. internet y toda su estructura lógica), Videojuegos, Software médico, etc… 8. Programa Un programa es un conjunto de instrucciones lógicas que le dicen a la computadora que debe hacer, además un programa debe satisfacer las necesidades de los usuarios utilizando eficientemente los recursos disponibles. Los programas que escribiremos más adelante serán en un lenguaje de programación muy popular: Java. 9. Código Fuente Le daremos el nombre de código fuente a los programas que escribamos en un determinado lenguaje de programación, que simplemente estará compuesto por instrucciones escritas por un programador. El código fuente no constituye software propiamente dicho pero es una instancia mediante la cual se llega al Software Unidad I, POO Página 10 10. Sistema Operativo Es el programa más importante que se ejecuta en una computadora. Cualquier computadora de propósito general debe operar con un sistema operativo para lograr ejecutar otros programas. El sistema operativo ejecuta las tareas básicas, como de reconocer entradas desde el teclado, enviar mensajes a pantalla manteniendo rastro de los archivos y directorios en el disco y controlar los dispositivos periféricos como las impresoras. Para grandes sistemas, el sistema operativo tiene una gran responsabilidad y cualidades. Es como un policía de tránsito, quien se asegura de que los diferentes programas que se ejecutan al mismo tiempo no interfieran unos con otros. También es responsable de la seguridad, asegurando que usuarios no autorizados accedan al sistema. El sistema operativo provee de una plataforma de software por encima de la cual otros programas, llamados aplicaciones, pueden ejecutarse. Los programas de aplicación tienen que crearse de acuerdo a la plataforma en donde se van a ejecutar. La elección de sistema operativo, entonces, determina el tipo de uso que se le va a dar a la PC como también el tipo de aplicaciones que se puedan ejecutar. Para las PCs (computadoras personales) los más populares sistemas operativos son el DOS, OS/2, y Windows, además de otros de libre distribución como el Linux. 11. Evolución de los Sistemas Operativos 1. Procesamiento por lotes (batch): las primeras computadoras eran capaces de realizar solamente una tarea o trabajo a la vez. La computadora ejecuta un solo programa a la vez, mientras procesa los datos en grupos o lotes. 2. Multiprogramación: operación simultánea de muchas tareas dentro de la computadora (esta comparte sus recursos entre los trabajos que compiten por su atención). 3. Tiempo compartido: es un caso especial de la multiprogramación en el cual los usuarios acceden a la computadora a través de terminales, que por lo general son dispositivos compuestos por un teclado y un monitor. Pueden existir docenas o incluso cientos de usuarios compartiendo la computadora al mismo tiempo. 12. Lenguajes de alto nivel, ensambladores y de máquina Los programadores escriben instrucciones en diversos lenguajes de programación. La computadora puede entender directamente algunos de ellos, pero otros requieren pasos de traducción intermedios. Hoy día se utilizan cientos de lenguajes de computadora, los cuales pueden dividirse en tres tipos generales: 1. Lenguajes máquina Una computadora sólo puede entender el lenguaje máquina. El lenguaje de máquina ordena a la computadora realizar sus operaciones fundamentales una por una. Dicho lenguaje es difícil de usar para las personas, porque trabajar con números no es muy cómodo además estos números están en formato binario. 2. Lenguajes ensambladores Para facilitar y agilizar su labor a los programadores, se buscaron nuevos lenguajes. El Unidad I, POO Página 11 lenguaje ensamblador consiste en pequeñas abreviaturas de palabras en ingles. Se crearon los programas traductores para convertir los programas escritos en lenguaje ensamblador a lenguaje máquina a velocidades de computadora. Estos lenguajes aun requerían muchas instrucciones para realizar simples operaciones. 3. Lenguajes de alto nivel Para acelerar, aún más, el proceso de programación se desarrollaron los lenguajes de alto nivel, en los que se podía escribir una instrucción para realizar tareas sustanciales. Los lenguajes de alto nivel permiten a los programadores escribir instrucciones que asemejan al inglés cotidiano y contiene notaciones matemáticas de uso común. 13. Traductor de lenguajes de programación A grandes rasgos, un traductor (compilador o intérprete) es un software que lee un programa escrito en un lenguaje (lenguaje fuente) y lo traduce a un programa equivalente en otro lenguaje (lenguaje objeto). Como parte importante de este proceso de traducción, el traductor informa a su usuario de la presencia de errores en el programa fuente. El proceso de traducción se divide en dos fases o etapas: • Fase de análisis.- La parte del análisis divide al programa fuente en sus elementos componentes y crea una representación intermedia del programa fuente. • Fase de síntesis.- La parte de la síntesis construye el programa objeto deseado a partir de la representación intermedia. De las dos partes, la síntesis es la que requiere las técnicas más especializadas. Además de un traductor, se pueden necesitar otros programas para crear un programa objeto ejecutable. Un programa fuente se puede dividir en módulos almacenados en archivos distintos. La tarea de reunir el programa fuente a menudo se confía a un programa distinto, llamado preprocesador.. 14. Proceso de traducción de programas El proceso de traducción se compone internamente de varias etapas o fases, que realizan distintas operaciones lógicas. Es útil pensar en estas fases como en piezas separadas dentro del traductor, y pueden en realidad escribirse como operaciones codificadas separadamente aunque en la práctica a menudo se integren juntas. Fase de análisis Análisis léxico El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tokens), que son secuencias de caracteres que tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del lenguaje (palabras clave, operadores,...) se han escrito correctamente. Unidad I, POO Página 12 Análisis sintáctico En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico. Análisis semántico La fase de análisis semántico revisa el programa fuente para tratar de encontrar errores semánticos y reúne la información sobre los tipos para la fase posterior de generación de código. En ella se utiliza la estructura jerárquica determinada por la fase de análisis sintáctico para identificar los operadores y operandos de expresiones y proposiciones. Un componente importante del análisis semántico es la verificación de tipos. Aquí, el compilador verifica si cada operador tiene operandos permitidos por la especificación del lenguaje fuente. Por ejemplo, las definiciones de muchos lenguajes de programación requieren que el compilador indique un error cada vez que se use un número real como índice de una matriz. Sin embargo, la especificación del lenguaje puede imponer restricciones a los operandos, por ejemplo, cuando un operador aritmético binario se aplica a un número entero y a un número real. Fase de síntesis Consiste en generar el código objeto equivalente al programa fuente. Sólo se genera código objeto cuando el programa fuente está libre de errores de análisis, lo cual no quiere decir que el programa se ejecute correctamente, ya que un programa puede tener errores de concepto o expresiones mal calculadas. Por lo general el código objeto es código de máquina relocalizable o código ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Después, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de máquina que ejecuta la misma tarea. Un aspecto decisivo es la asignación de variables a registros. Generación de código intermedio Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto. Optimización de código La fase de optimización de código consiste en mejorar el código intermedio, de modo que resulte un código máquina más rápido de ejecutar. Esta fase de la etapa de síntesis es posible sobre todo si el traductor es un compilador (difícilmente un intérprete puede optimizar Unidad I, POO Página 13 el código objeto). Hay mucha variación en la cantidad de optimización de código que ejecutan los distintos compiladores. En los que hacen mucha optimización, llamados "compiladores optimizadores", una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardar demasiado la compilación. Árbol sintáctico Si el analizador sintáctico genera un árbol sintáctico, por lo regular se construye como una estructura estándar basada en un puntero que se asigna de manera dinámica a medida que se efectúa el análisis sintáctico. El árbol entero puede entonces conservarse como una variable simple que apunta al nodo raíz. Cada nodo en la estructura es un registro cuyos campos representan la información recolectada tanto por el analizador sintáctico como, posteriormente, por el analizador semántico. Por ejemplo, el tipo de datos de una expresión puede conservarse como un campo en el nodo del árbol sintáctico para la expresión. En ocasiones, para ahorrar espacio, estos campos se asignan de manera dinámica, o se almacenan en otras estructuras de datos, tales como la tabla de símbolos, que permiten una asignación y desasignación selectivas. En realidad, cada nodo del árbol sintáctico por sí mismo puede requerir de atributos diferentes para ser almacenado, de acuerdo con la clase de estructura del lenguaje que represente. En este caso, cada nodo en el árbol sintáctico puede estar representado por un registro variable, con cada clase de nodo conteniendo solamente la información necesaria para ese caso. Tabla de símbolos Esta estructura de datos mantiene la información asociada con los identificadores: funciones, variables, constantes y tipos de datos. La tabla de símbolos interactúa con casi todas las fases del compilador: el analizador léxico, el analizador sintáctico o el analizador semántico pueden introducir identificadores dentro de la tabla; el analizador semántico agregará tipos de datos y otra información; y las fases de optimización y generación de código utilizarán la información proporcionada por la tabla de símbolos para efectuar selecciones apropiadas de código objeto. Puesto que la tabla de símbolos tendrá solicitudes de acceso con tanta frecuencia, las operaciones de inserción, eliminación y acceso necesitan ser eficientes, preferiblemente operaciones de tiempo constante. Una estructura de datos estándar para este propósito es la tabla de dispersión o de cálculo de dirección, aunque también se pueden utilizar diversas estructuras de árbol. En ocasiones se utilizan varias tablas y se mantienen en una lista o pila. 15. Compilador Para traducir un programa escrito en un lenguaje de alto nivel (programa fuente) a lenguaje de máquina se utiliza un programa llamado compilador. Este programa tomará como datos nuestro programa escrito en lenguaje de alto nivel y dará como resultado el mismo programa pero escrito en lenguaje de máquina, programa que ya puede ejecutar directa o indirectamente el ordenador. Unidad I, POO Página 14 Programa escrito en lenguaje de alto nivel un -> Compilador -> Programa escrito en lenguaje de máquina Por ejemplo, un programa escrito en el lenguaje C necesita del compilador C para poder ser traducido. Posteriormente el programa traducido podrá ser ejecutado directamente por el ordenador. En cambio, para traducir un programa escrito en el lenguaje Java necesita del compilador Java; en este caso, el lenguaje de máquina no corresponde al del ordenador sino al de una maquina ficticia, denominada maquina virtual java, que será puesta en marcha por el ordenador para ejecutar el programa. ¿Qué es una maquina virtual? Una maquina que no existe físicamente sino que es simulada en un ordenador por un programa. ¿Por qué utilizar una maquina virtual? Porque, por tratarse de un programa, es muy fácil instalarla en cualquier ordenador, basta con copiar ese programa en su disco duro, por ejemplo. Y, ¿qué ventajas reporta? Pues, en el caso de Java, que un programa escrito en este lenguaje y compilado, puede ser ejecutado en cualquier ordenador del mundo que tenga instalada esa máquina virtual. Esta solución hace posible que cualquier ordenador pueda ejecutar un programa escrito en Java independientemente de la plataforma que utilice, lo que se conoce como transportabilidad de programas. Unidad I, POO Página 15 16. Partes de un compilador Normalmente los compiladores están divididos en dos partes: • Front End: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar. • Back End: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End. Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para generar código máquina en varias plataformas distintas. El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker) 17. Tipos de compiladores Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que se adscriban a varias categorías: Compiladores cruzados: generan código para un sistema distinto del que están funcionando. Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original. Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente. Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina. Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan. 18. Interprete A diferencia de un compilador, un intérprete no genera un programa escrito en lenguaje maquina a partir del programa fuente, sino que efectúa la traducción y ejecución simultáneamente para cada una de las sentencias del programa. Por ejemplo, un programa escrito en el lenguaje Basic necesita el interprete Basic para ser ejecutado. Durante la ejecución de cada una de las sentencias del programa, ocurre simultáneamente la traducción. A diferencia de un compilador, un intérprete verifica cada línea del programa cuando se escribe, lo que facilita la puesta a punto del programa. En cambio la ejecución resulta más lenta ya que acarrea una traducción simultánea. Unidad I, POO Página 16 Ojo Los programas interpretados suelen ser más lentos que los compilados debido a la necesidad de traducir el programa mientras se ejecuta, pero a cambio son más flexibles como entornos de programación y depuración (lo que se traduce, por ejemplo, en una mayor facilidad para reemplazar partes enteras del programa o añadir módulos completamente nuevos), y permiten ofrecer al programa interpretado un entorno no dependiente de la máquina donde se ejecuta el intérprete, sino del propio intérprete (lo que se conoce comúnmente como máquina virtual). 19. Ejemplos de lenguajes interpretados Algunos ejemplos de lenguajes que son normalmente interpretados en vez de compilados son: • • • • • • • • • • Perl PHP Java Javascript Logo ASP (hasta la versión 3) Python C# J# ASP 20. Diferencia entre Compilador e Intérprete Los compiladores difieren de los intérpretes en varios aspectos: Un programa que ha sido compilado puede correr por sí solo, pues en el proceso de compilación se lo transformo en otro lenguaje (lenguaje máquina). Un intérprete traduce el programa cuando lo lee, convirtiendo el código del programa directamente en acciones. La ventaja del intérprete es que cualquier programa se puede interpretar en cualquier plataforma (sistema operativo), en cambio el archivo generado por el compilador solo funciona en la plataforma en donde se lo ha creado. Pero por otro lado un archivo compilado puede ser distribuido fácilmente conociendo la plataforma, mientras que un archivo interpretado no funciona si no se tiene el intérprete. Unidad I, POO Página 17 Hablando de la velocidad de ejecución un archivo compilado es de 10 a 20 veces más rápido que un archivo interpretado. 21. Maquina Virtual En informática una máquina virtual es un software que emula a un ordenador y puede ejecutar programas como si fuese un ordenador real. Este software en un principio fue definido como "un duplicado eficiente y aislado de una máquina física". La acepción del término actualmente incluye a máquinas virtuales que no tienen ninguna equivalencia directa con ningún hardware real. Una característica esencial de las máquinas virtuales es que los procesos que ejecutan están limitados por los recursos y abstracciones proporcionados por ellas. Estos procesos no pueden escaparse de este "ordenador virtual". Uno de los usos domésticos más extendidos de las máquinas virtuales es ejecutar sistemas operativos para "probarlos". De esta forma podemos ejecutar un sistema operativo que queramos probar (Linux, por ejemplo) desde nuestro sistema operativo habitual (Windows por ejemplo) sin necesidad de instalarlo directamente en nuestro ordenador y sin miedo a que se desconfigure el sistema operativo primario. 22. Tipos de Maquinas Virtuales Las máquinas virtuales se pueden clasificar en dos grandes categorías según su funcionalidad y su grado de equivalencia a una verdadera máquina. • Máquinas virtuales de sistema (en inglés System Virtual Machine) • Máquinas virtuales de proceso (en inglés Process Virtual Machine) 23. Máquinas virtuales de sistema Las máquinas virtuales de sistema, también llamadas máquinas virtuales de hardware, permiten a la máquina física subyacente multiplexarse entre varias máquinas virtuales, cada una ejecutando su propio sistema operativo. A la capa de software que permite la virtualización se la llama monitor de máquina virtual o "hypervisor". Un monitor de máquina virtual puede ejecutarse o bien directamente sobre el hardware o bien sobre un sistema operativo ("host operating system"). 24. Aplicaciones de las máquinas virtuales de sistema • Varios sistemas operativos distintos pueden coexistir sobre el mismo ordenador, en sólido aislamiento el uno del otro, por ejemplo para probar un sistema operativo nuevo sin necesidad de instalarlo directamente. • La máquina virtual puede proporcionar una arquitectura de instrucciones (ISA) que sea algo distinta de la de la verdadera máquina. Es decir, podemos simular hardware. • Varias máquinas virtuales (cada una con su propio sistema operativo llamado sistema operativo "invitado" o "guest"), pueden ser utilizadas para consolidar servidores. Esto permite que servicios que normalmente se tengan que ejecutar en ordenadores distintos para evitar interferencias, se puedan ejecutar en la misma máquina de Unidad I, POO Página 18 manera completamente aislada y compartiendo los recursos de un único ordenador. La consolidación de servidores a menudo contribuye a reducir el coste total de las instalaciones necesarias para mantener los servicios, dado que permiten ahorrar en hardware. • La virtualización es una excelente opción hoy día, ya que las maquinas actuales (Laptops, desktops, servidores) en la mayoría de los casos están siendo "subutilizados" (gran capacidad en disco, memoria RAM, en la mayoría de los casos se utiliza entre 30% a 60% de su capacidad). al virtualizar la necesidad de nuevas maquinas en una ya existencia se ahorra GRANDEMENTE EN COSTOS Asociados (energía, mantenimiento, espacio, etc. Funcionamiento de VMWare, una de las máquinas virtuales de sistema más populares 25. Máquinas virtuales de proceso Una máquina virtual de proceso, a veces llamada "máquina virtual de aplicación", se ejecuta como un proceso normal dentro de un sistema operativo y soporta un solo proceso. La máquina se inicia automáticamente cuando se lanza el proceso que se desea ejecutar y se para cuando éste finaliza. Su objetivo es el de proporcionar un entorno de ejecución independiente de la plataforma de hardware y del sistema operativo, que oculte los detalles de la plataforma subyacente y permita que un programa se ejecute siempre de la misma forma sobre cualquier plataforma. El ejemplo más conocido actualmente de este tipo de máquina virtual es la máquina virtual de Java. Otra máquina virtual muy conocida es la del entorno .Net de Microsoft que se llama "Common Language Runtime". Funcionamiento de la máquina virtual de Java, una de las máquinas virtuales de proceso más populares. Unidad I, POO Página 19 26. Inconvenientes de las máquinas virtuales Uno de los inconvenientes de las máquinas virtuales es que agregan gran complejidad al sistema en tiempo de ejecución. Esto tiene como efecto la ralentización del sistema, es decir, el programa no alcanzará la misma velocidad de ejecución que si se instalase directamente en el sistema operativo "anfitrión" (host) o directamente sobre la plataforma de hardware. Sin embargo, a menudo la flexibilidad que ofrecen compensa esta pérdida de eficiencia. 27. Lista de máquinas virtuales Máquinas virtuales de proceso Máquinas virtuales de sistema • Common Language Runtime - C#, • VThere (de Sentillion, Inc. [1]) Visual Basic .NET, J#, Managed C++ • ATL (A MTL Virtual Machine) • EiffelStudio, para el lenguaje de • Bochs emulador de PC x86 y AMD64, programación Eiffel portátil y open source • Lenguaje de programación Erlang • CoLinux Open Source Linux inside • Forth virtual machine - Forth Windows • Glulx - Glulx, Z-code • Denali, uses paravirtualization of x86 for running para-virtualized PC operating • Harbour - Harbour virtual machine systems. • Hec - Hasm Assembler • FAUmachine • Inferno - Limbo • Hercules emulator, free System/370, • Java virtual machine - Java, Nice, ESA/390, z/Mainframe NetREXX • Integrity Workstation Green Hills • Low Level Virtual Machine (LLVM) Software[2] actualmente C, C++, Stacker • LilyVM is a lightweight virtual • Lua machineAn introduction • Macromedia Flash Player - SWF • Microsoft Virtual PC y Microsoft Virtual • MMIX - MMIXAL Server • Neko virtual machine actualmente Neko • OKL4 y haXe • Parallels Workstation, virtualización de • O-code machine - BCPL x86 para ejecutar sistemas operativos • P-code machine - Pascal • Parallels Desktop for Mac, virtualización • Parrot - Perl 6 de x86 para ejecutar máquinas virtuales • Perl virtual machine - Perl en Mac OS X • Portable.NET - C#, Visual Basic .NET, • QEMU, muy popular en entornos Linux J#, Managed C++ • SheepShaver. • YARV - Ruby • Simics • Rubinius - Ruby • SVISTA • ScummVM - Scumm • Trango Virtual Processors • SECD machine - ISWIM, Lispkit Lisp • TwoOStwo • Sed the stream-editor can also be seen • User-mode Linux as a VM with 2 storage spaces. • VirtualBox • Smalltalk virtual machine - Smalltalk • Virtual Iron (Virtual Iron 3.1) • SQLite virtual machine - SQLite • Virtual Operating System de Star Virtual opcodes Unidad I, POO Página 20 • • • • Machines Squeak virtual machine - Squeak • VM de IBM SWEET16 • VMware (ESX Server, Fusion, Virtual TrueType virtual machine - TrueType Server, Workstation, Player y ACE) Valgrind - chequeo de accesos a • Xen memoria y "leaks" en x86/x86-64 code under Linux • KVM • VX32 virtual machine - application-level • IBM POWER SYSTEMS virtualization for native code Máquinas virtuales a nivel de sistema • Virtual Processor (VP) from Tao Groupoperativo (UK). • OpenVZ • Waba - similar a Java, para dispositivos • Virtuozzo pequeños • FreeVPS • Warren Abstract Machine - Prolog, • Linux-VServer CSC GraphTalk • FreeBSD Jails • Z-machine - Z-Code • Solaris Containers • Zend Engine - PHP • AIX Workload Partitions 28. Virtualización La virtualización es un término amplio que se refiere a la abstracción de los recursos de una computadora. Este término es bastante antiguo: viene siendo usado desde antes de 1960, y ha sido aplicado a diferentes aspectos y ámbitos de la informática, desde sistemas computacionales completos hasta capacidades o componentes individuales. El tema en común de todas las tecnologías de virtualización es la de ocultar los detalles técnicos a través de la encapsulación. La virtualización crea un interfaz externo que esconde una implementación subyacente mediante la combinación de recursos en locaciones físicas diferentes, o mediante la simplificación del sistema de control. Un reciente desarrollo de nuevas plataformas y tecnologías de virtualización han hecho que se vuelva a prestar atención a este maduro concepto. De modo similar al uso de términos como “abstracción” y “orientación a objetos”, virtualización es usado en muchos contextos diferentes. 29. Depurador En informática, programa diseñado para ayudar a depurar otro programa al permitir al programador observar su ejecución instrucción por instrucción. Se pueden visualizar los valores de las variables en cada momento y establecer puntos de ruptura (instrucción que se marca indicando donde detener la ejecución del programa para ver hasta ese momento el resultado de la ejecución). Los depuradores a nivel de código máquina presentan las instrucciones de máquina reales (desensambladas en lenguaje ensamblador) y permiten al programador observar los registros y ubicaciones en la memoria. Bibliografía Deitel Harvey y Deitel Paul. “Como Programar en Java, Quinta edición. Editorial Prentice Hall. 2004. Gálvez, Sergio y Moramata Miguel. “Java a Tope: TRADUCTORES Y COMPILADORES CON LEX/ YACC , JFLEX /CUP Y JAVACC”. Universidad de Málaga, Depto. De lenguajes y Ciencias de la Computación. España 2005 www.wikipedia.com/ UDO Monagas, Semestre I-2009 Prof. Fabricio Bravo Guevara Unidad I, POO Página 21