Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Introducción a la Programación con Orientación a Objetos Camelia Muñoz Caro Alfonso Niño Ramos Aurora Vizcaíno Barceló INTRODUCCIÓN A LA PROGRAMACIÓN CON ORIENTACIÓN A OBJETOS INTRODUCCIÓN A LA PROGRAMACIÓN CON ORIENTACIÓN A OBJETOS Camelia Muñoz Caro Alfonso Niño Ramos Aurora Vizcaíno Barceló Universidad de Castilla-La Mancha Madrid • México • Santafé de Bogotá • Buenos Aires • Caracas • Lima • Montevideo • San Juan • San José Santiago • São Paulo • White Plains Todos los derechos reservados. Queda prohibida, salvo excepción prevista en la Ley, cualquier forma de reproducción, distribución, comunicación pública y transformación de esta obra sin contar con autorización de los titulares de propiedad intelectual. La infracción de los derechos mencionados puede ser constitutiva de delito contra la propiedad intelectual (arts. 270 y sgts. Código Penal). DERECHOS RESERVADOS © 2002 respecto a la primera edición en español por: PEARSON EDUCACIÓN, S.A. Núñez de Balboa, 120 28006 Madrid MUÑOZ CARO, C.; NIÑO RAMOS, A.; VIZCAÍNO BARCELÓ, A. Introducción a la programación con orientación a objetos ISBN: 84-205-3440-4 PRENTICE HALL es un sello editorial autorizado de PEARSON EDUCACIÓN, S.A. Edición en español: Equipo editorial: Editor: David Fayerman Aragón Técnico editorial: Ana Isabel García Equipo de producción: Director: José A. Clares Técnico: Diego Marín Diseño de cubierta: Equipo de diseño de Pearson Educación, S.A. Composición: JOSUR TRATAMIENTOS DE TEXTOS, S.L. IMPRESO EN ESPAÑA - PRINTED IN SPAIN Este libro ha sido impreso con papel y tintas ecológicos MUÑOZ CARO, C.; NIÑO RAMOS, A.; VIZCAÍNO BARCELÓ, A. Introducción a la programación con orientación a objetos PEARSON EDUCACIÓN, S.A., Madrid, 2002 ISBN: 84-205-3440-4 MATERIA: Informática 681.3 Formato: 195 3 250 mm Páginas: 408 Datos de catalogación bibliográfica Powered by Publidisa ISBN eBook: 978-84-8322-584-4 Sistemas basados en computador 1.1. Introducción 1.2. Concepto de computación 1.2.1. Definición de computación 1.2.2. Dispositivos de computación 1.3. Concepto de Informática 1.3.1. Definición de informática 1.3.2. Datos e información 1.3.3. Representación de la información 1.3.4. Sistemas informáticos 1.3.5. Consideraciones sobre el software 1.4. Arquitectura clásica o de von Neumann de un computador 1.5. Redes de computadores 1.5.1. Generalidades 1.5.2. Internet 1.5.3. La World-Wide-Web (WWW) Sumario 1 1.1. INTRODUCCIÓN Este tema pretende proporcionar una visión global de los sistemas basados en computador 1 y de la informática como disciplina. Desde la perspectiva de un texto introductorio como es éste, presentare- mos el concepto de computación, así como una pequeña semblanza cronológica, histórica, de las téc- nicas de computación que han desembocado en el ordenador moderno. A partir de aquí presentaremos el concepto de informática, como campo de conocimiento, y de sistema basado en computador. En el cuarto apartado se considera la estructura y funcionamiento genérico de los computadores modernos. Por su interés actual y su relación con el lenguaje que se utilizará para la implementación de los ejem- plos (lenguaje Java) se presenta el tema de las redes de computadores y de Internet. 1.2. CONCEPTO DE COMPUTACIÓN En este apartado vamos a definir el concepto de computación y a presentar el desarrollo de las técni- cas y dispositivos de computación que han conducido al ordenador moderno. 1.2.1. DEFINICIÓN DE COMPUTACIÓN Como definición clásica de computación tenemos la dada por el Merriam-Websters’s Collegiate Dic- tionary en su décima edición que define computación como el acto y acción de computar, donde com- putar equivale a determinar, especialmente por medios matemáticos. En el mundo anglosajón, originalmente un “computer” era una persona que realizaba cálculos para resolver un problema. Sólo hacia 1945 el nombre se empieza a aplicar a la maquinaria que realiza dicha tarea (Ceruzzi, 1999). Los computadores (ordenadores) actuales son todavía capaces de computar (resolver problemas por medios matemáticos), especialmente en el campo científico-técnico donde ésta es su misión principal. Sin embargo, la tremenda repercusión del ordenador en la vida actual no proviene sólo de su capacidad de cómputo, sino de su capacidad para almacenar y recuperar datos, para manejar redes de comunica- ciones, para procesar texto, etc. Es decir, de su capacidad para procesar información. Ésta es la causa de la gran importancia del computador en la vida actual. Para la mayoría de la gente el computador representa una forma eficiente de gestionar información, sea en forma de texto, cartas enviadas por correo electrónico, informes generados automáticamente o transacciones de todo tipo. Para la mayor parte de la población la realización de cálculos es lo “menos importante” que un computador realiza. Sin embargo, los computadores se desarrollaron con el principal objetivo de realizar cálculos, aun- que la potencia final y los usos del ingenio habrían sido impensables para muchos de los que a lo lar- go del tiempo participaron en la tarea. Resulta interesante presentar el desarrollo histórico de los medios de computación y el desarrollo del computador moderno. Esta presentación implícitamente lle- va aparejado el desarrollo del concepto de programación como técnica para describir al computador, en términos inteligibles para él, las tareas que se desea que realice. 1.2.2. DISPOSITIVOS DE COMPUTACIÓN Los dispositivos originales de computación eran dispositivos de ayuda para la realización de cálculos aritméticos (computación en sentido etimológico), que poco a poco incrementaron sus posibilidades hasta llegar al concepto moderno de computador. Veamos brevemente la evolución histórica. 2 Introducción a la programación con orientación a objetos 1 Según el Diccionario de la Lengua de la Real Academia Española los términos computador, ordenador y computado- ra se pueden utilizar indistintamente. A lo largo de este libro así se usarán. Sistemas de numeración El punto de partida para cualquier técnica de computación es la preexistencia de un sistema de nume- ración. Esto no es en absoluto trivial, hoy por hoy la educación elemental enseña a los niños a contar usando un sistema de notación decimal, y la técnica parece algo consustancial con la existencia huma- na. Sin embargo, el concepto de número como una abstracción de las entidades numeradas es un paso fundamental en la evolución cultural del hombre. Que no siempre esto ha sido así se puede todavía observar en algunos lenguajes tribales donde se usan distintos nombres para las cantidades depen- diendo de la naturaleza de lo numerado. Desde este punto de vista no es lo mismo cuatro piedras que cuatro naranjas y el paso de abstracción fundamental es la consideración de que en ambos casos tene- mos cuatro elementos. Una vez que se dispone de un sistema de numeración el siguiente paso es su uso para contar elementos. Dispositivos de cómputo antiguos Una vez establecido un sistema de numeración, la raza humana ideó dispositivos de ayuda para la realización de tareas aritméticas. En los primeros tiempos de la historia humana, para las ta- reas más sencillas no era necesaria una habilidad aritmética más allá de sumas y restas simples o de multiplicaciones sencillas. Al aumentar la complejidad de la vida en común, se incrementa la complejidad de los cálculos aritméticos necesarios para los tratos comerciales, los impuestos, la creación de calendarios o las operaciones militares. Para agilizar la realización de estos “cómpu- tos” la primera ayuda es la de los dedos, para simbolizar cantidades e incluso realizar opera- ciones. Los dedos pueden usarse de la forma más simple para indicar una cantidad mostrando el núme- ro de dedos equivalentes. Sin embargo, también pueden usarse de forma simbólica para representar cantidades arbitrarias con combinaciones distintas de dedos mostrados u ocultados. Una primera necesidad en la antigüedad fue la de disponer de unmedio de representar cantidades que fuera cono- cido por todos los pueblos (al menos en el entorno euro-asiático-africano clásico). Esta técnica se usaba fundamentalmente para el intercambio comercial entre pueblos cuyas lenguas podían ser des- conocidas entre sí. En la antigüedad clásica existió este sistema que usaba los dedos (de las dos manos) para representar simbólicamente cantidades hasta de 9999 elementos y que estaba extendi- do por el norte de África, Oriente Medio y Europa. Herodoto y otros autores más modernos como Cicerón o Marco Fabio Quintiliano lo mencionan. Con los dedos se pueden aplicar técnicas de cálculo más complejas que la simple enumeración de elementos. Por ejemplo, en Europa existieron hasta épocas relativamente recientes, técnicas de multiplicación que usaban las manos para realizar los cálculos. Sin embargo, el medio mecánico más antiguo de realización de cálculos parece ser el ábaco (en sus diferentes versiones). El ábaco es, en esencia, una tabla de conteo que puede ser tan simple como una serie de piedras colocadas sobre el suelo. Su estructura típica es la de un marco de made- ra con una serie de alambres donde se ensartan varias cuentas, véase la Figura 1.1. Esta herra- mienta, a pesar de su simplicidad, es una gran ayuda de computación si se usa adecuadamente. Actualmente se asocia el ábaco con Oriente pero se usó en Europa desde la antigüedad clásica has- ta hará unos 250 años. La potencia del ábaco reside en que no es una simple tabla de anotaciones; además se pueden realizar operaciones aritméticas con él. De hecho, la capacidad de cálculo con un ábaco es muy alta. Un ejemplo de su eficacia es el siguiente: en 1946 en un concurso de velo- cidad y precisión de cálculo, Kiyoshi Matsuzake del Ministerio de Administración Postal Japonés derrotó con un ábaco, en cuatro de cinco ocasiones, al soldado Thomas Nathan Wood del ejército americano de ocupación que era el operador más experto de máquina mecánica de calcular de la marina de los EE.UU. Sistemas basados en computador 3 En la evolución hacia el computador moderno, merece mención especial el escocés John Napier, barón de Merchiston, quien inventó los logaritmos en el siglo XVII 2. Como herramienta de cálculo los logaritmos permiten transformar las multiplicaciones en sumas y las divisiones en restas. Los logarit- mos presentan una tremenda utilidad práctica, pero el problema del barón era la creación de las tablas de logaritmos necesarias para su uso. En la historia de los medios de computación el barón es impor- tante por haber diseñado varios instrumentos de cómputo. Entre ellos el denominado rabdologia, popu- larmente conocido como “huesos” de Napier, que él usaba para calcular sus tablas. Estos “huesos” eran una serie de barras cuadrangulares que en esencia representaban la tabla de multiplicar y que per- mitían realizar esta operación. El apelativo de “huesos” deriva del aspecto que presentaban y del mate- rial del que muchas veces estaban hechos. Otros dispositivos de cálculo de Napier fueron el Prontuario de Multiplicación (una versión más elaborada de los “huesos”) y el dispositivo de Aritmética Local, un tablero de ajedrez modificado para ser usado como una especie de ábaco que trabajaba en sistema binario. Napier publicó un libro describiendo el manejo de la rabdologia. El libro titulado Rabdologia muestra también una de las primeras menciones del punto 3 decimal. Los huesos de Napier se difun- dieron con rapidez por Europa. Sin embargo, en la historia de la computación la invención de los logaritmos dio nacimiento al que probablemente haya sido el dispositivo de cómputo más usado desde el siglo XVII hasta la última mitad del siglo XX: la regla de cálculo. El origen de la regla de cálculo es el siguiente. Tras conocer la inven- ción de los logaritmos por Napier, Henry Briggs, Profesor de Geometría del Gresham College en Lon- dres, comenzó a trabajar en el tema, introduciendo los logaritmos en base 10 y creando nuevas tablas de logaritmos para los números enteros. Edmund Gunter, Profesor de astronomía y matemáticas tam- bién en el Gresham College, conoció por Briggs la existencia de los logaritmos. Gunter estaba intere- sado en problemas de astronomía y navegación, lo que implicaba el uso de funciones trigonométricas. Dado que las tablas de logaritmos de Briggs eran para números enteros, no presentaban mucha utili- dad para Gunter, quien decidió abordar el cálculo de tablas de logaritmos para senos y tangentes. Gun- ter había trabajado en la popularización y desarrollo del compás de sector, un instrumento de cálculo 4 Introducción a la programación con orientación a objetos Figura 1.1. Ábaco 2 El apellido Napier se escribía de varias formas en la época: Napier, Napeir, Napair, Nepier y algunas formas más, y de él toman el nombre los logaritmos en base e, los logaritmos neperianos. 3 Entre los anglosajones los decimales se indican con punto, no con coma. consistente en un par de brazos unidos en un extremo por un pivote en forma de compás y con una serie de escalas calibradas sobre cada uno. Puesto que el logaritmo de un producto es la suma de los logaritmos, Gunter pensó en un sistema parecido al sector que permitiera realizar mecánicamente un producto. Gunter ideó una regla graduada en escala logarítmica con un compás. Para multiplicar dos números x e y se abría el compás la cantidad x, midiendo sobre la regla logarítmica. A continuación se colocaba uno de los brazos del compás apoyado en el punto de la regla correspondiente al valor y. Sin cerrar el compás se colocaba el otro brazo en la dirección creciente de la escala. El proceso equi- valía a sumar las dos distancias en la escala (suma de logaritmos), así que el valor que señalaba el bra- zo final del compás sobre la escala logarítmica era el producto de los dos números. Para hacer un cociente se sustraían las distancias en lugar de sumarse. El dispositivo simplificaba el cálculo de pro- ductos y cocientes y también evitaba tener que gastar tiempo buscando en las tablas de logaritmos. La modificación final del dispositivo se debió a William Oughtred quien hoy sería definido como un matemático puro y que se puede considerar el inventor de la versión definitiva de la regla de cálculo. En una visita que realizó en 1610 a Henry Briggs, conoció a Edmund Gunter quien le mostró su instrumento de cálculo logarítmico. Oughtred se dio cuenta de que se podía eliminar la necesidad del compás si se usaban dos reglas graduadas logarítmicamente que se deslizaran una con respecto a la otra. Así, para multiplicar los dos números x e y bastaba con colocar el origen de la segunda escala sobre el punto del valor x en la primera, localizar el valor y en la segunda y mirar cuál era el valor que correspondía en la primera escala. Este sistema de reglas deslizantes en escala logarítmica es la base de todas las reglas de cálculo posteriores 4. Las reglas de cálculo evoluciona- ron a lo largo del tiempo hasta adquirir forma muy sofisticada, véase la Figura 1.2, representando un instrumento analógico de cómputo de precisión. Hasta la introducción de las calculadoras electrónicas de mano, la regla de cálculo era un instrumento que todo ingeniero o científico usaba en su trabajo cotidiano. Dispositivos mecánicos Aparte de los instrumentos manuales indicados en el apartado anterior, los intentos auténticos de com- putación automática comienzan con el desarrollo de los distintos modelos de calculadoras mecánicas. Sin embargo, el desarrollo práctico de estas máquinas tuvo que esperar hasta el siglo XVII cuando la Sistemas basados en computador 5 4 Por esta razón, en inglés la regla de cálculo se denomina sliding rule (regla deslizante). Figura 1.2. Regla de cálculo ingeniería mecánica estuvo lo suficientemente desarrollada como para permitir la construcción de los sistemas de engranajes y palancas en los que se basa su funcionamiento. La primera calculadora mecánica (sumadora) con un dispositivo de acarreo para tener en cuenta que se ha conseguido pasara una posición decimal superior (el “me llevo uno” de la aritmética ele- mental) se atribuye a Blaise Pascal. Sin embargo, la primera fue realizada por el matemático alemán Wilhelm Schickard a principios del siglo XVII quien comunicó su invención a Kepler, con quien había colaborado. Por la descripción y los diagramas que Schickard remitió a Kepler se sabe que la máqui- na de Schickard automatizaba el trabajo con una serie de huesos de Napier, realizando mecánica- mente las sumas implicadas en la obtención de multiplicaciones. La máquina representaba cada posición decimal con una rueda donde estaban representados los diez dígitos 1-2-3-4-5-6-7-8-9-0. El problema de la máquina era el del acarreo acumulado cuando se pasaba de 9 a 0 en un disco y había que mover el disco de la siguiente posición decimal en una unidad. Esto se realizaba con una rueda dentada (rueda de acarreo) con un diente que hacía avanzar a la rueda a la nueva posición decimal cuando la de la posición anterior daba una vuelta completa. El problema se entiende si imaginamos que tenemos el valor 9999999 y sumamos 1. Habrá un total de 7 discos que tienen que girar a la vez a base de ruedas dentadas con un solo diente (una por posición decimal). Es fácil entender que la rue- da de acarreo del primer dígito debe aguantar el esfuerzo necesario para poder girar todos los demás dígitos. En la práctica el sistema no podía aguantar el esfuerzo y se rompía si el número de posicio- nes decimales era grande. Schickard sólo construyó máquinas con un máximo de seis posiciones decimales. Posteriormente y de forma independiente Pascal desarrolló una serie de ingenios mecánicos simi- lares. La primera máquina fue diseñada cuando Pascal contaba 19 años. Cuando intentó que los arte- sanos locales construyeran las piezas necesarias, el resultado fue tan catastrófico que decidió él mismo aprender mecánica, e incluso trabajó con un herrero para aprender a manejar el metal y construir las piezas. Pascal construyó unas cincuenta máquinas a lo largo de su vida, en esencia todas máquinas sumadoras. El problema de Pascal para construir máquinas capaces de multiplicar era nuevamente acumular el acarreo sobre varias posiciones decimales. Pascal ideó un sistema de pesos que evitaba el sistema de engranajes de Schickard. El problema era que la máquina sólo podía avanzar sus engrana- jes en un sentido. En la práctica esto se traducía en que la máquina sólo podía aumentar acarreos, no disminuir o dicho de otra forma, sólo sumaba. Otro interesante diseño es el de la máquina de Leibniz. Habiendo oído hablar de la máquina suma- dora de Pascal, Leibniz se interesa por el tema y comienza con el diseño de una máquina multiplica- dora. El diseño original no era factible y Leibniz abandona el tema durante varios años. Finalmente, acaba construyendo una máquina multiplicadora operativa gracias a la invención de un elegante siste- ma de engranajes con dientes de anchura variable (tambor escalonado). Otras calculadoras mecánicas fueron construidas por personajes como el inglés Samuel Morland o el francés René Grillet ambos en el siglo XVII. Comercialmente, la primera calculadora mecánica de utilidad fue el aritmómetro de Thomas de Colmar fabricado en la década de 1820 en Francia y basado en el diseño de tambor escalonado de Leibniz. Sin embargo, el gran paso en la producción comercial de calculadoras mecánicas se da con las máquinas de Baldwin-Odhner. El problema con las calculadoras mecánicas previas era que el sis- tema de tambor escalonado de Leibniz resultaba un dispositivo pesado y engorroso que implicaba que las máquinas fueran grandes y masivas. A finales del siglo XIX, Frank. S. Baldwin en EE.UU. y W. T. Odhner, un suizo que trabajaba en Rusia, idearon un nuevo diseño para las ruedas dentadas que repre- sentaban los dígitos decimales de cada posición decimal. La idea era que el número de dientes en las ruedas fuera variable, correspondiendo el número de dientes al número representado. Estos dientes podían aparecer o desaparecer según se seleccionaba un dígito u otro con una palanca colocada sobre la propia rueda. Estas ruedas dentadas variables se podían construir como discos finos y ligeros, lo que permitía colocar varios de estos discos, representando cada uno un dígito, en unos pocos centímetros de espacio. El resultado era una máquina mucho más compacta y ligera que las existentes hasta enton- ces, véase la Figura 1.3. A principios del siglo XX estas máquinas se vendían por decenas de miles. 6 Introducción a la programación con orientación a objetos Hasta la introducción de las calculadoras electrónicas las máquinas de Baldwin-Odhner se seguían usando en oficinas y laboratorios. Las máquinas de Babbage Los instrumentos mecánicos mencionados en el aparatado anterior no son sino ayudas mecánicas de computación. El primer gran paso hacia lo que es el concepto moderno de computador, lo dio Charles Babbage (1791-1871) con sus trabajos sobre computación automática. El nivel tecnológico de su tiem- po no era suficiente para poder llevar a cabo sus diseños, pero las ideas de Babbage eran muy avan- zadas para la época. Tanto es así que Babbage se considera uno de los pioneros del desarrollo del computador moderno, al mismo nivel de Konrad Zuse o Howard Aitken que trabajaron en el desarro- llo de los primeros modelos de computador en las décadas de 1930-1940. Charles Babbage era matemático y hombre de ciencia en el sentido más general que esta palabra tenía en el siglo XIX. En aquella época, se hacía amplio uso de tablas matemáticas como las de loga- ritmos, por ejemplo, para reducir el trabajo de cálculo. Dada su formación e intereses, Babbage hacía uso intensivo de las tablas matemáticas y era consciente de la gran cantidad de errores que poseían. La pasión por la precisión de Babbage le llevó a abordar la construcción de tablas matemáticas libres de errores. Para ello incluso diseñó sistemas tipográficos para reducir la probabilidad de la aparición de errores en las tablas. Sin embargo, el problema era siempre el mismo. Una persona calculaba los valo- res y escribía un borrador de la tabla con la consiguiente posibilidad de error. Luego, el borrador era traducido a mano en tipos de imprenta para imprimir las tablas, con la adicional posibilidad de error. Babagge llegó a la conclusión de que la única forma de evitar los errores humanos era automatizar Sistemas basados en computador 7 Figura 1.3. La Minerva, una máquina de Baldwin-Odhler de fabricación española todo el proceso. Su idea era la de una máquina capaz de calcular e imprimir sin intervención humana las tablas matemáticas deseadas. En la época, las tablas se calculaban aproximando las funciones a cal- cular por formas polinómicas y manejando las formas polinómicas con el método de diferencias. Usan- do el método de diferencias para representar un polinomio se evitaba tener que realizar operaciones de multiplicación y división. Este método puede aún verse explicado en textos de cálculo numérico apli- cado al problema de la interpolación de funciones (Demidovich y Maron, 1977; Kopchenova y Maron, 1987). Babbage imaginó su máquina de cálculo de tablas como una Difference Engine, Máquina de Diferencias, que aplicara de forma automática el método de diferencias. Babbage construyó un pequeño prototipo y solicitó ayuda oficial para la construcción del diseño completo. El problema era que la tecnología mecánica no estaba suficientemente avanzada en aquel entonces para la construcción de algunas partes de la máquina. El mismo Babbage colaboró en el desarrollo de nuevas herramientas de fabricación mecánica que permitieran construir las piezas de la máquina. Este trabajo adicional y las demoras oficiales en la provisión de fondos hicieron que el trabajo se parara numerosas veces y que finalmente la máquina no acabara de construirse. Durante uno de estos períodos de inactividad Babbage trabajaba en un rediseño de la máquina y se le ocurrió que el resultado de las computaciones de la máquina pudiera volver aser introducido como dato en la propia máquina. Babbage se dio cuen- ta de que ese diseño circular dotaba a la máquina de una potencia de cómputo mucho mayor que la del modelo inicial. Un diseño tal permitía el manejo de funciones que no tenían solución analítica. Bab- bage denominó la nueva máquina Analytical Engine (Máquina Analítica) y al respecto de la misma escribió en una carta en mayo de 1835 (Williams, 2000): La máquina analítica constaba de tres partes que Babbage denominó: The store (El almacén) The mill (La fábrica o taller) The control barrell (El cilindro o tambor de control) El almacén era una memoria mecánica, el taller una unidad aritmética y el cilindro de control una unidad de control de procesos que contenía el equivalente mecánico de un juego de instrucciones bási- cas de trabajo. En esencia, el diseño de Babbage respondía a la estructura moderna de un computador. El trabajo de la máquina analítica se realizaba indicándole qué acciones elementales tenía que realizar por medio de una serie de tarjetas perforadas, de forma similar a como entonces se introducían los diseños en las tejedoras mecánicas de Jackard. La máquina, por lo tanto, respondía a un programa de instrucciones externo que leía como entrada. La máquina analítica no llegó a construirse principalmente porque Babbage no consiguió los fon- dos necesarios. Desde la perspectiva actual, la máquina hubiera supuesto un avance de alcance inima- ginable en la época 5. La necesidad de desarrollar el conjunto de instrucciones que compusieran un programa a ser eje- cutado por la máquina analítica da carta de nacimiento a la ciencia y el arte de la programación. En este contexto tiene especial interés la colaboración entre Babbage y Ada Augusta, condesa de Love- ... durante seis meses he estado dedicado a los diseños de una nueva máquina de cálculo de mucha mayor potencia que la primera. Yo mismo estoy asombrado de la potencia de que he podido dotar a esta máquina; hace un año no hubiera creído que este resultado fuera posible. 8 Introducción a la programación con orientación a objetos 5 Como fabulación de lo que habría ocurrido en caso de construirse la máquina analítica se recomienda la lectura de la novela The Difference Engine (Gibson y Sterling, 1996). Aquí se nos muestra un siglo XIX alternativo, donde Babbage ha podido construir sus máquinas y un imperio británico que ha conjugado la revolución industrial con la revolución informáti- ca controlando el mundo con sus computadoras mecánicas movidas a vapor. lace. Ada era hija del poeta Lord Byron y tenía una sólida formación matemática, algo muy raro en la época para una mujer. En 1843 publicó un trabajo donde se describía la máquina analítica y la mane- ra de programarla. En particular en el trabajo se presentaba el programa que permitía el cálculo de los números de Bernoulli (Kim y Toole, 1999). En su trabajo, Ada mostraba la gran potencia y la flexibi- lidad que un programa modificable de instrucciones permitía a la máquina. Por estas razones, la con- desa de Ada Lovelace es considerada la primera teórica (y práctica) de la programación. El computador moderno A finales de la década de 1930 aparecieron distintos grupos de trabajo interesados en la construcción de máquinas de calcular con algún tipo de sistema automático de control. Estos esfuerzos se aborda- ron tanto desde el punto de vista mecánico como del electrónico. Respecto a las máquinas mecánicas, destaca el trabajo en Alemania de Konred Zuse. Zuse, inge- niero de formación, conocía el esfuerzo de cómputo necesario para los trabajos técnicos. Se dio cuen- ta de que el problema fundamental, usando una regla de cálculo o una máquina sumadora mecánica, era el almacenamiento de los resultados intermedios que se van produciendo. A tal efecto es necesa- rio un sistema de memoria para mantener la información. En 1934 Zuse era consciente de que una cal- culadora automatizada sólo requiere tres unidades funcionales: un control, una memoria y una sección aritmética. Con este diseño básico construye la Z1 (la primera máquina de la serie Z). La Z1 usaba una memoria mecánica codificada en binario y leía la secuencia de instrucciones a realizar de una serie de tarjetas perforadas. Al mismo tiempo en Harvard, Howard Aitken construía otra secuencia de máqui- nas automáticas, la serie de las Mark. Todos estos esfuerzos se basaban aún en el uso de elementos mecánicos. La gran revolución sur- gió con el advenimiento de las máquinas electrónicas. Con respecto a las máquinas electrónicas uno de los primeros esfuerzos fue el diseño de la ABC (Atanasoff-Berry Computer). El ABC no llegó a ser operativo, pero su diseño tuvo importancia en el desarrollo de modelos posteriores. En particular, el ABC usaba el sistema binario, lo que simplificaba los circuitos electrónicos usados. La primera com- putadora electrónica operativa fue la ENIAC (Electronic Numerical Integrator and Computer) que tra- bajaba en sistema decimal. Todas estas máquinas estaban programadas con algún tipo de instrucciones en tarjetas perforadas o directamente como conexiones (cableado). El siguiente paso se gestó en el equipo de desarrollo del ENIAC y se trata de la invención del concepto de programa almacenado. En este asunto tuvo cierta participación John von Neumann (físico, químico y matemático) aunque no fue el inventor del con- cepto. Sólo el hecho de que él escribiera el borrador del informe que se presentó a los patrocinadores militares del proyecto ENIAC, y que recogía la idea de problema almacenado en memoria, fue la cau- sa de que se asociara con él dicho concepto y hoy se hable de máquinas de von Neumann. Este nuevo concepto formó parte del diseño de la descendiente del ENIAC, la EDVAC (Electronic Discrete Varia- ble Arithmetic Computer). La EDVAC almacenaba el programa en memoria, con lo que las instruc- ciones se leían a mucha mayor velocidad que haciéndolo una a una desde una fuente externa como las tarjetas perforadas. 1.3. CONCEPTO DE INFORMÁTICA Como hemos visto, el origen del ordenador o computador se debe a la necesidad de realizar cálculos de forma automática. Sin embargo, el procesamiento numérico no es la única utilidad de un ordena- dor. La posibilidad de realizar operaciones lógicas le dota de la capacidad de usarse para el procesa- miento de información, entendida desde un punto de vista general. El cuerpo de conocimiento que se encarga de todo lo relacionado con el desarrollo y uso de ordenadores para el tratamiento de informa- ción (numérica o no) es la informática. Veamos una definición más precisa. Sistemas basados en computador 9 1.3.1. DEFINICIÓN DE INFORMÁTICA Informática del francés informatique es la designación castellana de Computer Science and Engineering en inglés. Según la Real Academia Española se define como el conjunto de conocimientos científicos y técnicas que hacen posible el tratamiento automático de la información por medio de ordenadores. La siguiente pregunta es obvia: ¿qué se entiende por información? 1.3.2. DATOS E INFORMACIÓN En primer lugar es necesario distinguir con precisión entre los conceptos de datos e información: a) Datos Como tales se entiende el conjunto de símbolos usados para representar un valor numérico, un hecho, una idea o un objeto. Individualmente los datos tienen un significado puntual. Como ejemplo de dato tenemos el número de la seguridad social de un empleado, un número de teléfono, la edad de una per- sona, etc. b) Información Por tal se entiende un conjunto de datos procesados, organizados, es decir, significativos. La informa- ción implica tanto un conjunto de datos como su interrelación. Dependiendo de esta última el mismo conjunto de datos suministra diferente información. Por ejemplo, imaginemos los datos de los traba- jadores de una empresa: Nombre Edad Estudios Salario Por separado se trata de un conjunto de datos individuales. Sin embargo, si los organizamos por edad y salario tenemos un informe sobre la distribución del sueldo en función de la edad. Porotro lado, si organizamos por estudios y salario tendremos un informe diferente que nos indica la distribución del salario en función de la formación de los empleados. Como no vamos a tratar específicamente sistemas de gestión de información consideraremos datos e información como sinónimos. 1.3.3. REPRESENTACIÓN DE LA INFORMACIÓN Habiendo definido el concepto de información el problema es cómo representarla para poder mane- jarla de forma automática. Es posible idear muchas maneras de hacerlo, pero la clasificación básica nos lleva a la distinción entre técnicas analógicas y digitales. Veamos la diferencia. a) Representación analógica Cuando una magnitud física varía para representar la información tenemos una representación analó- gica. Por ejemplo, el voltaje en función de las variaciones de presión producidas por la voz en un micrófono. 10 Introducción a la programación con orientación a objetos b) Representación digital En este caso la información se divide en trozos y cada trozo se representa numéricamente. Lo que se maneja al final es ese conjunto de números. La cantidad de trozos en que se divide lo que se quiere representar está relacionada con la calidad de la representación. La Figura 1.4 ilustra este concepto considerando una cierta magnitud, X, que varía con el tiempo, t. En el caso de la Figura 1.4 (a) el espaciado entre los puntos tomados sobre el eje de abscisas no es suficiente para representar el pico central. En el segundo caso, sin embargo, sí recogemos el pico y la representación es más fiel a la realidad. Cuanto menor sea el intervalo entre puntos más fiable es la representación, aunque mayor es el número de datos que necesitamos para representar el mismo inter- valo (temporal en este ejemplo). Lo que al final almacenaríamos para representar la información repre- sentada por la curva anterior sería el conjunto de valores de ordenada para cada punto tomado sobre el eje de abscisas. En los ordenadores modernos toda la información está almacenada digitalmente, desde los núme- ros al texto pasando por el audio o el vídeo. Esto nos lleva a una cuestión: ¿cómo está representado el texto en un ordenador? En un ordenador el texto está representado por un código numérico. Cada carácter (letras mayúscu- las y minúsculas, signos de puntuación, signos especiales como #, @, &, etc.) tiene asociado un valor numérico. Estos valores numéricos son arbitrarios y se asigna un valor u otro dependiendo del código usado. Un código típico y tradicional es el código ASCII (American Standard Code for Information Inter- change) pero el conjunto de caracteres es muy limitado, sólo el conjunto básico necesitado en inglés, sin caracteres acentuados, por ejemplo. Existen otros códigos, como el Unicode que puede codificar 216 posi- bilidades (usa 16 bits), con lo que se pueden representar los caracteres de multitud de lenguajes sin tener que estar mezclando códigos. Por ejemplo, en Unicode la frase “Hola, Pepe.” queda como: En el ejemplo anterior cada carácter muestra en la parte inferior el correspondiente código Unico- de. Obsérvese que el blanco es un carácter con su código (el ordenador lo tiene que almacenar para saber que está ahí) y que las mayúsculas tienen código distinto de las minúsculas. Al final lo que habría en el ordenador sería la secuencia anterior de números. Otro problema es cómo representar los números. Resulta conveniente, por su simplicidad, usar el sistema de numeración binario donde sólo tenemos 2 dígitos: 0 y 1. Estos dos dígitos se pueden repre- sentar fácilmente en los circuitos electrónicos, por ejemplo como conducción o no conducción o, en Sistemas basados en computador 11 Figura 1.4. Ilustración del efecto del incremento de muestras sobre una señal H 72 o 111 1 108 a 97 , 44 32 P 80 e 101 p 112 e 101 . 46 general, por cualquier método que pueda distinguir entre dos estados. La base dos se maneja con nota- ción posicional igual que la decimal. Al construir el número se comienza con el 0, luego se pasa al 1 y al agotar la base se coloca un 0 o un 1 a la izquierda, véase la Tabla 1.1. 12 Introducción a la programación con orientación a objetos Tabla 1.1. Equivalencia decimal-binario En informática un dígito binario se denomina bit (contracción de binary digit). Otra unidad común es el conjunto de 8 bits, denominado byte: 1 byte < > 8 bits Es interesante saber cuál es el mayor valor numérico que se puede representar con un cierto núme- ro de bits. Puesto que con un bit se pueden representar dos posibilidades, con 2 bits tendremos cuatro (2 3 2) y en general, con N bits tenemos 2N, véase la Tabla 1.2. Tabla 1.2. Número de posibilidades en función del número de bits Esta secuencia de valores es muy típica, aparece por ejemplo en los valores de la memoria de los ordenadores (aunque referida a un múltiplo del byte, el kilobyte como veremos más adelante). 1.3.4. SISTEMAS INFORMÁTICOS Llega ahora el momento de considerar dos conceptos nuevos de importancia, el de sistema y a partir de él, el de sistema informático (o sistema basado en computador). Comencemos por la definición de sistema. Decimal Binario 0 0 1 1 2 10 3 11 Bits Posibilidades 0 2051 1 2152 2 2254 3 2358 4 24516 5 25532 6 26564 7 275128 8 (1 byte) 285256 9 295512 10 21051024 El concepto de sistema es ubicuo en el campo informático y aparece en múltiples contextos. Así, hablamos de sistemas físicos, de sistemas de información o de sistemas software. Un sistema informático es un conjunto de ciertas entidades que tienen como objetivo un determi- nado tipo de procesamiento de información. Estas entidades pueden ser: — Físicas (Hardware 6 ) — Lógicas (Software 6 ) — Humanas (“Peopleware”) La parte física del ordenador está constituida por los dispositivos que conforman el ordenador. La palabra hardware es inglesa y literalmente significa material de ferretería. Con el advenimiento de la informática se empieza a aplicar en el contexto que aquí se describe. Se suele coloquialmente decir que todo lo que se puede tocar es hardware. En el siguiente apartado consideraremos en más detalle la parte física de un ordenador. La parte lógica está formada por los programas y toda la información asociada a ellos (informa- ción de desarrollo y documentación del programa). En inglés se denomina software, haciendo un jue- go de palabras con hardware, cambiando el hard (rígido o duro) por soft (blando). El software es la componente lógica, intangible, de un sistema informático. Siguiendo con los juegos de palabras la componente humana de un sistema informático se deno- mina a veces peopleware. La componente humana de un sistema se refiere generalmente a los usua- rios del mismo. Puesto que la programación (una parte del proceso de desarrollo de software) va a ser el tema que nos ocupe en este texto, vamos a considerar el software con algo más de detalle en el siguiente apar- tado. 1.3.5. CONSIDERACIONES SOBRE EL SOFTWARE Comúnmente se considera software como sinónimo de programa. Sin embargo, desde el punto de vis- ta informático el concepto de software es más general, abarcando no sólo el código generado, sino también toda la documentación asociada. Tradicionalmente, el software se clasifica en dos grandes grupos, software de sistemas y software de aplicación. El software de sistemas es software usado por otro software. El ejemplo clásico es el del sistema operativo, que es el programa que permite comunicarse con, y usar de forma cómoda, el hardware. El sistema operativo es la conexión con el hardware que usan el resto de programas que se ejecutan en un ordenador. Por otro lado, el software de aplicación es el destinado a su utilización por un usuario y no por otros programas. Una hoja de cálculo, un procesador de textos o un programa de juego son ejemplos típicos. La comunicación del usuario con el software se realiza hoy casi generalizadamente a través de inter- faces gráficas de usuario. Lo primero es indicar qué interfaz representa en informática una entidad (hard- ware osoftware) que actúa como intermediario o conexión entre otras dos, por ejemplo, entre un usuario y un programa. En una interfaz gráfica de usuario las capacidades del programa están representadas por medio de símbolos gráficos (iconos) a los que se puede acceder por medio de algún dispositivo apunta- Un sistema es un conjunto de entidades que interrelacionan para un fin común. Sistemas basados en computador 13 6 Tanto hardware como software son palabras que el uso ha adoptado en nuestro idioma y en este texto se utilizan tal cual. dor (actualmente el ratón). La interfaz gráfica del sistema operativo Windows es un ejemplo típico. Des- de el punto de vista del usuario la interfaz “es” el programa. Como una buena indicación de diseño tene- mos que la interfaz debe estar separada de la parte funcional del programa, véase la Figura 1.5. Las ventajas de esta organización son un mejor mantenimiento de las dos partes componentes del software (son independientes, se pueden modificar por separado) y mayor reutilizabilidad de los elementos de la interfaz y de la parte funcional (se pueden aprovechar con facilidad en nuevos desarrollos). 14 Introducción a la programación con orientación a objetos Figura 1.5. Diagrama mostrando la interrelación entre el usuario y un sistema software 1.4. ARQUITECTURA CLÁSICA O DE VON NEUMANN DE UN COMPUTADOR La estructura de un computador típico responde a una organización concreta. Básicamente se trata de la organización definida por Babbage con algunas características adicionales. En la actualidad esta organización o arquitectura típica se denomina arquitectura clásica o de von Neumann, dado el papel que éste jugó en el desarrollo del EDVAC, donde por primera vez se conjugaban estos factores. La arquitectura de von Neumann esencialmente incorpora las siguientes características: — Uso de la estructura funcional ya determinada por Babbage: * Unidad de entrada * Unidad de salida * Unidad de control * Unidad aritmética (hoy aritmético-lógica) * Memoria — Utilización del sistema binario (el ENIAC, por ejemplo, usaba sistema decimal). — Incorporación del concepto de programa almacenado en la memoria. Así, la memoria no sólo almacena los datos, sino también las instrucciones necesarias para el procesamiento de los mis- mos. El esquema funcional de un ordenador estándar (basado en la arquitectura clásica) se muestra en la Figura 1.6. Obsérvese que la unidad aritmético-lógica y la unidad de control conforman básicamente la uni- dad central de proceso o CPU (Central Processing Unit). Esta unidad suele estar físicamente construi- da sobre un chip, también denominado microprocesador. Se considera el “cerebro” del ordenador. Obsérvese también que la CPU y la memoria central o principal definen la unidad central (no de pro- ceso, sino el ordenador central propiamente dicho) y que los demás dispositivos no. Estos otros dis- positivos se denominan periféricos (aunque físicamente pueden estar dentro de la misma carcasa que el ordenador o computador central). Comentemos los distintos componentes: a) Entrada o unidad de entrada Representa el dispositivo a través del cual se introducen los datos y las instrucciones. Ambos serán almacenados en la memoria (central o secundaria). Los dispositivos de entrada pueden ser variados: un teclado, un escáner, un lector de códigos de barras, etc. Puede haber más de uno conectado y fun- cionando en un sistema. b) Salida o unidad de salida Es el dispositivo que muestra el resultado de la ejecución del programa en el ordenador. También podemos tener distintos tipos de dispositivos como monitores, impresoras o plotters. c) Memoria Sirve para almacenar los datos y las instrucciones del programa (recordemos que nuestro modelo almacena el programa en memoria). Tenemos dos tipos de memoria, la primera es la denominada memoria central. Ésta está formada por circuitería electrónica y de rápido acceso, pero relativamente pequeña. La memoria central se encuentra organizada en “posiciones de memoria” (grupos de un tamaño concreto de bits). Cada posición está identificada por una “dirección” de memoria que permi- te acceder a ella (para leer o para escribir). La dirección puede entenderse como un número de orden, véase la Figura 1.7. Un dato puede necesitar más de una posición de memoria para su codificación. La memoria se mide en bytes (8 bits). Como ésta es una unidad muy pequeña se usan múltiplos, véase la Tabla 1.3. La memoria central es de tipo RAM (Random Access Memory) lo que indica que se puede acce- der directamente a cualquier posición de memoria sin pasar por las anteriores. La RAM es de lectura- escritura, es decir, se puede leer la información almacenada allí y se puede escribir en ella. Otra carac- terística es que es volátil, entendiendo por ello que la información sólo se mantiene mientras está conectada (al cortar la corriente se pierde). El tamaño de la memoria central es de algunos cientos de KB (128 ó 256 en compatibles PC) a algunos o muchos GB en sistemas de altas prestaciones. En un ordenador existen también memorias de tipo ROM (Read Only Memory) que son permanentes, sólo Sistemas basados en computador 15 Figura 1.6. Estructura funcional clásica de un computador permiten la lectura y se usan para almacenar, por ejemplo, el programa de arranque de un ordenador o las operaciones básicas de entrada y salida. El segundo tipo de memoria es la denominada masiva, auxiliar o secundaria, mucho más lenta de acceso que la memoria principal, pero de mucha mayor capacidad y permanente (no se pierde la infor- mación al cortar la corriente). Se trata, fundamentalmente, de los discos duros, los disquetes o los CD- ROM (almacenamiento óptico). Algunos de estos dispositivos son regrabables y otros, como los CD- ROM tradicionales, son de sólo lectura, no permitiendo la regrabación. Normalmente los programas y los datos se graban desde algún dispositivo de entrada en la memoria secundaria y desde ahí se cargan en la memoria principal para la ejecución. La capacidad típica, en la actualidad, de los discos duros es de varias decenas de GB en los compatibles PC. En un ordenador es posible encontrar también cierta cantidad de la denominada memoria caché (oculta en francés). Una memoria caché es similar a la RAM pero mucho más rápida que ella y se usa como un elemento intermedio entre la CPU y la memoria central, véase la Figura 1.8. Cuando la CPU necesita leer datos o instrucciones de la RAM primero mira si ya se encuentran en la caché. Si están allí los toma de ella. Al ser la caché mucho más rápida que la RAM el proceso se realiza en mucho menos tiempo. Si los datos o la instrucción no están en la caché, la CPU los lee de la RAM y se guarda una copia en la caché para poder tomarla de allí si se vuelven a necesitar. El resul- 16 Introducción a la programación con orientación a objetos Figura 1.7. Representación esquemática de la organización de la memoria de un ordenador Tabla 1.3. Medidas de memoria Figura 1.8. Interrelación entre la CPU y las memorias caché y RAM Unidad Símbolo Valor (bytes) kilobyte KB 210 (1024) megabyte MB 220 (1024*1024) gigabyte GB 230 (1024*1024*1024) terabyte TB 240 (1024*1024*1024*1024) tado de este proceso es una mejora en el rendimiento de la CPU. En un sistema moderno se dispone de todos estos tipos de memoria. d) Unidad aritmético-lógica o ALU (Arithmetic Logic Unit) Es el conjunto de circuitos que permiten realizar las operaciones aritméticas y las operaciones lógicas tales como las comparaciones o la aplicación del álgebra de Boole binaria. La ALU realiza su trabajo usando la información contenida en unas posiciones de memoria internas a la CPU denominadas regis- tros. Estos registros están especializados, existiendo registros de instrucciones (van almacenando las instrucciones del programa) de uso general o el denominado contador de programa que almacena la dirección de memoria en que se encuentra la siguiente instrucción del programa que se está ejecutando. e) Unidad de control Coordinalos distintos pasos del procesamiento. En esencia recibe señales (de estado) de las dis- tintas unidades determinando su estado de funcionamiento. Capta de la memoria central las instruc- ciones del programa una a una y va colocando los datos en los registros correspondientes haciendo que las distintas unidades implicadas realicen sus tareas. El trabajo de la unidad de control está sincroni- zado por un reloj interno, que oscila con una frecuencia dada. La velocidad de trabajo de la CPU vie- ne determinada por la frecuencia del reloj. La frecuencia se mide en ciclos por segundo o Hertzios (Hz) y la unidad que se usa es un múltiplo, el MegaHertzio (1 MHz5106 Hz). Las frecuencias actuales de los microprocesadores son del orden de 1000-2000 MHz (1-2 GHz). La inversa de la frecuencia es el período y nos da el tiempo que tarda en realizarse un ciclo. La información entre la CPU y la memoria se transfiere como grupos de un cierto número de bits que se pasan a la vez. Esto define la palabra y, el número de bits transferidos de una vez es la longi- tud de la palabra. Ejemplos de longitud de palabra son 32 ó 64 bits. Como para referirnos a una posi- ción de memoria usamos una palabra en la CPU, la longitud de palabra determina el máximo número de posiciones que se pueden representar (2N donde N es la longitud de palabra). Se puede tener menos memoria central que la que corresponde a ese valor pero no se puede tener más. La CPU funciona siguiendo lo que se denomina ciclo de recuperación-descodificación-ejecución, véa- se la Figura 1.9. El ciclo funciona de la siguiente forma. De la memoria central se recupera la siguiente instrucción del programa buscando en la dirección indicada por el contador del programa. El contador se incrementa para saber en el siguiente ciclo donde está la siguiente instrucción. La instrucción actual se des- codifica para saber qué operación hay que realizar y la unidad de control activa los circuitos necesarios para realizar la instrucción, la cual puede cargar un dato en un registro o sumar dos valores, por ejemplo. Sistemas basados en computador 17 Figura 1.9. Ciclo de recuperación-descodificación-ejecución 1.5. REDES DE COMPUTADORES Por su importancia actual es útil presentar, aunque sea informalmente en un texto introductorio como éste, el concepto de red de computadores. 1.5.1. GENERALIDADES Una red consiste en dos o más ordenadores conectados entre sí de forma que puedan compartir infor- mación o recursos. En particular el intercambio de información ha devenido en una parte fundamen- tal de la informática. La comunicación por correo electrónico, el intercambio de información técnica y científica o la compartición de la información de los clientes de una empresa en diferentes sucursa- les de la misma son ejemplos de la utilidad de las redes de computadores. A pesar de todo, en una red cada ordenador tiene su individualidad propia, poseyendo algún tipo de información de identificación, una dirección de red. Dentro de una red el o los ordenadores que ofrecen algún tipo de servicio a los demás se denominan servidores, por ejemplo un servidor de ficheros o de impresora. Para conectar computadoras en red podemos usar distintas topologías, por ejemplo: a) Conexión punto a punto, véase la Figura 1.10 (a) Ésta sería la solución más sencilla, con todos los ordenadores directamente conectados a todos los demás. Lógicamente, esta técnica sólo es factible para unos pocos ordenadores que estén físicamente próximos, basta con imaginar los problemas de cableado, ya que el número de conexiones entre N ordenadores es de N(N-1)/2. Una solución mucho más elegante es la de línea compartida. b) Línea compartida, véase la Figura 1.10 (b) En este caso, sólo hay una línea de conexión a la que se van conectando los ordenadores. La conexión es muy sencilla, pero un software de gestión de red debe controlar cómo se envía la información de los diferentes usuarios. Actualmente la técnica utilizada es la denominada packet-switched (conmuta- ción de paquetes). En esta aproximación el software de gestión de la red divide la información en par- tes (paquetes) que se van enviando por turnos a lo largo de la línea. La ventaja es que el sistema es el que se ocupa de la división en paquetes y del ensamblaje posterior de los mismos para generar la infor- mación original. El sistema de paquetes permite que múltiples comunicaciones entre ordenadores pue- dan producirse concurrentemente sobre una misma línea compartida. Para el usuario este proceso es transparente, el software se ocupa de todo el trabajo. Las redes basadas en paquetes que abarcan grandes distancias (de país a país, por ejemplo) son diferentes de que las que cubren una pequeña distancia, como una habitación o un edificio. Para dis- tinguir unas de otras se dividen las redes de computadores en dos tipos, LANs y WANs. 18 Introducción a la programación con orientación a objetos Figura 1.10. Sistemas basados en computador Una LAN es una red de área local (Local Area Network) que cubre una pequeña distancia y está formada por un número pequeño de ordenadores. Una WAN es una red de área ancha o amplia (Wide Area Network) que conecta dos o más LANs sobre grandes distancias. Una LAN pertenece normal- mente a una sola organización pero las WANs suelen conectar LANs de grupos diferentes, incluso de países distintos. En las LAN conectadas en una WANs un ordenador de cada LAN maneja las comu- nicaciones sobre la WAN. 1.5.2. INTERNET Internet es una WAN que abarca todo el mundo. El término Internet proviene de internetworking indi- cando que es una red de redes. Internet permite la comunicación entre sistemas hardware y software heterogéneos usando una serie de estándares de comunicación. Internet es descendiente de la ARPA- NET, un sistema de red desarrollado en un proyecto del ARPA (Advanced Research Projects Agency) de los EE.UU. La historia del desarrollo de Internet puede encontrarse en el excelente libro de Hafner y Lyon (Hafner y Lyon, 1998). El software que gestiona la comunicaciones en Internet se denomina TCP/IP (Transmission Con- trol Protocol/ Internet Protocol). Son dos entidades separadas, cada una conteniendo muchos progra- mas. Estas dos entidades podrían definirse de la forma siguiente (Comer, 1995): a) IP Se trata de un protocolo y no de un programa específico. Sus misiones son varias. Define el formato de todos los datos sobre la red, también realiza el proceso de routing (direccionamiento en la red) esco- giendo el camino por el que circularán los datos, y finalmente establece una serie de reglas indicando cómo los ordenadores deben procesar los paquetes de datos, cómo y cuándo deben generarse mensa- jes de error y las condiciones bajo las cuales se deben descartar paquetes. b) TCP Se trata también de un protocolo de comunicación y no de una pieza de software. La misión concreta del TCP es difícil de definir en pocas palabras. El protocolo especifica el formato de los datos y los reconocimientos que dos computadores deben intercambiar para obtener una transmisión fiable, así como los procedimientos que los computadores usan para asegurarse de que los datos llegan correcta- mente a su destino. En Internet cada ordenador conectado se identifica con lo que se denomina una dirección IP. La dirección IP identifica tanto al ordenador como a la red a la que está conectada. Dicho en otras pala- bras, la dirección IP no identifica una máquina sino una conexión a una red. Nada impide sustituir un ordenador por otro y mantener la dirección IP original. Las direcciones IP están formadas por 32 bits organizados en cuatro grupos de ocho. Cada uno de esos grupos de ocho se expresa en decimal y se separan unos de otros por un punto, por ejemplo: 167.55.44.11 Es normal que la dirección IP tenga asociado un nombre que se suele denominar dirección de Inter- net como, pepe.uclm.es Sistemas basados en computador 19 La primera parte es el nombre asignado a ese ordenador en concreto (pepe en el ejemplo), la segun- da parte es eldominio e indica la organización a la que pertenece (uclm.es en el ejemplo). La última sección de cada nombre de dominio indica, normalmente, el tipo de organización: .com: negocio comercial .org: organización sin finalidad de lucro .edu: institución educativa o bien el país: .es: España .uk: Reino Unido Cuando se usa una dirección de Internet ésta se traduce a dirección IP por un software denomina- do DNS (Domain Name Service). Cada organización conectada a Internet tiene un servidor de domi- nio con una lista de todos los ordenadores de esa organización y sus direcciones IP. Cuando se pide una IP, si el servidor DNS no la tiene, contacta a través de Internet con otro servidor que sí la tenga. 1.5.3. LA WORLD-WIDE-WEB (WWW) 7 El web es una forma de intercambiar información a través de Internet. En el web se usan los concep- tos de hipertexto e hipermedia que podemos definir de la forma siguiente: Hipertexto: Una forma de texto no secuencial en la cual se siguen unos caminos o enlaces a través del conjunto completo de documentos. El concepto no es nuevo, se encontraba ya pergeñado en algu- nos documentos del proyecto Manhattan (el proyecto secreto de los EE.UU. destinado al desarrollo de la bomba atómica). La idea es poder saltar entre la información del documento en forma no secuen- cial. Hipermedia: Es una generalización del concepto de hipertexto donde no sólo se incluye texto en la secuencia no lineal de información sino también gráficos, audio, vídeo o programas. Al web se accede a través de un programa especial, un navegador (browser) que presenta la infor- mación hipermedia, y con el que se va accediendo a los distintos enlaces, links, para obtener la infor- mación deseada. Lógicamente, los documentos en el web se identifican con algún tipo de nombre, aquí denominado URL (Uniform Resource Locator), por ejemplo: www.inf-cr.uclm.es Con una URL se accede a una página web donde aparece la información fundamentalmente como en una página impresa. Estas páginas están escritas usando un lenguaje estándar formalizado llamado HTML (HyperText Markup Language 8). En la actualidad se está trabajando con versiones más sofis- ticadas del HTML como el XML (Extensible Markup Language) (Bosak y Bray, 1999). Por último, merece la pena indicar que el lenguaje de programación Java (lenguaje que vamos a usar para implementar todos los ejemplos de programación en este texto) ha sido diseñado con la capa- cidad de interacción a través de Internet y, en particular, para poder generar aplicaciones que se eje- cuten a través de una página web. La técnica para ello es simple. Al solicitar la ejecución del programa 20 Introducción a la programación con orientación a objetos 7 World Wide Web significa literalmente red (o telaraña) de alcance mundial. Normalmente se conoce por las iniciales www e incluso como w3 o “w cubo”. 8 HTML puede traducirse como lenguaje de marcas para hipertexto. a través de la página web, pinchando en el correspondiente enlace con el ratón, una versión del pro- grama se copia a la máquina del usuario donde se ejecuta de forma local. Los navegadores actuales incorporan un intérprete de bytecode de Java 9 para poder ejecutar estos programas o Applets. EJERCICIOS PROPUESTOS Ejercicio 1.* ¿Cuál es la diferencia entre datos e información? Ejercicio 2.* ¿Cómo se almacena la información en los ordenadores, con repre- sentación analógica o digital? Ejercicio 3.* ¿Qué diferencias existen entre el código ASCII y el UNICODE? Ejercicio 4.* ¿Cuántos caracteres se podrían representar con 12 bits? Ejercicio 5.* ¿Por qué unidades está formada la CPU? Ejercicio 6.* ¿Cuántos bytes son un GB (gigabyte)? Ejercicio 7.* ¿Qué características tiene la memoria RAM? Ejercicio 8.* ¿Qué es la memoria caché? Ejercicio 9.* ¿Qué tipología de conexión se suele usar actualmente para conec- tar varios ordenadores en red? Ejercicio 10.* ¿Cómo se denomina el software que gestiona las comunicaciones en Internet? REFERENCIAS BOSAK, J. y BRAY, T.: “XML and the Second-Generation Web”, Scientific American, 79-83, May 1999. CERUZZI, P. E.: A History of Modern Computing, The MIT Press, 1999. COMER, D. E.: Internetworking with TCP/IP. Volume I, Third Edition, Prentice-Hall, 1995. DEMIDOVICH, B. P. y MARON, I. A.: Cálculo Numérico Fundamental, Paraninfo, 1977. GIBSON, W. y STERLING, B.: The Difference Engine, Orion paperback, 1996. HAFNER, K. y LYON, M.: Where wizards stay up late. The origins of the internet, Touchstone, 1998. KIM, E. E. y TOOLE, B. A.: “Ada and the First Computer”, Scientific American, 66-71, May 1999. KOPCHENOVA, N. V. y MARON, I. A.: Computational Mathematics, MIR Publishers, Moscow, Fourth printing, 1987. WILLIAMS, M. R.: A history of computing technology, Second edition, IEEE Computer Society Press, 2000. Sistemas basados en computador 21 9 El concepto de traductor e intérprete y de bytecode de Java se expondrá en el Capítulo 2. 2 Elementos de programación y lenguajes 2.1. Introducción 2.2. Concepto de programa 2.3. Lenguajes de programación 2.4. Sintaxis y semántica 2.5. Estructura de un programa 2.6. Errores de un programa 2.7. Algoritmos 2.8. Ingeniería del software 2.8.1. Concepto de Ingeniería del softwa- re 2.8.2. Ciclo de vida del software Sumario 2.1. INTRODUCCIÓN En este capítulo se introducen algunos conceptos fundamentales relativos a la programación y a los lenguajes de programación. Además, se presentan los conceptos básicos necesarios para el desarrollo de programas. Se introducen también los diferentes tipos de lenguajes de programación y sus diferen- cias. En el apartado 2.4 se describen los conceptos fundamentales de sintaxis y semántica, que ayuda- ran al lector a comprender la diferencia entre la forma de un programa y las tareas que realiza. Seguidamente, se presentará la estructura general de un programa y los tipos de errores que se pueden cometer al implementarlo. De esta forma se pretende dotar al lector desde el principio de una visión de conjunto relativa al problema de la programación. Dada la importancia del concepto de algoritmo, este capítulo le dedica una sección donde, además de definirlo, se describen las técnicas utilizadas para su evaluación. No queremos concluir sin introducir el concepto de Ingeniería del Software, mostran- do al lector que el desarrollo de software es una actividad profesional, racionalizada, que va más allá de la simple generación de líneas de código en un lenguaje dado. 2.2. CONCEPTO DE PROGRAMA La primera pregunta que podríamos plantear al introducir el problema de la programación, entendi- da como el desarrollo de programas, sería ¿qué es un programa? Podemos definir un programa como una serie de instrucciones que indican de forma precisa y exacta al computador qué tiene que hacer (Kamin et al., 1998). El programa es el medio de comunicación con el computador. Por medio de él conseguimos que la máquina utilice sus capacidades para resolver un problema que nos interesa. Este punto de vista es importante. Un computador se puede entender como una máquina virtual, capaz de realizar una serie de tareas genéricas pero no concretada hacia ninguna tarea específica. Es siempre necesario un programa, que usando un lenguaje inteligible por la máquina, le indique qué tiene que hacer. Para ello, como veremos más adelante, es necesario saber qué queremos indicar al computa- dor y cómo hacerlo. En cierto sentido, un programa modela algo (Arnow y Weis, 1998). Entendemos por modelo una representación simplificada de un problema. El modelo considera las características relevantes del pro- blema y las representa en el computador. La ciencia y el arte de la programación consisten en saber construir un modelo de solución para un problema dado y en indicar una serie de instrucciones que permitan describir dicho modelo al computador. Como ejemplo de programa veamos un caso sencillo en Java (Programa 2.1). Programa 2.1. Ejemplo de programa en Java // Imprime un refrán class Refran { public static void main(String[] args) { System.out.println(“Dondefueres haz lo que vieres”); } // Fin método main } // Fin class Refran Cuando el programa se ejecute imprimirá la siguiente línea de texto: Donde fueres haz lo que vieres El Programa 2.1 está formado por varios elementos: 24 Introducción a la programación con orientación a objetos a) Un comentario (en la primera línea) que indica para qué sirve el programa. b) Llaves, que se utilizan para definir bloques. c) Definición de una clase, a partir de la segunda línea (en los Capítulos 5 y 7 se trata el concepto de clase). d) Una instrucción, en la cuarta línea. Esta sentencia indica lo que hay que hacer, en este caso escribir una frase por pantalla. Como podemos apreciar, es necesario indicar las instrucciones al computador usando un lenguaje determinado (en el ejemplo anterior Java). Sin embargo, no existe un único lenguaje sino que hay muchos que se han ido desarrollando a lo largo del tiempo y que pueden ser clasificados en varios tipos estándar. 2.3. LENGUAJES DE PROGRAMACIÓN La comunicación con el computador se realiza utilizando un lenguaje determinado, un lenguaje de pro- gramación. Existen distintos tipos de lenguajes de programación y, dentro de cada tipo, diferentes len- guajes. Estos tipos pueden definirse desde diferentes puntos de vista. Una clasificación típica agrupa los lenguajes según su nivel de abstracción operativa. Esto implica que sea necesario detallar más o menos las operaciones a realizar para desarrollar una tarea concreta. Cuanto menos haya que indicar al ordenador, de mayor nivel se considera el lenguaje. La clasificación a la que estamos haciendo refe- rencia es la siguiente: a) Lenguaje máquina b) Lenguaje ensamblador c) Lenguajes de alto nivel d) Lenguajes de cuarta generación Vamos a comentar cada uno de los tipos de lenguajes de menor a mayor nivel de abstracción: a) Lenguaje máquina Es el lenguaje nativo de una CPU. Las instrucciones de este lenguaje se indican en binario. El código se expresa como una serie de dígitos binarios y es muy difícil para los humanos leerlo y escribirlo, aunque antiguamente se hacía. Hay un lenguaje máquina por cada tipo diferente de CPU. No podemos por lo tanto hablar del lenguaje máquina, sino siempre de un lenguaje máquina determinado. Todo pro- grama debe, en última instancia, ser traducido al lenguaje máquina del ordenador sobre el que se va a ejecutar. b) Lenguaje ensamblador Corresponde a un mayor nivel de abstracción que los lenguajes máquina. Un ensamblador utiliza símbolos mnemotécnicos, palabras cortas, para hacer referencia a las instrucciones o datos del len- guaje máquina, en lugar de usar los dígitos binarios directamente. Para ejecutar un programa escri- to en ensamblador es necesario convertir el programa a lenguaje máquina. Un lenguaje ensamblador corresponde a un determinado lenguaje máquina, por lo tanto no hay un solo lengua- je ensamblador. Estos dos lenguajes se consideran de bajo nivel de abstracción operativa. Elementos de programación y lenguajes 25 c) Lenguajes de alto nivel (a veces llamados de tercera generación) Se caracterizan porque son independientes de la máquina en la que se usan (generalmente, en la prác- tica los fabricantes suelen proveer estos lenguajes con algunas capacidades específicas para máquinas concretas). Estos lenguajes no hacen referencia al funcionamiento de la CPU, sino a tareas más orien- tadas al usuario (sumar, restar o multiplicar dos números, por ejemplo). Usan instrucciones que se ase- mejan al lenguaje ordinario. Cada una de las instrucciones en uno de estos lenguajes equivale normalmente a varias a nivel de máquina. Como en el caso del ensamblador, es necesario convertir el programa a lenguaje máquina. A tal efecto existen programas que realizan la traducción, por lo que el programador sólo tiene que preocuparse del trabajo de escribir su programa en el lenguaje deseado. En principio, un programa escrito en uno de estos lenguajes puede ejecutarse sobre cualquier ordenador. Ejemplo de esos lenguajes son: Fortran, Cobol, Pascal, C o Java. d) Lenguajes de cuarta generación Son lenguajes que trabajan a mayor nivel de abstracción. Suelen incorporan capacidades para la gene- ración de informes o interaccionar con bases de datos. Se denominan de cuarta generación, 4GL (fourth generation languages). Existe otra clasificación de los lenguajes de programación que se basa en el estilo de programa- ción y que clasifica los lenguajes en, a) Lenguajes imperativos o procedimentales b) Lenguajes declarativos a) Lenguajes imperativos o procedimentales Son lenguajes basados en la asignación de valores. Se fundamentan en la utilización de variables para almacenar valores y en la realización de operaciones con esos valores. b) Lenguajes declarativos Describen estructuras de datos y las relaciones entre ellas necesarias para una determinada tarea, indicando también cuál es el objetivo de la tarea. El programador no indica el procedimiento (el algoritmo) para rea- lizar la tarea. Hay dos tipos de lenguajes declarativos: b.1. Lenguajes funcionales. Basados en la definición de funciones, como LISP. b.2. Lenguajes de programación lógica. Basados en la definición de predicados (relaciones lógi- cas entre dos o más elementos) como PROLOG. Tanto si se usa un tipo de lenguaje u otro, al final el ordenador siempre lo traduce a lenguaje máquina, pues éste es el único lenguaje que reconoce. El proceso de traducción puede realizarse de diversas formas. Según el método que se use para llevar a cabo la traducción se habla de lenguajes compilados o lenguajes interpretados. a) Lenguajes compilados Estos lenguajes realizan una traducción completa del programa a lenguaje máquina (compilación del programa). Normalmente el proceso se realiza en dos etapas. En la primera, la compilación, el código que hemos escrito, denominado código fuente, se traduce a lo que se denomina código objeto que aún 26 Introducción a la programación con orientación a objetos 1 “Librería” es una mala traducción del término inglés library que significa biblioteca. Este término es muy común en informática. no es ejecutable. Para serlo, este código objeto debe enlazarse con los métodos, funciones o procedi- mientos predefinidos en el lenguaje, y que se encuentran en librerías 1 externas. En el segundo paso denominado de enlazado (“linkado” 2) se incorporan estas funciones, métodos o procedimientos y el resultado es un programa “ejecutable”, es decir, un programa en lenguaje máquina que puede funcio- nar, bajo una CPU determinada, veáse la Figura 2.1. Elementos de programación y lenguajes 27 2 Se trata de una traducción incorrecta del inglés linking que significa literalmente enlazar. Como el de librería, el tér- mino está muy extendido en el campo informático. 3 En la actualidad se están desarrollando CPU’s que usan el bytecode como lenguaje nativo. Figura 2.1. Procesos de compilación y enlazado (“linkado”) b) Lenguajes interpretados El código que se ha escrito, código fuente, se va leyendo poco a poco y va traduciéndose y ejecutándo- se según se traduce. Aquí no hay una traducción completa, no generamos un programa directamente eje- cutable. Por eso, tradicionalmente, los lenguajes interpretados son menos eficientes que los compilados. En particular, el lenguaje Java aplica una aproximación intermedia entre estas dos. Existe una “compilación” inicial donde el compilador de Java traduce el código fuente a bytecode, el cual es una representación de programa a bajo nivel. El bytecode no es el lenguaje máquina de ninguna CPU. El bytecode sería el código máquina de una hipotética CPU que hoy por hoy no existe física- mente 3. En este contexto se dice que el bytecode se ejecuta sobre una máquina virtual. Tras la com- pilación, el bytecode se interpreta. El intérprete de JAVA lo lee y lo ejecuta en una máquina concreta. El bytecode es estándar y no depende de ninguna CPU. La idea es que pueda ejecutarse en cualquier máquina. Interpretar el bytecode es más rápido que interpretar directamente el códigofuente, puesto que el bytecode está más próximo al lenguaje máquina que el fuente original. El byte- code es transportable de máquina a máquina, aunque debe haber para cada tipo de procesador un intérprete de bytecode para poder ejecutar los programas. De forma esquemática tendríamos el dia- grama de la Figura 2.2. En él, se muestra un bucle en el proceso de interpretación, indicando que es un proceso iterativo donde se lee una sección del bytecode y se ejecuta, repitiéndose el proceso has- ta finalizar todo el bytecode. 2.4. SINTAXIS Y SEMÁNTICA Estos dos conceptos subyacen en todo lenguaje de programación correspondiendo al qué puede hacer el lenguaje de programación y al cómo indicar que lo haga. Veamos una definición formal. Según el Diccionario de Uso del Español de María Moliner: Desde el punto de vista de un lenguaje de programación conocer las reglas sintácticas del lengua- je implica conocer cómo se usan las sentencias, declaraciones y los otros constructores del lenguaje. La semántica de un lenguaje de programación representa el significado de los distintos constructores sintácticos (Pratt y Zelkowitz, 1996). Las reglas de sintaxis de un lenguaje de programación dictan la forma de un programa. Durante la compilación de un programa, se comprueban todas las reglas de sin- taxis. La semántica dicta el significado de las sentencias del programa. La semántica define qué suce- derá cuando una sentencia se ejecute. Dicho de otra forma, saber qué se puede decir en un lenguaje hace referencia a la componente semántica. Por otro lado, saber cómo hay que decir en un lenguaje lo que queremos se refiere a la componente sintáctica. En cierto sentido la sintaxis es el continente y la semántica el contenido. Hay que tener muy en cuenta que un programa que sea sintácticamente correc- to no tiene por qué serlo semánticamente. Un programa siempre hará lo que le digamos que haga y no lo que queríamos decirle que hiciera. 2.5. ESTRUCTURA DE UN PROGRAMA En este texto nos vamos a centrar en la programación desde el punto de vista de los lenguajes imperati- vos. Desde este punto de vista, consideremos la estructura genérica de un programa. Esto nos propor- cionará un esquema general que nos servirá para irnos introduciendo en la disciplina de la programación. Lo primero que debemos indicar es que un programa siempre realiza una o varias tareas. Para poder llevarlas a cabo se necesita uno o varios algoritmos. El concepto de algoritmo se trata en deta- lle más adelante en este capítulo, de momento baste saber que un algoritmo puede definirse como: Semántica: Es el estudio del significado de las unidades lingüísticas. Sintaxis: Es la manera de enlazarse y ordenarse las palabras en la oración o las oraciones en el período. 28 Introducción a la programación con orientación a objetos Figura 2.2. Proceso de compilación e interpretación en Java Tengamos claro que un programa implica usar uno o varios algoritmos. En cualquier caso, usan- do un diagrama de bloques, la estructura genérica de un programa sería la que se muestra en la Figu- Un conjunto finito, ordenado de reglas o instrucciones bien definidas, tal que siguiéndolas paso a paso se obtiene la solución a un problema dado. Elementos de programación y lenguajes 29 Figura 2.3. Estructura genérica de un programa ra 2.3. Todo programa acepta información de entrada (los datos) y la procesa por medio de un/os algorit- mo/s. El resultado constituye la información de salida que es la que vamos buscando. Por lo que res- pecta a la parte de procesamiento, ésta debe considerarse en el contexto de los conceptos de eficacia y eficiencia. Estos dos conceptos son importantes y deben ser claramente distinguidos por el programa- dor. Eficacia se refiere a la consecución de los objetivos deseados, es decir, que el programa funcione. Eficiencia se refiere a la consecución de los objetivos con un adecuado consumo de recursos (tiempo, memoria central o de disco), es decir, que el programa funcione bien. En el terreno de la programación, el objetivo no es sólo que el programa funcione, sino que funcione y además consuma pocos recursos. Un programa no es bueno sólo por funcionar, eso es lo mínimo exigible. Se parte de que un programa debe funcionar. Un programa es bueno o no en función del consumo de recursos que haga. Por lo que respecta a un programa cualquiera, con sus componentes de entrada-procesamiento- salida, podemos organizarlo como un solo bloque monolítico de código o modularizarlo (subdividir- lo) en varios bloques más pequeños. Esta modularización se realizará, en nuestro contexto, desde un punto de vista funcional, como veremos en el Capítulo 5. Dicho de otra forma, nos vamos a centrar en las tareas o funciones que el programa debe desarrollar, véase la Figura 2.4. En un programa monolítico sólo tendríamos un bloque, un solo programa principal (muchas veces Figura 2.4. Tipos de programas denominado en inglés como main). Un programa modular se subdivide en función de las tareas a rea- lizar. Cada uno de los bloques funcionales sería una unidad, una especie de programa principal que se comunica con los bloques que necesite para tomar o enviar información. En la Figura 2.4 las flechas indican el sentido de movimiento de la información. El programa principal es siempre el bloque que comienza a ejecutarse al arrancar el programa. En un programa monolítico no habría ningún otro blo- que de código, y en un programa modular existiría un modulo principal, a partir del cual se irían lla- 30 Introducción a la programación con orientación a objetos 4 El concepto de método se presentará en detalle en el Capítulo 5. Los conceptos interrelacionados de clase y objeto se introducirán formalmente en el Capítulo 5 y se considerarán en el Capítulo 7. Figura 2.5. Delimitación del programa principal en Java mando los otros bloques funcionales. En particular en Java el programa o sección principal, es el que permite que el programa comien- ce a funcionar y se define, delimitado por llaves, como un método denominado main dentro de una clase 4 como en el ejemplo del programa refrán, véase la Figura 2.5. En orientación a objetos la clase es la “unidad” elemental de organización y las tareas que deba realizar se definen en ella por medio de los denominados métodos. De momento no entraremos en detalles sobre clases y métodos. En un programa tenemos una serie de instrucciones, denominadas sentencias. Éstas pueden eje- cutarse de dos formas: secuencialmente (se van ejecutando una detrás de otra), o de manera no line- Figura 2.6. Secuencia de ejecución de instrucciones o flujo lógico de un programa al, véase la Figura 2.6. Cuando la ejecución es no lineal debe existir algún mecanismo (a fin de cuen- tas una condición que se cumpla o no) que permita que se realice o no la bifurcación. Las bifurcacio- nes no tienen por qué seguir el orden secuencial, es decir, puede ramificarse de arriba abajo o de abajo arriba produciendo ciclos o bucles. Estos conceptos se expondrán con más detalle en los Capítulos 3 y 4. 2.6 ERRORES DE UN PROGRAMA Al escribir un programa siempre se producen errores. Uno de los puntos clave en el proceso de desa- rrollo de software es la depuración de los errores de un programa. Los errores de programación se pue- den clasificar en distintos tipos y abordar su eliminación con un proceso sistemático de corrección. Algunos errores los detecta el compilador, otros los debe encontrar el propio programador. La clasifi- cación usada organiza los errores en tres tipos: a) Errores de compilación. Este tipo de errores son detectados por el compilador. Son errores de compilación los errores de sintaxis o el uso en el programa de tipos de datos incompatibles, tal como pretender almacenar un valor real en una variable entera. b) Errores en tiempo de ejecución. Aunque el programa compile bien puede dar error al ejecu- tarlo, por ejemplo por intentar dividir por cero. En este caso el programa puede que estuviera bien escrito, pero al adquirir la variable
Compartir