El ordenador, máquina informacional
Objetivos
Al finalizar este primer módulo, el alumno debería ser capaz de:
Definir qué se entiende por un computador.
Conocer los antecedentes del cálculo mecánico y las necesidades de gestión que constituyen los principales orígenes de la informática.
Enumerar las principales características de las diferentes generaciones de ordenadores.
Conocer la arquitectura de un ordenador, según el modelo de Von Neumann, definiendo y distinguiendo los principales componentes y su funcionalidad.
Describir los principales periféricos de un ordenador.
Conocer las principales instrucciones de código máquina y cómo se ejecutan en un ordenador. Efecturar el seguimiento de diferentes algoritmos.
Conocer cómo funciona la memoria principal de un ordenador. Conocer dónde se almacenan el programa y los datos.
Describir cómo se ejecutan los programas.
Definir y distinguir las principales funciones de los sistemas operativos, así como sus tipologías.
Plan de trabajo
Módulo 1: El ordenador, máquina informacional (1 crédito) Título unidad Objetivos Núcleos de
conocimiento Actividades Lecturas / Animaciones Tiempo El ordenador, una máquina informacional Definir qué se entiende por un ordenador. Conocer los antecedentes del cálculo mecánico y las necesidades de gestión que forman los principales Definición y concepto de ordenador. Tipos de ordenadores Antecedentes históricos de la informática Ordenar cronológicamente una serie de acontecimientos significativos. Lectura: "Antecedentes históricos de la informática. Los primeros ordenadores" de Miquel Barceló (del módulo 1 del
orígenes de la informática. Enumerar las principales características de las diferentes generaciones de ordenadores. Generaciones de ordenadores material en papel; pág. 9 a 15). La arquitectura de Von Neumann Conocer la arquitectura de un ordenador, según el modelo de Von Neumann, definiendo y distinguiendo los principales componentes y su funcionalidad. Describir los principales periféricos de un ordenador. La memoria principal La unidad aritmética y lógica La unidad de control La unidad entrada / salida Ejercicio de consolidación de conocimientos, preguntas sobre el direccionamiento a memoria, funcionamiento de alguno de los registros de la UC. Gráfica: Unidades de un ordenador y interacción entre ellas Animación de la lectura/escritura a la memoria principal Animación del funcionamiento de una ALU 3 h
Código máquina Conocer las principales instrucciones de código máquina y cómo se ejecutan en un ordenador. Hacer el seguimiento de diferentes algoritmos. Morfología de las instrucciones La pila o stack Instrucciones básicas en código máquina Ejercicios con instrucciones lógicas. Animaciones: ejecución de instrucciones 3.5 h Ejecución de programas Conocer cómo funciona la memoria principal de un ordenador. Conocer dónde se almacenan el programa y los datos. Describir cómo se ejecutan los programas. Cargar el programa a memoria Ejecución de un algoritmo en código máquina Código máquina frente de lenguaje de alto nivel Verificación del funcionamiento de la pila. Seguimiento de algoritmos. Gráfica: Mapa de memoria y almacenaje de los datos y los programas Animación: Ejecución de un programa 4 h Sistemas operativos Definir y distinguir las principales funciones de los sistemas operativos. Qué es un sistema operativo Funciones de los sistemas Verificar la certeza o falsedad de afirmaciones referentes al tema. 1,5 h
Definir los tipos de sistemas operativos. operativos Tipos de sistemas operativos Identificar las características principales de un PC de uso doméstico. Total 15 h
Introducción
Iniciamos este primer módulo con un repaso histórico del mundo de las ciencias de la computación desde sus inicios hasta llegar a nuestros días. Con ello pretendemos obtener una visión del contexto histórico que nos permita entender el estado actual del arte en las citadas ciencias.
Uno de los grandes objetivos de este módulo es alcanzar una idea básica pero clara de cómo funciona el ordenador, cómo se estructura su arquitectura y cómo se divide el trabajo en cada una de sus partes con la finalidad de que el conjunto sea capaz de funcionar de una forma rápida y eficiente.
Una vez que tengamos la visión funcional y arquitectónica de las computadoras entraremos en el reto de comprender su funcionamiento. Ya no nos conformaremos con saber qué parte hace cada función, sino que además nuestro objetivo será saber cómo la realiza. Así pues, aunque sea en un nivel básico, aprenderemos cómo actúa una computadora para efectuar la ejecución de programas diariamente utilizados por cada uno de
nosotros.
Al llegar al último tramo del módulo veremos el ordenador como un conjunto de piezas que unidas funcionan de una forma ordenada y sincronizada, con capacidad para hacer un trabajo útil. No obstante, para eso es preciso que haya un "director de orquesta" que dirija de manera acertada todos los integrantes del grupo. En este último tramo del módulo descubriremos a este director de orquesta y describiremos la figura que lleva a cabo dichas funciones: el sistema operativo.
Ordenador: concepto e historia
Introducción
Como se puede deducir de la introducción, el ordenador o computador será nuestro compañero de estudio durante todo el temario, bien sea como objeto de estudio o haciendo referencia al mismo como herramienta de trabajo. Uno de los objetivos perseguidos es que el ordenador no resulte un ente extraño, así que para que empecemos a familiarizarnos con él se definirán y buscarán sus orígenes a lo largo de su breve historia.
Definición y concepto de ordenador
Desde un punto de vista académico, podemos definir un ordenador como:
Máquina capaz de efectuar una secuencia de operaciones mediante un programa de tal manera que se realice un procesamiento sobre un conjunto de datos de entrada, con lo que se obtendría otro conjunto de datos de salida.
Ésta es una definición absolutamente genérica, de manera que el uso de un ordenador será de utilidad para un campo u otro en función del programa que se ejecute. La filosofía es que un ordenador en sí mismo no es capaz de hacer ni de resolver nada, por lo que necesita un programa que le indique cómo actuar. Dependiendo de lo adecuado que sea el programa que elijamos al fin que perseguimos, más útil nos será el uso de la potencia de cálculo que nos ofrecen los ordenadores.
La potencia de cálculo redundará en que nuestras tareas se harán de una forma más rápida, eficiente y reduciendo la probabilidad de error.
Cuanto más mecánica y repetitiva sea la tarea, más eficiente será el uso del ordenador. Para tareas creativas, el ordenador puede ser un instrumento de soporte fundamental, pero difícilmente podrá sustituir la capacidad creativa del usuario.
Antecedentes históricos de la informática
A continuación enumeraremos a modo de síntesis algunos de los hitos más significativos de la historia de la computación.
La historia de las máquinas de cálculo que dieron origen a los ordenadores actuales empieza con un instrumento utilizado por varias civilizaciones siglos antes de Jesucristo: el ábaco.
Leed los siguientes textos de Miquel Barceló: "Antecedentes históricos de la informática" y "Los primeros ordenadores".
Antecedentes históricos de la informática
Sales hace derivar la informática, o como mínimo el ordenador, de la necesidad de calcular sin errores (Sales, 1980). Comenta cómo esta necesidad ha proporcionado resultados independientes, pero también casi sucesivos en las calculadoras y los calculadores analógicos no electrónicos hasta llegar a los primeros ordenadores
electrónicos. Sin embargo, pensando en cómo es la informática hoy y en el peso que su utilización en el ámbito de la administración y la gestión de los negocios ha tenido en su desarrollo y difusión, hay que incluir, como otra motivación importante de la informática, la que deriva de este tipo de aplicación. Un ejemplo clásico es el
desarrollo de las tabuladoras y máquinas de proceso de datos administrativos que arrancan del problema del censo norteamericano de 1890 y la respuesta que dio Hollerit al respecto.
Las máquinas de calcular
El nombre inglés de la informática (computer science) pone el acento en la utilización de la técnica informática para el cálculo aritmético, para lo cual el primer precedente histórico de la informática es el ábaco. El antiguo aparato de cálculo, en realidad un elemento de ayuda a un calculista humano, parece originario del Antiguo Oriente, donde se empleó hace ya más de cinco mil años. También podrían mencionarse aquí, mucho más recientemente, los logaritmos (John Napier, 1614) y su utilización en la regla de cálculo.
Pero la historia moderna y occidental de las máquinas de calcular se hace comenzar, generalmente, con la máquina Arithmetica o Pascalina diseñada por Blaise Pascal en el año 1642. En realidad existió una calculadora anterior capaz de realizar multiplicaciones construida por Wilhelm Schickard en Tubinga en el año 1623, pero al haberse descubierto este hecho en 1957, en muchos sitios se sigue considerando a Pascal como el primer europeo que fabricó una máquina de contar.
Leibnitz también diseñó en el año 1694 la calculadora universal, que era capaz de hacer las cuatro operaciones principales e, incluso, raíces cuadradas. Uno de los rasgos más importantes de la calculadora de Leibnitz es que, con vistas a simplificar su construcción, el matemático alemán tuvo la idea de utilizar una notación binaria de las cifras en lugar del habitual sistema decimal. De hecho, fue el matemático inglés Georges Boole quien, mucho más
tarde, desarrolló con detalle la base de la lógica simbólica y, en especial, los operadores lógicos binarios y su álgebra. En la obra Treatise on Differential Equations de 1859, Boole incluía un resumen del método simbólico y destacaba las implicaciones que surgían al establecer una analogía entre el álgebra numérica y la que se podía utilizar para representar la lógica y los silogismos. El formulismo utilizado por Boole, la representación de los elementos binarios con ceros y unos, es aún la base de la utilización del sistema binario en los ordenadores actuales.
La analytical engine de Charles Babbage
Con toda seguridad el antecedente directo de los ordenadores actuales está en la denominada máquina analítica (analytical engine), concebida por el británico Charles Babbage en el año 1835, después, según parece, de los problemas en la construcción de un calculador anterior denominado máquina de diferencias (difference engine) que utilizaba el método de las diferencias.
La tecnología disponible en la época victoriana no hizo posible la construcción real de la máquina analítica de Babbage. La idea central combinaba la realización de las cuatro operaciones aritméticas con decisiones basadas en los resultados intermedios de las secuencias de cálculo. Es decir, era un calculador capaz de llevar a cabo cualquier tipo de cálculo si éste había sido especificado en un programa que Babbage denominaba control. El programa y los datos de entrada se registraban en una serie de tarjetas o fichas perforadas. Se utilizaba así la técnica de la perforación de tarjetas, que había empleado Jacquard, a principios del siglo XIX, para controlar los telares mecánicos. Una impresora, un estereotipo o bien una perforadora de tarjetas eran los elementos usados para mostrar las salidas e, incluso, los resultados intermedios.
En general, la estructura interna del diseño se acerca a lo que hoy llamamos "arquitectura Von Neumann", pero la tecnología no permitió que se construyera hasta el año 1944, poco después de que se redescubrieran, en 1937, los diseños y los escritos de Babbage.
Lo más importante de la máquina de Babbage son las innovaciones de diseño, las cuales, a pesar de su simplicidad conceptual, tuvieron un gran impacto, sobre todo en el siglo XX. En particular hay que destacar el concepto de transferencia condicional que permitía a la máquina comparar cantidades y, según el resultado de la comparación, tomar la decisión de saltar a otra instrucción o secuencia. Así, se introducía el concepto de programa y su secuencia de control. También aparece una distinción entre los datos y el programa que los utiliza: unas tarjetas de números con las cifras y las constantes del problema, unas tarjetas de directivas para controlar el movimiento de los números en la máquina y unas tarjetas de operación que dirigían el funcionamiento de las operaciones básicas, como la suma, la resta, la multiplicación y la división.
También hay que recordar aquí a la ayudante de Babbage, Ada Augusta, condesa de Lovelace, hija de Lord Byron, que fue la primera programadora de la historia. En el año 1843 publicó sus primeros programas para la máquina analítica, una suma de series y un cálculo recurrente de los números de Bernouilli. Se iniciaba así la historia paralela del software.
Los calculadores analógicos
Un precedente importante, que parecía muy prometedor, está representado por los calculadores analógicos como el predictor de mareas de Michelson y Stratton en el año 1898. La utilización de la analogía para calcular está en la base, por ejemplo, de la regla de cálculo (analogía entre la multiplicación y la suma de distancias gracias a los logaritmos) y, sobre todo, de los analizadores diferenciales, como el pionero de Thompson en el año 1876 y el más conocido de todos, el de Vannevar Bush, desarrollado, en varias versiones y tecnologías, a partir de 1930. Aunque durante los años treinta el analizador diferencial de Bush era el aparato de cálculo más potente, la tecnología digital y electrónica de ordenadores como el ENIAC lo superó, y puede decirse que la de los calculadores analógicos ha sido una línea que no ha tenido la continuidad ni ha proporcionado los éxitos que parecía prometer.
Las tabuladoras
Pese a que la máquina analítica de Babbage fue el precedente teórico del ordenador, la base industrial y comercial previa para hacer posible el uso generalizado del ordenador hay que buscarla en las tabuladoras, que son
máquinas de aplicación concreta en el ámbito del tratamiento de los datos administrativos.
Es conocido el hecho según el cual Herman Hollerit se enfrentaba en el año 1886 al problema de que el censo norteamericano de 1880 aún no se había procesado del todo. Por tanto, el censo siguiente de 1890, con un incremento de población previsto de aproximadamente 60 millones de personas, no podría procesarse en menos de diez años. Ello hacía que, al obtener los datos finales, éstos ya serían obsoletos porque ya se habría hecho el censo de 1900.
La máquina que resolvió el problema se denominó genéricamente tabuladora, porque el procesamiento de los datos era una clasificación y se hacían resúmenes e inventarios por distrito, sexo, religión, etc. en forma de tablas. En realidad, Hollerit diseñó un sistema formado por un lector eléctrico de tarjetas perforadas, una clasificadora
rudimentaria y una unidad tabuladora que hacía las sumas e imprimía los resultados.
El nuevo equipo consiguió una disminución espectacular de los errores en el proceso, así como un aumento de velocidad que permitió hacer el censo de 1890 en tres años, en lugar de los diez que se hubieran necesitado con el proceso manual. Nacían así la tabuladora electromecánica, que ha sido el antecedente directo del ordenador en su utilización para el trabajo administrativo en la primera mitad del siglo XX, y las empresas que la comercializaron, como IBM.
Los primeros ordenadores
Pasada esta primera etapa histórica, por fuerza acortada y sintetizada, y recogidos los precedentes teóricos (Babbage) y prácticos (Hollerit), se llega a los primeros ordenadores o, como mínimo, a las primeras máquinas que pueden recibir este nombre.
Los precursores electromecánicos
A menudo se define el ordenador como un calculador de utilización universal y de tipo digital en contraposición a los calculadores analógicos. Los primeros calculadores digitales que merecen el nombre de ordenador, si prescindimos de la tecnología que suponemos generalmente electrónica, son el Z3, un "calculador programable universal" proyectado por Konrad Zuse en el año 1941 en Alemania, y el Mark I, desarrollado por Howard H. Aiken en Harvard entre 1939 y 1944. Ambos utilizan la tecnología electromecánica del relé y todavía no son electrónicos. Hay otros precedentes electromecánicos, como el Complex Calculator, conocido también como Bell Model I, de George R. Stibitz, del año 1940, pero se suele citar el Mark I como el primer ordenador electromecánico del mismo modo que el proyecto de Babbage se considera el primer ordenador con tecnología mecánica.
Aiken y el Mark I
La máquina diseñada por Howard H. Aiken en Harvard y desarrollada conjuntamente con IBM, que entonces era la principal fabricante de tabuladoras, era un Automatic Sequence Controlled Calculator (ASCC, calculador automático de secuencia controlada), que utilizaba elementos electromecánicos y, según parece, tenía más de 7.000 relés y 800 kilómetros de cable eléctrico. IBM lo denominaba ASCC, pero en Harvard se conocía como Mark I. Se había diseñado en el año 1937 y su construcción duró desde 1939 hasta 1944.
El programa se introducía con una cinta de papel perforada, pero los datos se entraban mediante unos
conmutadores manuales o con tarjetas perforadas. Era capaz de multiplicar dos números de diez cifras en seis segundos y dividirlos en poco más de diez segundos. Los números podían tener un máximo de 23 cifras, y para sumarlos o restarlos tardaba medio segundo. Medía unos 15 metros de largo por 2,5 de alto y pesaba unas cuantas toneladas.
El ENIAC de Eckert y Mauchly
Se considera que el primer ordenador completamente electrónico fue el ENIAC (Electronic Numerical Integrator And Calculator, calculador e integrador numérico electrónico), pero, desde el punto de vista legal de las patentes, los tribunales norteamericanos han establecido que fue el de John Atanasoff, que construyó un calculador binario electrónico (ABC), una máquina de uso limitado para resolver sistemas de ecuaciones lineales, que se terminó en el Iowa State College en otoño de 1939.
El ENIAC se construyó en la Moore School of Electrical Engineering, en la Universidad de Pensilvania, bajo la dirección de John P. Eckert y John W. Mauchly. Se construyó en el Ballistic Research Laboratories (laboratorio de investigación en balística) en medio de un ambiente de secreto a causa de la guerra y, en realidad, le fueron variando el diseño. Pasó, de ser una máquina especializada en cálculos balísticos, a ser un calculador universal. Eckert y Mauchly utilizaron, quizá por primera vez en informática, un sistema de "congelación del diseño" para conseguir que las continuas variaciones y mejoras diseñadas no impidiesen que se construyera el ordenador. Desde el punto de vista tecnológico, la principal novedad era la utilización de los tubos electrónicos para el cálculo, teorizada ya en un memorándum escrito por Eckert en el año 1942.
Finalmente, el ENIAC se presentó en público el 15 de febrero de 1946. Era un monstruo de 30 toneladas, con más de 18.000 tubos electrónicos y ocupaba todo un piso de la Moore School. Consumía cerca de 200 kW y, según dice la leyenda, hacía que todo el barrio oeste de Filadelfia notara un parpadeo luminoso cuando se ponía en marcha. La tecnología electrónica le permitía realizar 5.000 sumas por segundo, frente a las 2 que conseguía el Mark I con sus relés, y podía efectuar en 30 segundos un cálculo de trayectorias para el que el analizador
diferencial de Bush necesitaba media hora. El ENIAC llevaba a cabo en una sola hora el trabajo de dos meses del equipo de doscientos calculistas del Ballistic Research Labs, que fue el que impulsó su creación.
Las máquinas de Von Neumann
Pese a todo, el ENIAC todavía no cumple totalmente las especificaciones típicas de lo que hoy se considera un ordenador con la ya tradicional arquitectura Von Neumann. Para serlo, es necesario que previamente se haya almacenado el programa en la memoria central del ordenador.
Éste es el planteamiento que hicieron Von Neumann, Eckert y Mauchly en el año 1945 y que proyectaron para el EDVAC (Electronic Discrete Variable Automatic Computer). En realidad se implementó primero en el EDSAC (Electronic Delay Storage Automatic Calculator) de Wilkes en la universidad británica de Cambridge (1949) y en el BINAC (Binary Automatic Calculator) que Eckert y Mauchly hicieron el mismo año en la empresa que crearon al irse de la Moore School. El EDVAC lo acabaron en 1952 en la Moore School, aunque Von Neumann ya no estaba allí. Se había ido a Princeton, donde diseñó el MANIC (instalado finalmente en el laboratorio de Los Alamos en el año 1951), en la línea del EDVAC.
Aunque el diseño del EDVAC fue conjunto (Von Neumann, Eckert y Mauchly), ha sido Von Neumann quien ha recogido la paternidad de la idea del programa almacenado por haber firmado él solo el artículo de junio de 1945 donde exponía las ideas centrales de su diseño.
John Napier (1550-1617) inventa los logaritmos y construye las primeras tablas. Mediante estas funciones matemáticas convierte los productos y divisiones en simples sumas y restas.
En los siglos XVI y XVII se construyeron máquinas mecánicas basadas en ruedas dentadas que simulaban el funcionamiento del ábaco, como la máquina aritmética o sumadora de Pascal (1642), construida por éste a la edad de diecinueve años.
Wilhelm von Leibniz (1646-1716) construyó la primera máquina capaz de multiplicar directamente. También efectuaba divisiones y raíces cuadradas.
Charles Babbage (1792-1871) diseñó la máquina analítica, que fue pensada como un calculador universal que pudiera resolver automáticamente cualquier problema matemático, con capacidad para albergar distintos programas. Aunque Babbage murió sin poder llegar a construirla.
Máquina analítica de Charles Babbage
George Boole (1815-1864) desarrolló el álgebra que lleva su nombre. Su lógica formal asignaba un 1 a cada proposición verdadera y un 0, a las falsas. Boole definió las operaciones no con operadores aritméticos, sino con operadores lógicos: Y, O y NO (AND, OR y NOT).
Tablas de verdad para las operaciones lógicas AND, OR, XOR, NAND, NOR, NOT A B A AND B A B A OR B 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 A B A NAND B A B A NOR B 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 0 A B A XOR B A NOT A 0 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0
A finales del siglo XIX se utilizan máquinas de cálculo mecánicas en los negocios y la gestión de empresas, como la máquina tabuladora de H. Hollerith (1886), con la que se realizó el censo norteamericano. Su artífice fundó la Tabulating Machine Corporation, que después se transformaría en IBM.
El primer ordenador electromecánico fue el Mark I, construido en la Universidad de Harvard por Howard H. Aiken en 1944 con la subvención de IBM. Tenía setecientas sesenta mil ruedas y relés y ochocientos kilómetros de cable; se basaba en la máquina analítica de Babbage.
El primer ordenador electrónico fue el ENIAC, construido en 1945 en la Escuela Moore de Ingeniería Eléctrica por John W. Mauchly y John Presper Eckert. Este ordenador era capaz de realizar cinco mil sumas por segundo, pesaba treinta toneladas, utilizaba dieciocho mil doscientas válvulas, ocupaba ciento cuarenta metros cuadrados y tenía un consumo medio de ciento cincuenta mil vatios. Evidentemente, necesitaba un potente equipo de
refrigeración.
ENIAC
John von Neumann (1903-1957), matemático húngaro, propuso almacenar el programa y los datos en la memoria del ordenador, con lo que se evitaba la modificación del cableado en el cambio de programas. Este gigantesco paso a un nivel conceptual daba pie a la que posteriormente se llamaría arquitectura de von Neumann, en la que se basan la mayoría de los ordenadores actuales.
Generaciones de ordenadores
Todo este desarrollo de las computadoras suele dividirse por generaciones. Los criterios para determinar el cambio de generación pueden ser diversos, pero está claro que al menos deben cumplirse los siguientes requisitos
diferenciales: la forma en que están construidas las computadoras y la forma en que el ser humano se comunica con éstas. Primera generación Segunda generación Tercera generación Cuarta generación Quinta generación Evolución futura
Primera generación
Esa generación vivió un gran desconocimiento de las capacidades de las computadoras. Prueba de ello es un estudio realizado en la época a partir del cual se determinó que con veinte computadoras se saturaría el mercado de Estados Unidos en el campo de procesamiento de datos. El paso del tiempo se ha encargado de dar a estas estimaciones la categoría de una pura anécdota.
Esta generación abarcó la década de los cincuenta, y es conocida como la primera generación. Estas máquinas presentaban las siguientes características:
En 1951 aparece la UNIVAC (UNIVersAl Computer), la primera computadora comercial. Disponía de mil palabras de memoria central y podía leer cintas magnéticas; se utilizó para procesar el censo de 1950 en Estados Unidos.
UNIVAC
En las dos primeras generaciones, las unidades de entrada utilizaban tarjetas perforadas. Estas tarjetas fueron retomadas por Herman Hollerith (1860-1929), quien, como ya hemos indicado, fundó una compañía que con el paso del tiempo se conocería como IBM (International Business Machines).
Poco después IBM desarrolló la IBM 701, de la cual se vendieron dieciocho 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. La respuesta de IBM fue el desarrollo de la 702, que presentó problemas en memoria, por lo que no duró demasiado tiempo en el mercado.
La computadora de mayor éxito de la primera generación fue la IBM 650, de la cual se produjeron varios
centenares. Esta computadora utilizaba 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.
Fueron construidas con tubos de vacío. Eran programadas en lenguaje máquina.
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, la cual recibía el nombre de programación de sistemas.
Las características de la segunda generación son las siguientes:
Las máquinas están construidas con circuitos de transistores. Se programan en nuevos lenguajes llamados lenguajes de alto nivel.
Podéis consultar el núcleo de conocimiento "Los lenguajes máquina, ensamblador y de alto nivel" del módulo "Software".
En esta generación aparecen muchas compañías. Las computadoras se reducen de tamaño y presentan un menor coste, 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, por medio de cableado en un tablero. Los programas se hacían a la medida por parte de 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 se produjo en un principio en las primeras computadoras personales, pues se requería saberlas programar (alimentarlas de 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, ejecutando el programa resultante y verificando y corrigiendo los errores o bugs (en el argot informático, se considera que un bug es un error en un programa ya comercializado) que aparecieran.
Para no perder el programa resultante, había que guardarlo (almacenarlo) en una grabadora de casete, pues en esa época no había discos flexibles, ni mucho menos discos duros para los PC. Este procedimiento podía llevar de diez a cuarenta y cinco 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 los que 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, cambiaron la imagen del PC. El software empieza a tratar de alcanzar el paso del hardware. Pero aquí aparece un nuevo elemento: el usuario.
Algunas de las computadoras integrantes de esta generación fueron las siguientes: 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; IBM mejoró la IBM 709 y sacó al mercado la IBM 7090, la National Cash Register empezó a producir máquinas para proceso de datos de tipo comercial e 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.
El usuario, a medida que se populariza la informática, conseguirá que el hardware y el software se diseñen y construyan no sólo bajo criterios de eficiencia y productividad, sino también teniendo muy en cuenta al propio usuario, de modo que se fabricará hardware cada vez más ergonómico y programas de uso intuitivo (friendly user interface).
El usuario de las computadoras va cambiando y evolucionando con el tiempo. De estar totalmente desconectado, en las máquinas grandes, pasa a ser pieza clave en el diseño tanto del hardware como del software. A medida que la informática va popularizándose, 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.
Todo esto provoca que el software inicie 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 del usuario programas con menús (listas de opciones) que lo orientan en todo momento (con el consiguiente aburrimiento de los usuarios expertos); otros programas ofrecen 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 ofrece un sinnúmero de cursos que prometen que en pocas semanas convierten a cualquier persona en un experto de los programas comerciales.
Sin embargo, el problema que persiste es que ninguna solución para el uso de los programas es definitiva. Cada nuevo programa requiere aprender nuevos controles, nuevos trucos, nuevos menús.
Todo esto provoca que la relación usuario-PC no se muestre acorde con los desarrollos del equipo y de la potencia de los programas. Este cúmulo de circunstancias provocará la aparición de sistemas operativos visuales y los programas user-friendly, que pretenden que su uso sea fácil, agradable y intuitivo. Esto se consigue mediante iconos representativos de las funciones que tiene el programa y estandarizando las tareas más comunes, las que tienen todos los programas (como pueden ser grabar un archivo, leerlo, imprimir, etc.).
Tercera generación
Con los progresos de la electrónica y los avances de comunicación en las computadoras, en la década de 1960 nace la tercera generación de computadoras.
Esta nueva generación se inaugura con la IBM 360 en abril de 1964.
IBM360
Las características de dicha generación fueron las siguientes:
Su manejo se realizaba por medio de los lenguajes de control de los sistemas operativos.
Pertenecen a esta tercera generación la serie 360 de IBM 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 estaban divididos por aplicaciones).
El sistema operativo de la serie 360 se llamó OS. Contaba con varias configuraciones e 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 durante varios años fue considerada como la más rápida.
En la década de 1970, IBM produce la serie 370 (modelos 115, 125, 135, 145, 158, 168). UNIVAC compite con los modelos 1108 y 1110, máquinas a gran escala, mientras que CDC produce su serie 7000 con el modelo 7600. Estas computadoras se caracterizan por ser muy potentes y veloces.
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 (también llamadas mainframes, que significa ‘gran sistema’), pero disponen de gran capacidad de procesamiento.
Podéis consultar el apartado " Sistemas operativos" de este módulo.
Cuarta generación
La aparición de los microprocesadores supone un enorme salto tecnólogico del que se aprovechará la industria del hardware para mejorar notablemente sus productos.
Las características de esta nueva generación son:
Gracias al avance en microelectrónica, se construyen microprocesadores con circuitos integrados de alta densidad.
Microprocesador INTEL 4004
Menor volumen y costes mucho más bajos que sus antecesores.
Las microcomputadoras que tienen su 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 (PC), que han adquirido enormes proporciones y han influido en la sociedad en general sobre la llamada "revolución informática".
En 1976, Stephen Wozniak y Steven Jobs inventaron la primera microcomputadora de uso masivo y más tarde formaron la compañía conocida como Apple, que fue la segunda compañía más grande del mundo, precedida únicamente por IBM; ésta, por su parte, es todavía una de las cinco compañías más importantes del mundo.
En 1981 se vendieron ochenta mil computadoras personales; al año siguiente, la cifra ascendió a un millón cuatrocientas mil. Entre 1984 y 1987 se vendieron en torno a sesenta millones, por lo que no queda duda de que su impacto y penetración han sido enormes.
Con el surgimiento de las computadoras personales, el software y los sistemas que con ellas se manejan han tenido un considerable avance, dado que han hecho más interactiva la comunicación con el usuario. Surgen otras aplicaciones como los procesadores de texto, las hojas 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 CP/M y 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 en gran medida la capacidad de los grandes sistemas de diez o quince años antes que requerían instalaciones costosas y especiales, aunque nos equivocaríamos si supusiéramos que las grandes computadoras han desaparecido; todo lo 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 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 ocupado 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 deseado: la capacidad de comunicarse con la computadora en un lenguaje más cotidiano y no por medio de códigos o lenguajes de control especializados.
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 mencionados criterios.
En Estados Unidos ya hay en activo un programa de desarrollo que persigue objetivos semejantes y que podemos resumir de la siguiente forma:
Procesamiento en paralelo mediante arquitecturas, 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.
A pesar de su complejidad, los ordenadores de esta generación se están diseñando para ser manejados por personas no expertas en informática.
En la actualidad esos ordenadores no están plenamente desarrollados. Se trabaja en ello en distintos países cuyos programas de investigación más importantes son los siguientes:
EE.UU. Proyectos DARPA y MCC. Unión Europea. Proyecto Spirit. Reino Unido. Proyecto Alvey.
Japón. Proyecto ICOT.
Evolución futura
Una tendencia constante en el desarrollo de los ordenadores es la microminiaturización, iniciativa que tiende a comprimir cada vez más los elementos de los circuitos en un espacio de chip cada vez menor.
Además, los investigadores intentan agilizar el funcionamiento de los circuitos mediante el uso de la
superconductividad, un fenómeno de disminución de la resistencia eléctrica que se observa cuando se enfrían los objetos a temperaturas muy bajas.
Las redes informáticas se han vuelto cada vez más importantes en el desarrollo de la tecnología de
computadoras. Las redes son grupos de computadoras interconectadas mediante sistemas de comunicación. La red pública Internet es un ejemplo de red informática planetaria. Las redes permiten que las computadoras conectadas intercambien rápidamente información y, en algunos casos, compartan una carga de trabajo, con lo que muchas pueden cooperar en la realización de una tarea. Se están desarrollando nuevas tecnologías de equipo físico y soporte lógico que acelerarán los dos procesos mencionados.
Podéis consultar el módulo "Redes y transmisión de datos" de esta asignatura.
Podéis consultar el apartado "La red Internet" del módulo "Redes y transmisión de datos" de esta asignatura.
Otra tendencia en el desarrollo de computadoras es la que centra sus esfuerzos en crear computadoras de quinta generación capaces de resolver problemas complejos en formas que pudieran llegar a considerarse creativas. Una vía que se está explorando activamente es el ordenador de proceso paralelo, que emplea muchos chips para realizar varias tareas diferentes al mismo tiempo. El proceso paralelo podría llegar a reproducir hasta cierto punto las complejas funciones de realimentación, aproximación y evaluación que caracterizan el pensamiento humano.
Otra forma de proceso paralelo que se está investigando es el uso de computadoras moleculares (mediante la nanotecnología). En estas computadoras, los símbolos lógicos se expresan mediante unidades químicas de ADN en vez de por el flujo de electrones habitual en las computadoras corrientes. Las computadoras moleculares podrían llegar a resolver problemas complicados mucho más rápidamente que las actuales supercomputadoras, así como a consumir mucha menos energía.
Arquitectura de von Neumann
Introducción
A mediados del siglo XX, John von Neumann diseñó una arquitectura que revolucionaría el estado del arte del mundo de las computadoras.
El objetivo es un hardware que debe ser capaz de memorizar, grabar y mostrar información.
Hacia 1950, John von Neumann tuvo la idea de construir una máquina que pudiera memorizar una serie de órdenes y una serie de datos, de modo que después pudiera trabajar sola hasta lograr el resultado. Para ello concibió la arquitectura o estructura física hoy conocida con su nombre y generalizada en la segunda y la tercera generación de computadoras, arquitectura que describiremos a continuación. Paralelamente concibió lo que se ha llamado el programa. Los programas son un conjunto estructurado de órdenes o instrucciones de trabajo que guían, paso a paso, el funcionamiento de la máquina.
Esto lleva a una primera estructuración: debe haber una unidad de memoria y una unidad de proceso
aritmética y lógica, así como una unidad de control. La memoria debe poder contener el programa y los datos, además de resultados parciales de las operaciones en curso. Estas tres unidades básicas conforman la unidad central de procesos (CPU, Central Process Unit).
Hoy en día, tanto las computadoras con gran volumen de memoria y alta velocidad de proceso (mainframe) como las computadoras personales de nuestras oficinas y hogares o las máquinas de videojuegos tienen una CPU con esta misma estructura que cumple las mismas funciones básicas.
La arquitectura de von Neumann se sigue usando actualmente para la construcción de casi todas las computadoras.
Sin embargo, para realizar su trabajo, la computadora debe tener componentes que permitan ingresar los datos y el programa, y sería inútil sin otros destinados a entregar los resultados solicitados: los periféricos de entrada y de salida. Un periférico típico de entrada es el teclado y uno de salida, la impresora o el monitor de vídeo, que permiten una mejor interacción del usuario con la máquina.
Podéis consultar el apartado "Periféricos" del núcleo de conocimiento "La unidad de entrada/salida" de este apartado.
Como ya habréis deducido, el modelo arquitectónico de von Neumann cuenta con los cuatro elementos arquitectónicos básicos siguientes:
Esquema de la arquitectura Von Neumann
Arquitectura von Neumann
La unidad central de procesos o CPU se subdivide en tres partes importantes:
Memoria principal Procesador (ALU + UC) Unidad de entrada/salida
Memoria principal
Unidad de control (UC)
Unidad de entrada/salida (E/S)
Esta estructura dota al ordenador de la capacidad de ir ejecutando instrucciones elementales llamadas
instrucciones de lenguaje máquina. Son instrucciones muy básicas que se ejecutan muy rápidamente de forma secuencial. El conjunto de todas ellas forma los programas.
Un programa en lenguaje máquina es un conjunto ordenado de instrucciones de máquina seleccionadas y organizadas para realizar un algoritmo.
La memoria principal
La memoria principal es el lugar donde se almacenan tanto los programas como los datos que usa el programa, de manera que es una de las partes fundamentales de la arquitectura de von Neumann. En una primera aproximación se puede ver la memoria principal como un conjunto de celdas capaces de almacenar información, bien sean instrucciones del programa, bien sean datos en forma de números o caracteres alfanuméricos. Cada una de dichas celdas está identificada unívocamente por un número al que llamaremos a partir de ahora dirección de memoria.
La memoria principal suele ser una memoria volátil, es decir, que al interrumpirse el flujo de corriente eléctrica (cuando se apaga la computadora) pierde todos sus datos.
La memoria principal debe ser una memoria de acceso aleatorio o RAM (Random Acces Memory). Esto significa que el procesador puede acceder directamente, sin necesidad de leer las casillas anteriores, a la información de cualquier casilla de la memoria.
Como ya hemos mencionado, la memoria se estructura en casillas. Cada casilla tiene capacidad para almacenar un byte, es decir, 8 bits. Cada casilla, a su vez, está numerada, y a este número lo llamaremos dirección de memoria. En la memoria se almacenan tanto los datos como las instrucciones del programa que se está ejecutando. Es condición imprescindible, pues, que antes de ejecutar un programa éste se cargue en memoria (recordemos que éste es uno de los aspectos cruciales de la arquitectura von Neumann).
Las memorias RAM son tanto de lectura como de escritura, en contraste con las memorias que son de solo lectura o ROM (Read Only Memory). Para escribir un dato, éste debe ponerse en el bus de datos, hay que activar la señal de escritura y poner en el bus de direccionamiento la dirección de la casilla en la que debe almacenarse. Para la lectura sólo hay que informar al bus de direccionamiento sobre la dirección de la casilla de la cual se desea extraer la información, y a continuación activar la señal de lectura. El dato se cargará en el bus de datos y llegará al procesador.
Esquema de una memoria con sus casillas, bus de direccionamiento, línea de control de escritura/lectura, bus de datos, etc.
Esquema memoria
La unidad aritmética y lógica
Tablas de verdad para las operaciones lógicas AND, OR, XOR, NAND, NOR, NOT A B A AND B A B A OR B 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 A B A NAND B A B A NOR B 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 0 A B A XOR B A NOT A 0 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0
La unidad aritmética y lógica está formada por una serie de circuitos digitales que permiten hacer operaciones aritméticas como sumar, restar, multiplicar, dividir, etc. y operaciones lógicas como and, or, xor, etc.
Esta unidad opera con datos almacenados en unos contenedores que llamaremos registros (los registros son como casillas individuales de memoria que residen en el propio procesador). El acceso a dichos datos es muy rápido, de modo que las operaciones se hacen en tiempos extremadamente cortos. Hay muy pocos registros, los valores típicos estarían entre 8 y 16, lo que exige una constante ida y venida de datos desde los registros a la memoria principal y viceversa.
Esquema de unidad aritmética y lógica
La unidad de control
La unidad de control es la encargada de coordinar todos los componentes y los flujos de datos. Es muy compleja en computadoras grandes; sin embargo, su estructura en computadoras pequeñas es una buena ilustración de sus sistemas básicos. Podemos dividir la citada estructura en varias partes:
Esquema de la unidad de control con todos sus elementos
Unidad de control
Además de los registros que se explicitan en el esquema superior, en la unidad de control residen un número indeterminado (variable según el tipo de procesador) de registros. Estos registros son como pequeñas celdas unitarias de memoria que utiliza el procesador para almacenar datos que se usan para ejecutar las instrucciones de los programas. Estos datos suelen recogerse de la memoria principal y se devuelven a ésta si el programa así lo requiere. En los apartados en que se simule la ejecución de programas se verá la función real de dichos registros.
La memoria tampón o caché, en la que se mantienen temporalmente datos que fluyen desde la memoria principal (RAM) o hacia la misma. Actualmente, la memoria caché se encuentra en casi todos los ordenadores; es una pequeña memoria adicional muy rápida que complementa la memoria principal y que permite aumentar sustancialmente las prestaciones de la computadora.
El contador de programa, que contiene la dirección de la siguiente instrucción pendiente de ser ejecutada. El registro de dirección, que contiene la dirección de la celda de memoria (RAM) en la que se está leyendo o escribiendo.
El registro de instrucciones, que contiene el código de la instrucción en curso de ejecución.
El decodificador, dispositivo que interpreta la instrucción y dirige los flujos de información de manera que la instrucción se lleve a cabo adecuadamente.
El registro de estado mantiene información que afecta al funcionamiento de la unidad de control.
En máquinas más complejas se agrega, además, un controlador de entradas y salidas que administra todo el flujo hacia los periféricos y desde los mismos.
El procesador es el conjunto formado por la unidad de control y la unidad aritmética y lógica.
La unidad de entrada/salida
Esta unidad se encarga de gestionar la comunicación del ordenador con el mundo exterior. Su función es gestionar tanto los datos que le llegan de los periféricos de entrada como los que, procedentes del ordenador, tienen como destino los periféricos de salida.
La velocidad de los periféricos suele ser muy inferior a la velocidad del ordenador. La unidad de entrada/salida no sólo se encarga de establecer la conexión ordenador-periférico, sino que también se encarga de adaptar las velocidades entre ambos, minimizando el tiempo que el ordenador dedica a atender estas peticiones.
La unidad de entrada/salida (E/S) se encarga de conectar el ordenador a las unidades exteriores llamadas periféricos.
Periféricos
Como ya hemos dicho, los periféricos nos ayudan a introducir y a extraer información del ordenador. Hay una gran variedad de periféricos, muchos de ellos imprescindibles para el uso del ordenador. Los podemos clasificar en dos grandes grupos según su naturaleza funcional:
Periféricos de almacenamiento de información. Guardan los datos.
Los periféricos de almacenamiento tienen como característica común un incremento muy fuerte de su capacidad a lo largo de la historia de la informática, y sucede algo similar con respecto a su velocidad. Son elementos lentos con respecto a las velocidades de proceso que ofrece el ordenador, pero cada vez presentan una mayor velocidad.
Podéis consultar el núcleo de conocimiento "Dispositivos de almacenamiento de datos" del módulo "Gestión de datos".
El punto crítico de los periféricos de comunicación es la velocidad, al igual que sucedía en el caso de los de almacenamiento. Este parámetro está creciendo a pasos agigantados a medida que la tecnología evoluciona. Son periféricos de comunicación los siguientes:
Impresoras. Pueden ser de muchos tipos. Hay impresoras matriciales, de margarita, de inyección de tinta y láser. En general son elementos lentos, aunque sus velocidades dependen mucho de la tecnología y del precio que se esté dispuesto a pagar por ellas. La velocidad en estos dispositivos se mide en páginas por minuto o páginas en color por minuto.
Pantalla. Existen varios tipos de pantallas, las pantallas de cristal líquido que suelen montarse en los ordenadores portátiles, las pantallas de rayos catódicos, las pantallas planas, etc. Las características más importantes son la dimensión de la diagonal de la pantalla, la resolución que es capaz de alcanzar, etc. Otro parámetro interesante es la dimensión del píxel: cuanto menor sea éste, mayor nitidez de imagen tendremos. Para el bien de los ojos del usuario es imprescindible que estén homologadas como pantallas de baja
radiación.
Valores típicos para la diagonal de pantalla pueden ser: 12 ó 14 pulgadas para las pantallas de los
ordenadores portátiles; 15, 17 ó 19 pulgadas para las pantallas de rayos catódicos y 15 ó 17 pulgadas para las pantallas planas.
Típicamente se usan resoluciones de 800 · 600, 1.024 · 768, 1.600 · 1.200, siempre adecuándose a la dimensión de la pantalla.
Tenemos como valor típico de dimensión el píxel de 0,25 mm.
Teclado. Hay una gran variedad de teclados. Se distinguen por la tecnología utilizada, por la distribución de las teclas, etc. Disponemos de teclados inalámbricos por radiofrecuencia, inalámbricos por infrarrojos, teclados con la distribución de la teclas ergonométrica con el fin de adecuarse mejor a la posición de manos y brazos, etc.
Ratón o mouse. También existe un variado surtido de ejemplares: inalámbricos por radiofrecuencia, inalámbricos por infrarrojos, con dos botones, con tres botones, con funcionalidades extras para navegar en Internet, etc.
Escáner. El parámetro más importante de estos dispositivos es su resolución óptica, que es el parámetro equivalente a la resolución en las pantallas. La velocidad en general es lenta, pero como en el caso de las impresoras, la calidad de sus características es muy variable en función de su coste.
Módem. Es el dispositivo que modula la señal de salida del ordenador para que se pueda transmitir a la línea telefónica. De la misma forma, modula la señal que nos llega vía línea telefónica para que la entiendan los sistemas internos del ordenador. El parámetro más importante de este tipo de dispositivos es la velocidad de transmisión.
Hoy en día, la velocidad típica de los módems es de 56 Kbps, aunque suelen ser asimétricos: son capaces de recibir a 56 Kbps (canal de bajada), pero sólo transmiten a 33 Kbps (canal de subida).
Código máquina
Introducción
Los programadores son capaces de escribir programas complejos con los distintos lenguajes de programación de que se dispone hoy día. Conceptualmente, los lenguajes pueden tener mayor o menor complejidad, pero todos tienen una sintaxis y unas instrucciones propias que el programador debe conocer para poder escribir códigos correctos y eficientes.
El léxico de un lenguaje de programación es una herramienta de comunicación entre el
programador y la herramienta de programación, pero el procesador del ordenador no entiende ese lenguaje, el procesador tiene su propio lenguaje, sus propias instrucciones, es incapaz, por tanto, de ejecutar las órdenes que describe el lenguaje del programador.
Como podemos deducir del párrafo anterior, hay un problema. El problema reside en que el procesador del ordenador tiene sus propias instrucciones y sólo es capaz de ejecutar este tipo de instrucciones. Las instrucciones del procesador son muy básicas y poco flexibles, de manera que programar aplicaciones complejas sería poco menos que imposible.
Los programadores realizan programas utilizando lenguajes de alto nivel como C, C++, Delphi, Java, VisualBasic, PowerBuilder, etc. Estos lenguajes de alto nivel tienen características muy distintas, pero todos ofrecen al
programador un juego de sentencias, una sintaxis y, a menudo, un entorno de programación que facilita dicha tarea.
Como hemos indicado, los programas escritos por los programadores (simples ficheros en modo texto) no son inteligibles para la computadora, por lo que deberá haber alguien que haga la traducción del lenguaje de alto nivel a las instrucciones que puede ejecutar el procesador. Este paso recibe el nombre de compilación.
El compilador es quien traduce las sentencias de alto nivel a sentencias de lenguaje máquina; en otras palabras, es quien pasa los ficheros fuente (ficheros de texto escritos en el lenguaje de alto nivel) a ficheros ejecutables (ficheros binarios escritos en lenguaje máquina).
Cada procesador tiene su propio juego de instrucciones máquina. El número de instrucciones máquina no es muy grande, oscila entre las sesenta y las doscientas cincuenta. La particularidad de las instrucciones propiedad de cada procesador impide que un programa compilado para un determinado tipo de procesador sea ejecutable en otro.
Desde mediados de la década de los noventa se ha popularizado el lenguaje de programación Java. Dejando aparte su potencia, una de las claves de su éxito radica en que los ficheros compilados en Java se pueden ejecutar en cualquier máquina.
Esto se consigue porque el compilador de Java no traduce el código fuente a instrucciones máquina propias del procesador, sino que construye los llamados archivos en bytecode. Si se ha instalado previamente en las computadoras en las que se pretende ejecutar el programa escrito y compilado en Java lo que se llama una máquina virtual Java, podremos ejecutar los programas en dicho lenguaje, ya que esta máquina virtual es la que traduce los bytecodes a instrucciones máquina del procesador en tiempo de ejecución.
Los lenguajes cuyo código debe ser compilado para que se pueda llevar a cabo su ejecución reciben el nombre de lenguajes compilados, mientras que aquellos que poseen un intérprete que va traduciendo el código a lenguaje máquina en tiempo de ejecución se llaman lenguajes interpretados. En general, los lenguajes interpretados son más lentos que los compilados. Son lenguajes compilados C, Pascal, C++, VisualBasic, Cobol, etc. Los lenguajes interpretados son menos abundantes; entre éstos destacan el lenguaje Java y Developer 2000.
Morfología de las instrucciones
Las instrucciones de lenguaje máquina (en ocasiones también llamado lenguaje ensamblador) se apoyan en los registros de la unidad de control, que los necesita para alimentarse de datos para ejecutar la instrucción.
Una instrucción en lenguaje máquina tiene típicamente tres partes claramente diferenciadas (nombre instrucción, operador 1 y operador 2).
Nombre instrucción Operador 1 Operador 2
Nombre de la instrucción: caracteriza la acción que debe llevar a cabo el procesador.
Operadores: contienen los datos o la referencia a los datos que van a usarse en la acción indicada por la instrucción.
No todas las instrucciones precisarán de operandos; pueden aparecer los dos, sólo uno o ninguno.
El resultado de la operación se almacena en alguno de los operadores o bien en el registro de estado de la unidad de control dependiendo de la naturaleza de la instrucción.
La pila o stack
La pila es una porción de memoria que tiene un comportamiento un tanto singular. Es un recurso muy utilizado en la programación.
La pila actúa como un pozo en el que vamos depositando datos, y no podemos extraer un dato si previamente no hemos extraído los datos que hay por encima de éste.
Este comportamiento se denomina técnicamente LIFO (Last In First Out), es decir, el último en entrar en la pila será el primero en salir y viceversa. La pila es un recurso muy utilizado en programación. En el juego de
instrucciones de los procesadores hay instrucciones explícitas para el uso de la pila, para introducir datos en ésta y extraerlos.
La instrucción para la entrada de datos en la pila se llama push, mientras que la de extracción se denomina pop. Morfológicamente, las instrucciones de inserción y extracción seguirían la siguiente estructura:
Push Operador 1 --
Pondrá el valor del operador 1 en la pila.
Pop Operador 1 --
Instrucciones básicas en código máquina
Hay un pequeño grupo de instrucciones básicas comunes a la gran mayoría de los procesadores. Los principales tipos de instrucciones son:
aritméticas, de transferencia, lógicas,
de bifurcación.
Instrucciones básicas
Instrucción Operador 1 Operador 2 Descripción Instrucciones aritméticas
Add A B Suma A + B y deja el resultado en A (A + B ! A). Sub A B Resta A – B y deja el resultado en A (A – B ! A). Mul A B Multiplica A · B y deja el resultado en A (A · B ! A). Div A B Divide A / B y deja el resultado en A (A / B ! A).
Inc A Incrementa A en una unidad (A + 1 ! A).
Dec A Decrementa A en una unidad (A – 1 ! A).
Neg A Multiplica A por –1 [A · (–1) ! A].
Abs A Nos devuelve el valor absoluto de A [si A < 0 entonces A · (–1) !"A. Para el caso de que A > 0, entonces A ! A]. Mod A B Nos devuelve el resto del cociente entre A y B [A = B·
cociente (A/B) + resto, resto ! A]. Instrucciones de transferencia
Move A B Mueve el contenido de A hacia B (A ! B), sin borrarlo de A. Store A B Almacena el contenido de A en la dirección de memoria B (A
! @B).
Load A B Lee el contenido de la dirección de memoria B en el registro A (A # @B).
Push A Introduce el contenido de A en la pila (A ! stack). Pop A Devuelve el primer elemento de la pila a A (stack ! A).
Clear A Repone a 0 el registro A (A = 0).
Set A Fuerza a que todos los bits del registro A sean 1 (A = ’11111111’ para un registro de 8 bits).
Instrucciones lógicas
Shr A Desplazamiento lógico (bit a bit) hacia la derecha, equivale a dividir por 2.
Shl A Desplazamiento lógico (bit a bit) hacia la izquierda, equivale a multiplicar por 2.
Cmp A B Comparación lógica bit a bit mediante un XOR (A XOR B ! A).
Test A Compara A con 0, deja el resultado en el registro de estado.
And A B Operación lógica AND ((A AND B) ! A).
Or A B Operación lógica OR ((A OR B) ! A).
Xor A B Operación lógica XOR ((A XOR B) ! A).
Nop - - No hace nada, puede usarse en un bucle de espera. Instrucciones de bifurcación
Branch if no zero N
- - Escribe en el contador de programa el número N si el registro de estado nos indica que la operación anterior ha dado un resultado diferente de cero.
Branch if zero N - - Escribe en el contador de programa el número N si el registro de estado nos indica que la operación anterior ha dado un resultado igual a cero.
Jump N - - Se usa para alterar la ejecución secuencial del programa. Provoca un salto a la instrucción N, es decir, provoca que el contador de programa apunte a la dirección de memoria N.
NOR y NOT.
Tablas de verdad para las operaciones lógicas AND, OR, XOR, NAND, NOR, NOT
A B A AND B A B A OR B 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 A B A NAND B A B A NOR B 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 0 0 1 1 0 1 1 0 A B A XOR B A NOT A 0 0 0 0 1 0 1 1 1 0 1 0 1 1 1 0
Ejecución de programas
Introducción
En este apartado se pretende dar una visión de alto nivel de cómo un ordenador con la estructura de von Neumann es capaz de ejecutar programas, seguir los algoritmos descritos por el programador y llegar a la resolución del problema. Para conseguirlo, el ordenador debe dar disciplinada y repetitivamente los pasos siguientes:
1. Cargar el programa en memoria.
2. Poner en el contador de programa (PC, Program Counter) la dirección de memoria de la primera instrucción que hay que ejecutar.
4. Ejecutar la instrucción.
5. Actualizar el registro de estado en caso de que sea necesario. 6. Actualizar el PC.
7. Volver al paso 3.
Este ciclo se cerrará en el momento en que se terminen las instrucciones.
Cargar el programa en memoria
Debemos recordar que uno de los puntos clave de la arquitectura de von Neumann es la separación de los datos del programa, así como que es imprescindible cargar el programa en memoria previamente a su ejecución. Hemos visto que la memoria era una sucesión de casillas capaces de almacenar datos. Deberíamos matizar que la memoria está estructurada en partes.
Podéis consultar el núcleo de conocimiento "La memoria principal" del apartado "Arquitectura de von Neumann".
Hay una zona de memoria destinada a almacenar el sistema operativo, otra, destinada a almacenar los códigos de programas en ejecución, otra para datos y otra que contendrá la pila.
Intuitivamente podemos ver que esta estructuración es necesaria, pero no suficiente. Por ejemplo, deberíamos proteger la zona donde se albergará el sistema operativo, puesto que si escribimos en esa zona los daños pueden ser irreparables.
Podéis consultar el apartado "Sistemas operativos".
El concepto importante es que no deberíamos poder escribir en cualquier sitio de la memoria ya que hay una parte de la memoria destinada a cada tarea.
Para ilustrar los conceptos anteriores supondremos el caso imaginario de la existencia de un ordenador con una memoria de cien casillas (éste es un caso ficticio, puesto que las memorias de los ordenadores actuales tienen cientos de miles de casillas, y en algunos casos, varios millones).
Se destinaría la memoria alta al sistema operativo, supongamos que de la casilla 0 a la 19. Las siguientes treinta casillas podrían estar destinadas a las aplicaciones en curso, de manera que de la casilla 20 a la 49 las tendríamos reservadas para almacenar las instrucciones máquina de las aplicaciones en ejecución. Se habilitaría otra zona, de la casilla 50 a la 89, para contener los datos que puedan utilizar las aplicaciones. Finalmente, dispondríamos un último tramo de diez casillas, de la 90 a la 99, para la pila (recordad que según el manejo de las pilas este tramo de memoria se rellenaría de manera inversa: se empezaría por la casilla 99, el segundo dato se almacenaría en la 98, el siguiente en la 97, etc.).
Memoria 1-9
Espacio reservado a almacenar el sistema operativo 10-19
20-29
Espacio reservado a almacenar el código máquina de las aplicaciones activas 30-39
40-49 50-59
Espacio reservado a almacenar los datos de las aplicaciones activas 60-69
70-79 80-89
90-100 Espacio reservado a almacenar la pila o stack
Podéis consultar el núcleo de conocimiento "La pila o stack" del apartado "Código máquina".
Una vez cargado el programa en memoria empezaría su ejecución. Dado que el movimiento se demuestra andando, vamos a poner un ejemplo y a simular el comportamiento de la máquina de von Neumann.
Ejecución de un algoritmo en código máquina
Para simular la ejecución de un algoritmo, primero debemos resolver un problema y escribir el algoritmo que supuestamente lo soluciona. Una vez tenemos la supuesta solución, debemos ejecutarlo.
Para llevar a cabo la demostración supondremos que se desea sumar n números naturales consecutivos.
Carl Friedrich Gauss
Gauss no ha sido el matemático más prolífico de la historia, pero sí uno de los más geniales, además de niño prodigio. Cuenta la anécdota que, a temprana edad –a los siete años–, un día Gauss y sus compañeros estaban armando alboroto en clase. El profesor, harto del descontrol, castigó a toda la clase a sumar los cien primeros números naturales. Todos los alumnos tomaron sus encerados y empezaron la larga suma. La sorpresa se la llevó el profesor cuando, al cabo de poco tiempo, el pequeño Gauss le contestó: 5.050. El profesor, asombrado, se levantó y fue a ver los cálculos del niño. Contrariamente a lo esperado y a lo que el resto de la clase había empezado a hacer, Gauss no había sumado 1 + 2 + 3 + 4 + 5 + 6 + 7..., sino que procedió de la siguiente forma.
Sorprendente, ¿verdad? Gauss, con sólo siete años de edad y aprovechando un castigo del colegio, fue capaz de demostrar que la suma de una progresión aritmética es N · (N + 1) / 2, donde N es el número de sumandos. Nosotros, puesto que no pretendemos ser Gauss, en el ejemplo del algoritmo usaremos el método que usaron sus compañeros: 1 + 2 + 3 + 4 + 5...
El algoritmo que sigue resuelve el citado problema:
1 Load A,B Lee el contenido de la casilla indicada por el registro B y lo almacena en el registro A.
2 Inc B Incrementa el valor del registro B.
3 Load C,B Lee el contenido de la casilla indicada por el registro B y lo almacena en el registro C.
4 Sub C,A Resta el valor del registro A del valor contenido en el registro C. 5 Move A,B Copia el valor del registro A en el registro B.
6 Inc A Incrementa el valor del registro B.
7 Add B,A Suma el valor del registro A al contenido del registro B. 8 Dec C Disminuye en una unidad el valor del registro C.
9 Test C Compara el valor del registro C con cero. Deja constancia de la comparación en el registro de estado. Para simplificar diremos que el registro de estado se pone a 0 si la comparación ha dado como resultado que el contenido en C era 0. En cualquier otro caso, el registro de estado adoptará el valor 1.
10 Branch if no zero 5 Pone el contador de programa a 5 si el registro de estado está a 0.
Si continuamos con una memoria de una estructura como la que hemos visto antes, al cargar el programa en la memoria obtendremos el siguiente esquema:
Memoria 1-9
Espacio reservado a almacenar el sistema operativo 10-19
20-29
Espacio reservado a almacenar el código máquina de las aplicaciones activas 30-39
40-49 50-59
Espacio reservado a almacenar los datos de las aplicaciones activas 60-69
70-79 80-89
Dirección de memoria Contenido 1 2 ... 23 Load A,B 24 Inc B 25 Load C,B 26 Sub C,A 27 Move A,B 28 Inc A 29 Add B,A 30 Dec C 31 Test C 32 Branch if no zero 5 33 34 ... 73 1 74 5 75 98 99
Según el esquema superior, la máquina de von Neumann ha cargado el código máquina de nuestro algoritmo en la memoria. Concretamente, lo ha ubicado en las direcciones que van de la 23 a la 32. Del mismo modo, en las direcciones 73 y 74 (dentro de la zona reservada a los datos) ha introducido dos valores numéricos.
Recordad que el problema original era encontrar el valor de:
De manera que los datos almacenados en las posiciones 73 y 74 se corresponden con los límites inferior y superior del sumatorio. (N1 y N2 respectivamente).
En la tabla adjunta se puede hacer un seguimiento de todos los pasos que sigue el computador para llegar a la solución; en otras palabras, se sigue paso a paso la ejecución del programa. Observemos que se han usado tres de los registros que hay disponibles en la unidad de control; en este ejemplo se han llamado registro A, registro B y registro C.
En la siguiente tabla se describe cómo actúa la máquina de von Neumann para llegar a la solución. Algoritmo de la progresión aritmética
Instrucción Contador programa
Registro A Registro B Registro C Registro estado @memoria 73 @memoria 74 Condiciones iniciales 23 Null 73 Null - 1 5
Observad que en las condiciones iniciales el contador de programa está apuntando a la primera instrucción que hay que ejecutar. El registro B contiene la dirección de memoria en la que reside el primer número. Para el nivel deseado en este curso nos desentendemos de quién es el responsable de que este dato esté puesto ahí. Tampoco importa el valor del registro de estado, sólo lo utilizaremos en las instrucciones de comparación.
Load A,B 24 1 73 Null - 1 5
Leemos el valor de la dirección de memoria 73 y lo almacenamos en el registro A, mientras que el resto de los registros quedan inalterados. Una vez concluida la operación, el contador de programa aumentará en una unidad para ejecutar la siguiente instrucción.
Inc B 25 1 74 Null - 1 5
Se incrementa el valor del registro B en una unidad. Una vez concluida la operación, el contador de programa también aumentará en una unidad.
Load C,B 26 1 74 5 - 1 5
Leemos el valor de la dirección de memoria 74 y lo almacenamos en el registro C, mientras que el resto de los registros queda inalterado. Una vez concluida la operación, el contador de programa aumentará en una unidad para ejecutar la siguiente instrucción.
Sub C,A 27 1 74 4 - 1 5
Se sustrae el valor del registro A del valor que tenía el registro C. Como siempre, si la operación finaliza con éxito, se incrementa una unidad el contador de programa.
Move A, B 28 1 1 4 - 1 5
Se copia el contenido del registro A en el registro B. Al acabar se incrementa el contador de programa.
Inc A 29 2 1 4 - 1 5