Viso, Elisa - introducción a ciencias de la computación

download Viso, Elisa - introducción a ciencias de la computación

of 544

description

la segunda edición del libro de la doctora, que si se entera que lo subí. seguro me cuelga.

Transcript of Viso, Elisa - introducción a ciencias de la computación

Introduccin o

1

En este cap tulo introducimos conceptos relacionados con la computacin; presentamos una breve historia de las computadoras y del proo ceso de abstraccin que ha llevado a conformar la disciplina de las o ciencias de la computacin como la conocemos hoy en d Asimismo o a. revisamos la manera como han evolucionado los equipos de cmputo o hasta alcanzar las formas que tienen actualmente.

1.1 Signicado y alcances de la computacin oLa disciplina de la computacin es el estudio sistemtico de proceo a sos algor tmicos que describen y transforman informacin: su teor o a, anlisis, diseo, eciencia, implementacin y aplicacin. La pregunta a n o o fundamental subyacente en toda la computacin es, Qu puede ser o e (ecientemente) automatizado? Peter Denning, 2005. Hay mucha confusin respecto a trminos que, aparentemente describen a la o e misma disciplina. Usaremos a lo largo de este texto los trminos computacin y e o ciencias de la computacin casi indistintamente. Es necesario recalcar que estamos o usando el trmino computacin como abreviatura para ciencias de la computacin, e o o

1.2 Conceptos generales

2

con el signicado particular que le estamos dando a este ultimo en nuestro con texto. El error ms comn es el de confundir la programacin con la computacin. a u o o La diferencia que existe entre estos dos trminos es tal vez la misma que existe e entre saber la frmula para resolver una ecuacin de segundo grado y conocer la o o teor de ecuaciones. Si bien la programacin es una parte de la computacin, a o o la computacin contempla much o simos otros aspectos que no forzosamente tienen que ver con la programacin o llevarse a cabo con una computadora. Tambin se o e utilizan los trminos de ingenier y ciencias de la computacin y, excepto por el e a o enfoque que se pudiera dar en uno u otro caso, estar amos hablando del mismo cuerpo de conocimientos. Otro trmino que se utiliza frecuentemente (sobre todo en nuestro medio) es e el de informtica. Si bien en muchos casos se utiliza este trmino para referirse a e a todo lo que tiene que ver con computacin, nosotros lo entendemos ms bien o a como rerindose a aquellos aspectos de la computacin que tienen que ver con e o la administracin de la informacin (sistemas de informacin, bases de datos, o o o etctera). Al igual que la programacin, la informtica la podemos considerar e o a contenida propiamente en la computacin, con aspectos de administracin no o o exclusivos de la computacin. o El trmino ciberntica es un trmino forjado por los soviticos en los aos e e e e n cincuenta. Sus ra ces vienen de combinar aspectos biolgicos de los seres vivos o con ingenier mecnica, como es el caso de los robots, la percepcin remota, la a a o simulacin de funciones del cuerpo, entre otros. A pesar de que se utiliza muchas o veces en un sentido ms general, ac no lo haremos as a a . Por ultimo, un trmino que ha tomado relevancia en los ultimos aos es el de e n equiparar las ciencias de la computacin con lo que se denomina las tecnolog de o as la informacin, en cierto sentido tomando en cuenta que, como dice Denning, las o ciencias de la computacin tienen que ver con el manejo de informacin codicada o o de cierta manera. Este trmino es mucho ms cercano a informtica que a ciencias e a a de la computacin, pues se preocupa de formas de manejar, transmitir y procesar o la informacin sin asomarse demasiado a las implementaciones de bajo nivel. o

1.2 Conceptos generalesEl objeto fundamental de estudio de las ciencias de la computacin son los o algoritmos y, en su caso, su implementacin. Veamos antes que nada la denicin o o de algoritmo:

3

Introduccin o

Denicin 1.1 Un algoritmo es un mtodo de solucin para un problema que cumple con: o e o1. Trabaja a partir de 0 o ms datos (entrada). a 2. Produce al menos un resultado (salida). 3. Est especicado mediante un nmero nito de pasos (nitud). a u 4. Cada paso es susceptible de ser realizado por una persona con papel y lpiz a (denicin). o 5. El seguir el algoritmo (la ejecucin del algoritmo) lleva un tiempo nito o (terminacin). o Estamos entonces preocupados en ciencias de la computacin por resolver proo blemas; pero no cualquier problema, sino unicamente aqullos para los que poda e mos proporcionar un mtodo de solucin que sea un algoritmo aunque en realidad e o uno de las temas ms importantes en computacin, dado que est demostrado que a o a hay ms problemas que soluciones, es el de discernir cuando un problema tiene a solucin, y si la tiene, si es una solucin algor o o tmica. La segunda parte importante de nuestra disciplina es la implementacin de o algoritmos. Con esto queremos decir el poder llevar a cabo de manera automtica a un algoritmo dado (o diseado). n En la seccin que sigue exploraremos la historia de estos dos conceptos y o la manera en que se distinguieron para conformar lo que hoy conocemos como ciencias de la computacin. o

1.3 Breve historia del concepto de algoritmoLa computacin es una disciplina muy antigua. Tiene dos ra fundamentales: o ces La bsqueda de una sistematizacin del pensamiento, que dicho en nuestro u o terreno se interpreta como la bsqueda de algoritmos para resolver probleu mas, algunas veces generales y otras concretos. La bsqueda para desarrollar implementos o medios que permitan realizar u clculos de manera precisa y eciente. a En esta segunda ra podemos reconocer los implementos de cmputo como z o el baco chino y el baco japons, las tablillas de los egipcios para llevar la cona a e tabilidad de las parcelas cultivadas y, en general, todos aquellos mecanismos que

1.3 Historia

4 permit de manera ms expedita, conocer un cierto valor o llevar a cabo un an a clculo. a Respecto a la bsqueda de la sistematizacin del pensamiento, en la Antigua u o Grecia se hizo una contribucin enorme en esta direccin con el desarrollo del o o mtodo axiomtico en matemticas y el desarrollo de la geometr como un sise a a a tema lgico deductivo, en el que juegan un papel importante el modus ponens o (pA B Aq B) y el modus tollens (pA B 2B q 2A). Lo que se pretende con estos mecanismos es, a partir de un conjunto de hechos aceptados (axiomas) y mediante un cierto conjunto de reglas del juego (reglas de inferencia o de transformacin) lograr determinar la validez de nuevos hechos. En el fondo o lo que se buscaba era un algoritmo que describiera o automatizara la manera en que los seres humanos llegamos a conclusiones. Estos patrones de razonamiento se utilizan no slo en matemticas, sino en la vida diaria y han dado origen a o a una disciplina muy extensa y rigurosa que es la lgica matemtica. No creemos o a necesario remarcar el gran avance que ha tenido esta disciplina en la ultima mi tad del siglo XX. Sin embargo, es importante notar que el desarrollo ha estado siempre presente, no unicamente en este ultimo per odo. Para ello presentamos a continuacin una tabla con aquellos eventos histricos que consideramos ms o o a relevantes en el desarrollo de la computacin, con una pequea anotacin de cul o n o a fue la aportacin en cada uno de los incisos los nmeros romanos corresponden o u a siglos.

Tabla 1.12000 AC

Resumen de la historia de Ciencias de la computacin oBabilonios y egipcios

(1/3)

Tablas para clculos aritmticos, como ra a e ces cuadradas, inters compuesto, area de un e c rculo (8/9*1/2=3.1604...). Lgica formal con Modus Ponens y Modus o Tollens. Libro sobre recetas o mtodos para hacer e aritmtica con los nmeros arbigos. e u a Uso de letras para las incgnitas: surgimiento o del lgebra. a Huesos de Napier para la multiplicacin. El o concepto de logaritmo. Primer antecesor de la regla de clculo. a Formulacin matemtica de la F o a sica.

IV AC 825 1580 1614 1620

Aristteles (384-322 AC) o Abu Jafar Mohammed ibn Msa al-Khowrizm` u a Franois Vi`te (1540-1603) c e John Napier (1550-1617)

Edmund Gunter (1581-1626) XVI y XVII Galileo (1564-1642)

5

Introduccin o

Tabla 1.1

Resumen de la historia de Ciencias de la computacin o

(2/3)

XVI y XVII Descartes (1596-1650)

Descubre la geometr anal a tica, posibilitando la aplicacin del algebra a problemas o geomtricos y, por lo tanto, a problemas que e ten que ver con movimiento f an sico. Primera calculadora digital: suma y resta automticamente; multiplica y divide en forma a semiautomtica. a Calculadora que sobrevivi. Slo sumaba y o o restaba automticamente. a Coinventor del clculo con Newton. Primer a investigador occidental de la aritmtica bie naria. Inventor de la rueda de Leibniz, que hac las cuatro operaciones aritmticas. a e Fundamentos de la lgica simblica. o o Mquina Diferencial y Mquina Anal a a tica. Primera persona en programar la Mquina a Anal tica de Babbage. Construy un modelo de la Mquina Difereno a cial de Babbage. Estableci los fundamentos para el estudio o moderno de la Lgica Formal. o Uso de equipo tabulador (de registro unitario). Mquina electromecnica basada en la de a a Babbage. Propuso a los matemticos encontrar un sisa tema de axiomas lgicomatemtico unico o a para todas las reas de la matemtica. a a Elaboracin de tablas de posicin de la luna o o utilizando su mquina de registro unitario: a uso cient co de herramientas pensadas para procesamiento de datos.

1623

Wilhelm Schickard

1642-1644 XVII y XVIII

Blaise Pascal (1623-1662) Gottfried Wilhelm Leibniz (1646-1717)

XIX 1842 1854 1854 1890 1893 1900

Charles Babbage (1791-1871) Ada Lovelace Pehr George Scheutz George Boole (1815-1864) Herman Hollerith Leonardo Torres y Quevedo (1852-1936) David Hilbert (1862-1943)

1928

Hollerith

1.4 Sistemas numricos e

6(3/3)

Tabla 1.11936

Resumen de la historia de Ciencias de la computacin oKurt Gdel (1906-1978) o

1936

Alan Turing (1912-1954)

1939-1945

Wallace J. Eckert con John W. Mauchly

1937-1942

Claude Shannon

1940 1937-1944

John V. Atanaso (1903-) Howard T. Aiken (1900-1937)

Demostr que lo que propuso Hilbert no es o posible, esto es que hay problemas matemtia cos inherentemente insolubles. Atac el problema de cundo se puede deo a cir que se tiene un mtodo de solucin, que e o el problema no tiene solucin, etctera. Dio e se un implemento abstracto de cmputo no o conocido a partir de entonces como la Mquia na de Turing. Extensin de la mquina tabuladora de IBM o a para propsitos cient o cos. Diseo y consn truccin de la ENIAC, primera gran compuo tadora digital totalmente electrnica. o El uso del lgebra booleana para el anlisis a a de circuitos electrnicos. Liga entre la teor o a y el diseo. n Solucin de ecuaciones lineales simultneas. o a Computadora ABC. Construccin de la MARK I que ten o a: Posibilidad de manejar nmeros u positivos y negativos Posibilidad de utilizar diversas funciones matemticas a Totalmente automtica a Posibilidad de ejecutar operaciones largas en su orden natural ENIAC. Primera computadora totalmente electrnica o Notacin para describir la circuiter de la o a computadora. Conjunto de instrucciones para la EDVAC. El concepto de programa almacenado la nocin de que los datos y los o programas pueden compartir el almacenaje. Aritmtica binaria como mecanismo en las e computadoras

1943-1945 1944

John W. Mauchly John von Neumann

7

Introduccin o

1.4 Sistemas numricos eA lo largo de esta historia se han transformado notablemente los s mbolos que se usaron para denotar a los objetos de los clculos, a los algoritmos y a los rea sultados mismos. Podemos pensar, por ejemplo, en que una sumadora de las de Shickard usaba engranes como s mbolos para realizar las cuentas. El hombre primitivo usaba notacin unaria para contar: pon tantos s o a mbolos como objetos deseaba contar. Una primera abreviatura a estos mtodos se dio con sistemas que e agrupaban s mbolos. As por ejemplo, el sistema de nmeros romanos combina u s mbolos para abreviar: en lugar de escribir 100 rayas verticales utiliza el s mbolo C. Las abreviaturas del sistema romano son: N mero u de marcas 1 5 10 50 100 500 1000 S mbolo romano I V X L C D M

El sistema numrico romano tiene reglas para representar cantidades distintas que e stas y que son: e 1. El valor total de un nmero romano es la suma de los valores de cada uno u de los s mbolos que aparecen en el nmero, menos la suma de los valores de u los s mbolos que estn restando. e 2. Un s mbolo est restando si es que aparece inmediatamente a la izquierda de a un s mbolo con valor mayor que l. Pueden aparecer restando unicamente los e s mbolos I, X y C. No puede aparecer ms de un mismo s a mbolo restando. 3. Se pueden repetir hasta tres veces los s mbolos para el I, X, C y M. 4. Cuando un s mbolo est restando, slo puede hacerlo de los dos s a o mbolos que le siguen en valor: I X C puede restarse de V y X. puede restarse de L y C. puede restarse de D y M.

Veamos algunos ejemplos:

1.4 Sistemas numricos e

8 IV IX IC XCIX XC XL XLIX IL CMXCIX IM representa representa representa representa representa representa representa representa representa representa el el el el el el el el el el valor 4 valor 9 valor 99 incorrecto! valor 99 valor 90 valor 40 valor 49 valor 49 incorrecto! valor 999 valor 999 incorrecto!

5. Para cantidades mayores a 3,000 (MMM) se usan barras horizontales encima de los s mbolos D y M, que indican que el valor se multiplica por 10. 6. Los s mbolos romanos siempre se escriben de izquierda a derecha de mayor valor a menor valor, excepto en los casos en que el s mbolo est restando. e Contamos con un algoritmo muy sencillo para convertir nmeros en notacin u o decimal a nmeros romanos, que lo que hace es, repetitivamente, traducir un d u gito a su representacin en romano y multiplicarlo por 10. Lo dejamos para despus o e de haber visto notacin posicional. o

El cero y la notacin posicional oUn concepto importante es el del nmero cero. Su origen es muy antiguo. Tamu bin los mayas ten un s e an mbolo asociado al cero. Este concepto es importante para poder utilizar notacin posicional. La notacin posicional es lo que usamos o o hoy en d y consiste en que cada s a mbolo tiene dos valores asociados: el peso y la posicin. Estos valores estn dados en trminos de lo que conocemos como la o a e base, que hoy en d corresponde al 10. a

EJemplo 1.4.2El nmero 327.15 en el sistema decimal (o con base 10) se puede presentar de u la siguiente manera: 327.15

3 102 2 101 7 100 1 101 5 102

Decimos que la notacin es posicional porque el valor (o peso) que tiene un o d gito depende de la posicin que ocupa con respecto al resto de los d o gitos en un nmero y no nada ms de cul d u a a gito es en el sistema romano, el valor del s mbolo

9

Introduccin o

es independiente de la posicin que ocupa; lo unico que cambia es si suma o resta. o El sistema que usamos es el decimal posicional, porque es un sistema posicional que usa al nmero 10 como base. El peso que se le asigna a cada d u gito depende del d gito y de su posicin. Cada posicin lleva un peso de alguna potencia de 10 o o (decimal) asignadas, alrededor del punto decimal, de la siguiente forma: ... 4513.6 30100 .075 104 103 102 101 100 10000 1000 100 10 1 4 5 1 3 3 0 1 0 0 101 102 103 . . . .1 .01 .001 6 0 7 5

Hay varias reglas que observamos respecto a la notacin posicional: o i. En cada posicin se coloca un solo d o gito. ii. Los ceros antes del primer d gito distinto de cero, desde la izquierda, no aportan nada al nmero. u iii. Los ceros a la derecha del punto decimal y antes de un d gito distinto de cero s cuentan. No es lo mismo .75 que .00075. iv. Los ceros a la derecha del ultimo d gito distinto de cero despus del punto e decimal no cuentan. v. Los d gitos que podemos utilizar son del 0 al 9. vi. Cada d gito aporta su valor espec co multiplicado por el peso de la posicin o que ocupa. Sabemos todos trabajar en otras bases para la notacin posicional. Si en el o caso del sistema decimal la base es el valor 10 y cada posicin representa a una o potencia de 10, para trabajar en otra base cualquiera b, todo lo que tenemos que hacer es que los d gitos vayan del 0 a b 1 y las posiciones sean las correspondientes a potencias de b.

EJemplo 1.4.3Para trabajar en base manera: . . . 84 83 82 4096 512 64 476.18 4 41378 4 1 8 (mejor conocida como octal ) ser de la siguiente a 81 80 8 1 7 6 3 7 81 82 83 ... .125 .015625 .001953125 1 318.12510 214310

1.4 Sistemas numricos e

10

Tambin podemos pensar en base 16 (hexadecimal ), para lo que requerimos de e 16 s mbolos distintos. Los d gitos del 0 al 9 nos proporcionan 10 de ellos. Tenemos el problema de que con la restriccin de que cada posicin debe ser ocupada por o o un unico d gito, debemos inventar s mbolos (o d gitos) para seis valores que nos faltan, que ser del 10 al 15 inclusive. La tradicin es utilizar las letras A, B, C, an o D, E y F (a veces en minsculas) para los valores consecutivos 10, 11, 12, 13, 14 u y 15 respectivamente. Siguiendo la notacin posicional, pero en base 16, tenemos: o

EJemplo 1.4.4161 1 162

... 476.116 BA7C16

164

163

162 161 160 16 7 7 1 6 12 4

...

65536 4096 256 11 10

.0625 .00390625

1142.062510 4774010

Pasamos ahora a la base 2, que es la ms importante hoy en d en compua a tacin. Los primeros implementos de cmputo que usaban notacin posicional (los o o o abacos1 , huesos de Napier, calculadoras) usaban base 10. Mientras las calculadoras se constru con partes f an sicas (engranes, cuentas) la base 10 no era muy distinta de cualquier otra base. Pero al intentar construir calculadoras (o computadoras) electrnicas, la base 10 presentaba problemas de implementacin: cmo distino o o guir entre el 4 y el 5, cuando se estaba midiendo en trminos de niveles de luz, e l quidos, analgicamente? Por lo tanto se opt, aunque no desde el principio, por o o usar base 2, que tiene una representacin en la electrnica bastante simple. Para o o base 2 requerimos de dos s mbolos, por lo que utilizamos el 0 y el 1. El 0 se puede interpretar como ausencia y el 1 como presencia; con esto ms all de cierto nivel a a se supone presencia. Esto es mucho ms sencillo que ver si tenemos uno de 10 (u 8) a niveles distintos. En la tabla que sigue damos dos ejemplos en notacin posicional o en base 2:Los bacos, en realidad, usaban una especie de base 5. Observa que cada hilo o columna en a un baco tiene, en la parte inferior, cuatro cuentas el japons y cinco el chino, aunque como la a e parte superior tiene una cuenta el japons y dos el chino, se contaba dos veces la parte inferior, e pudindose considerar como base 10. e1

11

Introduccin o

EJemplo 1.4.527 26 25 24 23 22 21 20 128 64 32 16 8 4 2 1 1 1 0 0 1 1 0 1 1 0 1 0 0 0 21 22 23 . . . .5 .25 .125 1 1 205.7510 4010

... 11001101.112 1010002

Como se puede ver, tratndose de nmeros enteros, es fcil pasar de una base a u a cualquiera a base 10, simplemente mediante la frmula o

num10

n i 0

d i bi

donde di se reere al d gito correspondiente en la i-sima posicin, con la posicin e o o 0 en el extremo derecho, mientras que bi se reere a la base elevada a la potencia de la posicin correspondiente. La n representa a la posicin distinta de cero con o o la potencia ms grande (la primera posicin signicativa a la izquierda). a o

1010002

5 i 0

0 2 0 0 2 1 0 2 2 1 2 3 0 2 4 1 2 5 0 0 0 8 0 32 4010Para pasar de base 10 a cualquier otra base, se utiliza el algoritmo 1.1. Como estamos trabajando en notacin posicional y debemos ocupar una posicin por o o cada d gito en la base h, trabajaremos con s mbolos, por lo que buscamos construir una cadena de s mbolos y no precisamente un nmero. u El algoritmo construye el nmero base h pegando d u gitos de la base h por la izquierda, trabajando con una cadena. Hay que notar que en la l nea 11 se est concatenando un s a mbolo a nmero, por lo que si la base es mayor a 10, se u tendrn que utilizar s a mbolos para los d gitos mayores que 9.

d i 2i

1.4 Sistemas numricos e

12

Algoritmo 1.1 Algoritmo para pasar de base 10 a base hEntrada: El nmero entero en base 10: num10 u Salida: El nmero en base h: nmero u u Mtodo: Vamos obteniendo los d e gitos de derecha a izquierda, empezando por el menos signicativo.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 / I n i c i a l i z a c i n / o d i v i d e n d o = num10 ; divisor = h; residuo = 0; n mero = "" ; // Una c a d e n a v a ca , que no t i e n e u // n i n g u n sm b o l o / Se o b t i e n e d g i t o p o r d g i t o de l a nueva b a s e / repite r e s i d u o = d i v i d e n d o m dulo d i v i s o r o // ( r e s i d u o e n t e r o de d i v i d e n d o d i v i s o r ) ; n mero = p e g a r e l sm b o l o c o r r e s p o n d i e n t e a l r e s i d u o u p o r l a i z q u i e r d a a l o que ya l l e v a m o s en n mero . u d i v i d e n d o = d i v i d e n d o d i v i s o r ; // ( c o c i e n t e e n t e r o ) h a s t a que ( d i v i d e n d o = 0 ) ; / En nmero queda e l r e s u l t a d o / u

Veamos un ejemplo de la aplicacin de este algoritmo a continuacin. o o

EJemplo 1.4.6Para pasar de base 10 a base 16 el nmero 857510 , el algoritmo se ejecutar u a de la siguiente manera: dividendo10 cociente10 residuo10 S mbolo residuo16 8575 535 15 F 535 33 7 7 33 2 1 1 2 0 2 2 Para que nos convenzamos que, en efecto 857510 componer 217F en potencias de 16: 217F16 N mero16 u F 7F 17F 217F

217F16, procedemos a des-

15 160 7 161 1 162 2 163 15 1 7 16 1 256 2 4096 15 112 256 8192 857510

13

Introduccin o

Cuando una de las bases es potencia de la otra, el pasar de una base a la otra es todav ms sencillo. Por ejemplo, si queremos pasar de base 8 a base a a 2 (binario), observamos que 8 23 . Esto nos indica que cada posicin octal se o convertir exactamente a tres posiciones binarias correspondientes a 22 , 21 y 20 a en ese orden. Lo unico que tenemos que hacer es pasar cada d gito octal presente en el nmero a su representacin binaria: u o 75358 7 5 3 5 421 41 21 41 22 21 20 22 20 21 20 22 20 111 101 011 101 1111010111012

Algo similar se hace para pasar de base 16 a base 2, aunque tomando para cada d gito base 16 cuatro d gitos base 2. 7A35C16 7 A 3 5 C 421 82 21 41 84 22 21 20 23 21 21 20 22 20 23 22 0111 1010 0011 0101 1100 11110100011010111002

Hay que tener cuidado de no eliminar los ceros a la izquierda en los d gitos intermedios, sino unicamente en el primer d gito octal o hexadecimal a la izquierda. El proceso inverso, para pasar de base 2 por ejemplo a base 16, como 16 24 deberemos tomar 4 d gitos binarios por cada d gito hexadecimal (23 , 22 , 21 y 20 respectivamente), separndolos desde la derecha y rellenando con ceros al primer a grupo de la izquierda: 101111010111012 00102 11112 01012 11012 1 3 2 1 0 2 0 3 10 1111 0101 1101 2 2 2 2 2 2 2 2 22 20 210 1510 510 1310 216 F16 516 D16 2F 5D Las computadoras actuales son, en su inmensa mayor digitales, esto es, que a, representan su informacin de manera discreta, con d o gitos. Operan en base 2 (binario) ya que la electrnica es ms sencilla en estos trminos. Sin embargo, o a e hay procesos que no son discretos, como las ondas de luz o sonoras. Pero hoy en d se pueden alcanzar excelentes aproximaciones de procesos continuos mediante a d gitos binarios. Para ello se cuenta con componentes analgicos/digitales que o

1.5 La arquitectura de von Neumann

14

transforman seales analgicas (continuas) en seales digitales (discretas). Hubo n o n una poca en que se ten mucha fe en las computadoras analgicas, aquellas que e a o funcionaban con dispositivos continuos, pero prcticamente han desaparecido del a mercado, excepto por algunas de propsito muy espec o co, o las que convierten seales analgicas en seales digitales, o viceversa. n o n La siguiente pregunta que debemos hacernos es: Cules son los distintos elementos que requerimos para poder implementar un a algoritmo en una computadora digital? Cmo se representan en binario esos distintos elementos? o Pensemos por ejemplo en las mquinas de escribir. La orden para que se esa criba una letra determinada se lleva a cabo oprimiendo una cierta tecla. Esto es porque hay una conexin mecnica (f o a sica) entre la tecla del teclado y el dado que imprime la tecla. La primera computadora, la ENIAC, funcionaba de manera muy similar. Cada vez que se deseaba que resolviera algn problema, se alambraban u los paneles de la computadora para que hubiera conexiones f sicas entre lo que se recib en el teletipo y las operaciones que se ejecutaban. De manera similar, a las calculadoras mecnicas, al darle vuelta a una manivela, se consegu que los a a engranes seleccionados efectuaran una determinada operacin. o Las computadoras modernas, de propsito general, vienen alambradas para o reconocer ciertos patrones, de forma similar a como lo hac el telar de Jackard o a la mquina del censo de Hollerith. Cada patrn indica una operacin a realizara o o se. Los patrones son nmeros binarios con un nmero jo de posiciones (binary u u n digits). A cada conjunto de posiciones de un cierto tamao se le llama una palabra. El tamao de palabra es, en general, un nmero de bits que corresponde a n u una potencia de 2: 8, 16, 32, 64, 128. A los grupos de 8 bits se les llama byte. Al conjunto de patrones distintos es a lo que se conoce como lenguaje de mquina, a que por supuesto es personal de cada modelo o tipo de computadora. Originalmente se distingu entre micro, mini y computadoras por el tamao en bits de a n sus palabras. El tamao de la palabra va unido al poder de la mquina: si tengo n o a ms bits por palabra tengo ms patrones posibles, y por lo tanto un lenguaje de a a mquina ms extenso y posibilidad de representar nmeros ms grandes o con ms a a u a a precisin2 . Las primeras microcomputadores ten palabras de 8 bits, mientras o an que las grandes computadoras ten palabras de 64 bits. Las supercomputadoan ras, que surgieron alrededor de 1985, ten palabras de 128 bits y posibilidades an de proceso en paralelo. El tamao de la palabra tambin le da velocidad a una computadora, pues n e indica el nmero de bits que participan electrnicamente en cada operacin. u o o2

En breve veremos la representacin de datos en la computadora. o

15

Introduccin o

1.5 La arquitectura de von NeumannSe le llama arquitectura de una computadora a la organizacin que tiene en sus o componentes electrnicos, y la manera como stos estn integrados para funcionar. o e a Lo que se conoce como arquitectura de von Neumann es una organizacin o muy parecida a la de Babbage: tenemos un procesador central el molino de Babbage en el que se ejecutan las operaciones aritmticas y de comparacin e o (lgicas); una memoria central que se utiliza para almacenar datos, resultados o intermedios y el programa a ejecutarse; tenemos unidades de entrada y salida (input/output) que sirven para darle a la computadora el programa y los datos y recibir los resultados; por ultimo, tenemos memoria externa o auxiliar, como discos, diskettes, cintas magnticas, que nos sirven para almacenar, ya sean datos e o programas, de una ejecucin a otra, sin tener que volver a realizar el proceso, o o sin que tengamos que volverlos a proporcionar. Un esquema de una computadora con arquitectura de von Neumann se muestra en la gura 1.1.

Figura 1.1

Arquitectura de von NeumannMemoria auxiliarDiscos

Memoria Central

Procesador centralUnidad de control Unidad aritmtica e Unidad lgica o Cache

Dispositivos de entradaTeclado, scanner, usb

Dispositivos de salidaMonitor, impresora, usb, bocinas

Las echas que van de un componente a otro pueden tener distintas formas de funcionar y muy diversas capacidades. Una de las formas en que funciona es

1.5 La arquitectura de von Neumann

16

lo que se conoce como un bus. Por ejemplo, si la capacidad de la l nea que va de memoria al procesador es de menos de una palabra, aunque la computadora tenga palabras muy grandes, la velocidad de la mquina se va a ver afectada. a La memoria est cuadriculada o dividida en celdas. Cada celda ocupa una a posicin dentro de la memoria, aunque en principio cada una es igual a cualquier o otra: tiene el mismo nmero de bits y las mismas conexiones. Se puede ver como un u vector de celdas, cuyo primer elemento tiene el ndice cero. Se habla de posiciones altas y posiciones bajas rerindose a aqullas que tienen e e ndices grandes o pequeos respectivamente. En cada celda de memoria se puede colocar (escribir, n copiar) una instruccin, un nmero, una cadena de caracteres, etc. o u El proceso mediante el que se ejecuta un programa en lenguaje de mquina ya a colocado en la memoria de la computadora es el siguiente: i. La unidad de control se coloca frente a la primera instruccin de lenguaje de o mquina una vez cargado el programa. a ii. La unidad de control entra a un ciclo conocido como fetch/execute: (fetch) Carga a la unidad de control la siguiente instruccin a ser ejecutada. o (execute) La Unidad de Control se encarga de ejecutar la instruccin, vao lindose para ello de cualquiera de los componentes de la mquina. e a El tipo de instrucciones que tiene una computadora incluyen instrucciones para sumar, restar, multiplicar, dividir, copiar, borrar, recorrer el patrn de bits, o comparar y decidir si un nmero es mayor que otro, etc. En realidad son instrucu ciones que hacen muy pocas cosas y relativamente sencillas. Recurdese que se e hace todo en sistema binario.

Lenguajes de programacin oUn lenguaje de programacin es aquel que nos permite expresar un problema o de tal manera que podamos instalarlo (cargarlo) en la computadora y se ejecute. Hasta ahora slo hemos visto el lenguaje de mquina, y ste era el unico disponible o a e con las primeras computadoras de propsito general. o Programar en binario es, en el mejor de los casos, sumamente tedioso y complicado. El programador (que es quien escribe los programas) tiene que tener un

17

Introduccin o

conocimiento muy profundo de la computadora para la que est programando. a Adems de eso, tiene que ejercer un cuidado extremo para no escribir ningn 1 a u por 0, o para no equivocarse de direccin. Lo primero que se hizo fue escribir en o octal, ya que era un poco ms claro que binario. El siguiente paso fue asociar a nemnicos a las instrucciones, asociando a cada patrn de bits un nombre o o o identicador: add, sub, mul, div, etc. A esto se le llam lenguaje ensamblador. Se o construy un programa, llamado ensamblador, que se encargaba de traducir los o nemnicos de este estilo y las direcciones escritas en octal a binario. Este programa o no es algo complicado de hacer. Tanto el programa ensamblador como el programa a traducir se alimentaban, cargados en tarjetas perforadas ver gura 1.2. El primer paquete era el programa ensamblador, escrito en binario; a continuacin o se presentaba el programa que se deseaba traducir, como datos del primero. La computadora contaba con un tablero, en el que se le indicaba que empezara a cargar el programa ensamblador, y una vez cargado (1), empieza a ejecutarlo. El programa ensamblador indicaba que ten que traducir las siguientes tarjetas (o a cinta perforada), conforme las fuera leyendo (2), y producir tarjetas con el programa en binario (3) o, ms adelante, cargar el programa binario a memoria para a ser ejecutado (4); al ejecutarse el programa en binario, se le los datos (5) y se an produc el resultado (6). a

Figura 1.2

Proceso para ejecutar un programa escrito en ensamblador

(4) (3)Datos para el programa Programa a ejecutar Programa ensamblador (binario) Unidad de control Programa objeto (binario)

(5) (2) MEMORIA (6)Resultados

(1)

El siguiente paso en lenguajes de programacin fue el de los macroensambladoo res, que asignaban etiquetas a las posiciones de memoria que se estaban utilizando

1.5 La arquitectura de von Neumann

18

para acomodar los datos y resultados intermedios, y las posiciones donde iba a quedar el cdigo. El proceso de traduccin era sencillo, ya que se agregaban a o o las tablas de traduccin del cdigo los equivalentes en octal. Tambin se permit o o e a construir secuencias pequeas de cdigo, a las que nuevamente se les asociaba un n o nombre o identicador, y que pod presentar parmetros. A estas secuencias se an a les llamaba macros y de ah el nombre de macroensamblador. Las computadoras se utilizaban tanto con nes cient cos como comerciales. En el uso cient co era muy comn expresar frmulas matemticas, que ten que u o a an despedazarse en operaciones bsicas para poderse llevar a cabo ver gura 1.3. a

Figura 1.3

Codicacin en ensamblador de frmulas matemticas o o a

Frmula o b c2b 2a

Programa simplicado 4acdef def def def def def def def x1 a b c ac a2 b2 rad 100 102 104 106 108 110 112 114 mul b2 b b mul ac a c mul ac 4 ac mul a2 2 a sub rad ac b2 sqrt rad rad sub x1 rad b div x1 x1 a2

x1

El siguiente paso importante fue el de permitirle a un programador que especicara su frmula de manera similar a como se muestra en la parte izquierda de o la gura 1.3 x1 pb ra pb2 4 a cqq{p2 aq. El primer lenguaje de uso z generalizado orientado a esto fue FORTRAN For mula Translator, alrededor de 1956. Pocos aos despus se desarroll un lenguaje para usos comerciales, donde n e o lo que se deseaba es poder manejar datos a distintos niveles de agregacin. Eso te lenguaje se llamaba COBOL COmon B ussiness Oriented Language. Ambos lenguajes, o versiones modernizadas, sobreviven hasta nuestros d as. Estos lenguajes ten un formato tambin ms o menos estricto, en el sentido an e a de que las columnas de las tarjetas perforadas estaban perfectamente asignadas, y cada elemento del lenguaje ten una posicin, como en lenguaje ensamblador. a o El proceso por el que tiene que pasar un programa en alguno de estos lenguajes de programacin para ser ejecutado, es muy similar al de un programa escrito o en lenguaje ensamblador, donde cada enunciado en lenguaje de alto nivel se traduce a varios enunciados en lenguaje de mquina (por eso el calicativo de a

19

Introduccin o

alto nivel, alto nivel de informacin por enunciado), que es el unico que puede o ser ejecutado por la computadora. Hacia nales de los aos 50 se dise el lenguaje, ALGOL ALGorithmic n no Oriented Language que result ser el modelo de desarrollo de prcticamente too a dos los lenguajes orientados a algoritmos de hoy en d como Pascal, C, C++, a, Java y muchos ms. No se pretende ser exhaustivo en la lista de lenguajes, basa te mencionar que tambin en los aos 50 surgi el lenguaje LISP, orientado a e n o inteligencia articial; en los aos 60 surgi BASIC, orientado a hacer ms fcil n o a a el acercamiento a las computadoras de personas no forzosamente con antecedentes cient cos. En los aos 60 surgi el primer lenguaje que se puede considerar n o orientado a objetos, SIMULA, que era una extensin de ALGOL. En los aproxio madamente 50 aos que tienen en uso las computadoras, se han diseado y usado n n miles de lenguajes de programacin, por lo que pretender mencionar siquiera a los o ms importantes es una tarea titnica y no el objetivo de estas notas. a a

Representacin de la informacin o oAcabamos de ver que la representacin de los programas debe ser eventualo mente en lenguaje de mquina, o sea en binario. Tambin tenemos restricciones a e similares para el resto de la informacin, como son los datos, los resultados intero medios y los resultados nales. Al igual que con los lenguajes de programacin, o si bien la computadora slo tiene la posibilidad de representar enteros positivos o en binario, debemos encontrar la manera de poder representar letras, nmeros de u varios tipos, como enteros negativos, reales, racionales, etc. Para ello se sigue una lgica similar a la del lenguaje de mquina. o a

CaracteresSupongamos que tenemos un tamao de palabra de 16 bits y queremos repren sentar letras o caracteres. Simplemente hacemos lo que hac amos en la primaria cuando quer amos mandar mensajes secretos: nos ponemos de acuerdo en algn u cdigo. o El primer cdigo que se utiliz fue el BCD, que utilizaba 6 bits por carcter. o o a Con esto se pod representar 64 caracteres distintos (en 6 bits hay 64 posibles an

1.5 La arquitectura de von Neumann

20

enteros, del 0 al 63). Con este cdigo alcanzaba para las maysculas, los d o u gitos y algunos caracteres importantes como los signos de operacin y de puntuacin. o o Con el perfeccionamiento de las computadoras se requirieron cada vez ms a caracteres, por lo que se extendi el cdigo a 7 y 8 bits, con el cdigo ASCII, que o o o se us mucho para transmitir informacin, y el cdigo EBCDIC que se us como o o o o cdigo nativo de muchas computadoras, respectivamente. El lenguaje Java utiliza o Unicode, que ocupa 16 bits, para representar a cada carcter. Con esto tiene la a posibilidad de utilizar casi cualquier conjunto de caracteres de much simos de los idiomas en uso actualmente. Se requiere de programas que transformen a un carcter en su cdigo de mquia o a na y viceversa. Estos son programas sencillos que simplemente observan patrones de bits y los interpretan, o bien observan caracteres y mediante una tabla los convierten al patrn de bits en el cdigo que utilice la computadora. o o Prcticamente todo manual de programacin trae una tabla de los distintos a o cdigos que corresponden a los caracteres. Estas tablas vienen con varias columnas; o en la primera de ellas vendr el carcter y en columnas subsecuentes su cdigo en a a o octal, hexadecimal, binario, utilizando alguno de estos esquemas para dar el cdigo o que le corresponde en ASCII, EBCDIC o Unicode. Por supuesto que requerimos de 32,768 para mostrar la codicacin de Unicode, por lo que no lo haremos, ms o a que en la medida en que tengamos que conocer el de algunos caracteres espec cos.

Nmeros enteros uYa vimos la manera en que se representan nmeros enteros en la computadora: u simplemente tomamos una palabra y usamos notacin posicional binaria para ver o el valor de un entero. Hoy en d las computadoras vienen, en su gran mayor con palabras de al a a, menos 32 bits. Eso quiere decir que podemos representar enteros positivos que van desde el 0 (32 bits apagados) hasta 232 1 (todos los bits prendidos). Pero, cmo le hacemos para representar enteros negativos? Tenemos dos opciones. La o primera de ellas es la ms intuitiva: utilizamos un bit, el de la extrema izquierda, a como signo. A esta notacin se le llama de signo y magnitud. Si ste es el caso, o e tenemos ahora 31 bits para la magnitud y 1 bit para el signo ver gura 1.4 con palabras de 16 bits. La representacin de signo y magnitud es muy costosa. Por ejemplo, cuando o se suman dos cantidades que tienen signos opuestos, hay que ver cul es la que a tiene mayor magnitud, pues la suma se puede convertir en resta de magnitudes. Veamos el algoritmo 1.2 en la pgina opuesta. a

21

Introduccin o

Figura 1.4

Enteros en signo y magnitudmagnitud hkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkikkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkj 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 0 0 0 0 1 0 1 1 0 1 1 1 0 0 1 1 2931 1 0 0 0 1 0 1 1 0 1 1 1 0 0 1 1 2931 s i g n o

Como se puede ver, los circuitos que se requieren para sumar dos nmeros en u notacin de signo y magnitud son muy complicados, y por lo tanto muy caros. o

Algoritmo 1.2 Suma de dos nmeros enteros representados con signo y magnitud u1 2 3 4 5 6 7 8 9 10 11 12 13 Sean a y b l o s e n t e r o s a sumar Sa s i g n o de a ; Ma magnitud de a ; Sb s i g n o de b ; Mb magnitud de b ; i f ( Sa Sb ) then Ssuma Sa ; Msuma Ma Mb ; else i f ( Ma Mb ) then Ssuma Sa ; Msuma Ma Mb ; else Ssuma Sb ; Msuma Mb Ma ;

El otro modo de codicar enteros positivos y negativos es lo que se conoce como complemento a 2. En este mtodo, al igual que con signo y magnitud, se e parte al dominio en 2 partes, los que tienen al bit de potencia ms alta en 0, y los a que lo tienen en 1; los que tienen el bit ms alto en cero son los enteros positivos, a y los que lo tienen en 1 son los enteros negativos. Para saber la magnitud del nmero, en el caso de los positivos se calcula igual que con signo y magnitud, pero u en el caso de los negativos, la magnitud es la que resulta de restar la palabra de una con una posicin ms, y donde todas las posiciones originales de la palabra o a tienen 0, con un 1 en la posicin extra. Veamos algunos ejemplos en la gura 1.5 o en la siguiente pgina. a

1.5 La arquitectura de von Neumann

22

Figura 1.5

Nmeros enteros en complemento a 2 u

215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 Un entero positivo en complemento a 2: 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 La palabra con el complemento a 2: 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0

3, 592 216 65, 536 36, 360 29, 176

p1 q p2 q p3 q p4 q

Un entero negativo en complemento a 2: 1 0 0 0 1 1 1 0 0 La magnitud del entero original: 0 0 1 1 1 0 0 0 1 1

Como vemos en la gura 1.5, el bit 15 (el que corresponde a 215 ) tambin e nos indica de cierta forma, como en la notacin de signo y magnitud, cuando o tenemos un entero negativo. En el caso de 16 bits, los enteros positivos son del 0 al 215 1 32, 767 que corresponde a una palabra de 16 bits con todos menos el bit 15 prendidos: 215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 32, 767 A partir del nmero 215 32, 768 y hasta 216 1 65, 535, que corresponde u a todos los bits en una palabra de 16 bits prendidos, estamos representando a nmeros negativos ver en la gura 1.5, l u nea (3). En los enteros negativos el bit 15 est siempre prendido, por lo que reconocemos el signo del nmero. a u La magnitud (o el valor absoluto) del nmero que estamos viendo se obtiene u sacando el complemento a 2 de la palabra en cuestin. El complemento a 2 se o obtiene de tres maneras posibles: i. Se resta en binario de un nmero de 17 bits en la gura 1.5, l u nea (2) con ceros en todos los bits, menos el bit 16, que tiene 1. 10000000000000000 1000111000001000 0111000111111000 65536 36360 29176

23

Introduccin o

ii. Se complementan cada uno de los bits de la palabra de 16 bits (se cambian los 1s por 0s y los 0s por 1s) y despus se le suma 1 a lo que se obtuvo. e 1000111000001000 0111000111110111 1 0111000111111000 Nmero original u Nmero complementado a 1 u Se le suma 1 29176

iii. Se procesan los bits de derecha a izquierda: se dejan igual los d gitos hasta e incluyendo el primer 1; a partir de ese punto se complementan todos los bits (convertir al bit de signo en 0). a 1000111000001000 0111000111111000 Nmero original u Se dejan igual hasta el primer 1 y se complementan 29176

Cabe aclarar que nos interesa sacar el complemento a 2 slo en el caso de los o enteros negativos los que tienen el bit ms alto prendido pues en el caso de los a enteros positivos su magnitud est dada directamente en binario. a La gran ventaja de la notacin en complemento a 2 es que es sumamente fcil o a hacer operaciones aritmticas como la suma y la resta. En complemento a 2, todo lo e que tenemos que hacer es sumar (o restar) utilizando los 16 bits. Pudiera suceder, sin embargo, que el resultado no sea vlido. Por ejemplo, si sumamos dos nmeros a u positivos y el resultado es mayor que la capacidad, tendremos acarreo sobre el bit 15, dando aparentemente un nmero negativo. Sabemos que el resultado es u invlido porque si en los dos sumandos el bit 15 estaba apagado, tiene que estar a apagado en el resultado. Algo similar sucede si se suman dos nmeros negativos u y el resultado ya no cabe en 16 bits ver gura 1.6.

Figura 1.6

Suma de dos nmeros enteros con complemento a 2 u215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 1 0 0 1 1 1 0

+ +

207 4547 4754 25 939 914

1.5 La arquitectura de von Neumann

24

Pueden vericar, sumando las potencias de 2 donde hay un 1, que las sumas en la gura 1.6 se hicieron directamente y que el resultado es el correcto. La desventaja del complemento a 2 es que se pueden presentar errores sin que nos demos cuenta de ello. Por ejemplo, si le sumamos 1 al mximo entero positivo a (una palabra con 0 en el bit 15 y 1 en el resto de los bits) el resultado resulta ser un nmero negativo, aquel que tiene 1 en todas las posiciones de la palabraver u gura 1.7.

Figura 1.7

Sumando 1 al mximo entero positivo a215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

+

32767 1 32768

En algunos lenguajes de programacin este tipo de errores se detectan en o ejecucin, pero en la mayor no. Hay que tener presente que la representacin o a o interna es con complemento a 2, para manejar de manera adecuada este tipo de posibles errores. Muchas veces el tamao de la palabra de una computadora no es suciente n para los nmeros que deseamos representar. Entonces, el lenguaje de programacin u o puede usar ms de una palabra para representar enteros, simplemente utilizando a notacin posicional base 216 , de manera similar a como se maneja la base 2. Se o dice entonces que la aritmtica se hace por software. e

Nmeros reales uPara representar a los nmero reales tenemos dos opciones, conocidas como u punto jo y punto otante. Punto jo: Como su nombre l;o indica, la representacin en bits es la de un o entero (posiblemente en complemento a 2) al que se le aplica un factor de escalamiento constante. Por ejemplo, pensando en base 10 y si tenemos un factor de escala de 1{10000 (que corresponde as 4 posiciones decimales), el nmero 325.15 estar representado como 3251500, que al multiplicarlo por u a 1{10000 nos dar precisamente 325.15. El nmero 1.2575 estar represena u a tado como 12575. En el caso de notacin binaria el factor de escala es una o

25

Introduccin o

potencia negativa de 2 (1{2 para una posicin, 1{4 para dos posiciones y o as sucesivamente).ver gura 1.8. Como se puede ver en esta gura, se mantiene la notacin de complemento o a 2, con el bit ms alto indicndonos que el nmero es negativo. a a u

Figura 1.8

Notacin con punto jo o215 214 213 212 211 210 29 1 28 27 26 25 24 23 22 21 20 0 1 0 0 1 1 0 1 0 1 0 0 0 0 1 1 19779{26 309.047 1 0 0 1 1 0 1 1 0 1 0 1 0 1 1 0 99560{26 1555.625 Una de las ventajas de este tipo de notacin es que es muy sencillo hacer o operaciones aritmticas, pues se usa a toda la palabra como si fuera un entero e y el proceso de colocar el punto decimal se hace al nal. Sin embargo, tiene una gran desventaja que es la poca exibilidad para representar nmeros u que tengan muchos o muy pocos d gitos signicativos en la fraccin. o Punto otante: El punto otante es otra manera de representar nmeros reales. u Bsicamente se logra esta notacin dividiendo a la palabra en dos partes, a o una para la mantisa y la otra para el exponente, utilizando lo que se conoce como notacin cient o ca. Veamos los siguientes ejemplos: 1.32456 106 1.32456 106 1.32456 103

1324560 .00000132456 1324.56

Como podemos ver del ejemplo anterior, nos ponemos de acuerdo en cuntos a d gitos van a estar a la izquierda del punto decimal, representando a todos los nmeros reales con ese nmero de enteros. A continuacin damos una u u o potencia de 10 por la que hay que multiplicar el nmero para obtener el u nmero que deseamos. u Una abreviatura de esta notacin consiste en escribir los dos nmeros anteo u riores de la siguiente forma: 1.32456E6 1324560 1.32456E 6 .00000132456 1.32456E3 1324.56

1.5 La arquitectura de von Neumann

26

Esta representacin es much o simo ms verstil que la de punto jo, y de a a hecho es la que se usa generalmente, aunque la representacin de los nmeo u ros es en binario. Si damos mucho espacio para los exponentes tenemos la posibilidad de representar nmeros muy grandes o muy pequeos (con el u n exponente negativo). Si en cambio le damos mucho espacio a la mantisa, vamos a tener nmeros con mucha precisin (muchas cifras signicativas). u o Es conveniente encontrar un balance entre la magnitud y la precisin. Por o ejemplo, la IEEE tiene sus estndares. a Las operaciones con este tipo de nmeros son un poco ms complejas que con u a punto jo. Por ejemplo, si deseamos sumar dos nmeros tenemos primero u que llevarlos a que tengan el mismo exponente, y una vez hecho esto se puede llevar a cabo la suma. En cambio, multiplicar dos nmeros es sumamente u fcil. Por qu? a e Al igual que en los nmeros enteros, adems de lo que nos proporcione el u a hardware de la computadora como tamao de palabra, por software se pueden n usar tantas palabras como uno quiera para representar a un entero o a un real. Cada lenguaje de programacin proporciona un conjunto de enteros y reales de o diversos tamaos. n La inmensa mayor de las computadoras utilizan complemento a 2 y reprea sentacin de punto otante para representar nmeros. o u

Limitaciones en la representacin interna oVimos ya que en la computadora no podemos representar a todos y cualquier entero: tenemos un nmero nito de enteros distintos que podemos representar, u no importa que tan grande sea la palabra de una computadora dada, ya que tenemos un nmero nito de combinaciones de posiciones con 0 y posiciones con u 1 en cualquier tamao dado de palabra. n Algo similar ocurre con los nmeros reales. No slo no tenemos la posibilidad u o de representar a un nmero innito de nmeros reales, sino que adems tampoco u u a tenemos la posibilidad de representar la densidad de los nmeros reales. Como u estamos usando binario para representar a nmeros que manejamos y pensamou s como nmeros en base 10, habr nmeros que no tengan un representacin u a u o exacta al convertirlos a base 2 (por supuesto que estamos hablando de nmeu ros fraccionarios). Adicionalmente, al agregarle 1 a una mantisa, no obtenemos el siguiente nmero real, ya que estamos sumando, posiblemente, en la parte u fraccionaria. Por ello no es posible tener una representacin para todos y cada uno o

27

Introduccin o

de los nmeros reales en un intervalo dado: nuevamente, la cantidad de nmeros u u reales en un intervalo dado es un nmero innito (en realidad, ms grande que u a innito, 0 ) y lo que tenemos es un nmero nito de combinaciones. u

1.6 Ejecucin de programas oMencionamos que lo unico que puede ejecutar una computadora, directamente en su hardware, es un programa escrito en su lenguaje de mquina. Por lo que a para que nuestros programas escritos en Java puedan ser ejecutados, debern ser a transformados a lenguaje de mquina. a Recuerdan lo que hac amos para obtener un programa escrito en lenguaje de mquina a partir de uno escrito en ensamblador? Se lo dbamos como datos a un a a programa que traduc de enunciados en ensamblador a enunciados en lenguaje a de mquina. Algo similar hacemos cuando estamos trabajando en un lenguaje de a alto nivel. En general, tenemos dos maneras de conseguir ejecutar un programa escrito en un lenguaje de alto nivel. La primera de ellas es mediante un intrprete y la e segunda mediante un compilador. Veamos qu queremos decir con cada uno de e estos trminos. e

Denicin 1.7 Un intrprete es un programa que una vez cargado en la memoria de una o ecomputadora, y al ejecutarse, procede como sigue: Toma un enunciado del programa en lenguaje de alto nivel, llamado el cdigo o fuente. Traduce ese enunciado y lo ejecuta. Repite estas dos acciones hasta que alguna instruccin le indique que pare, o o bien tenga un error fatal en la ejecucin. o

Denicin 1.8 Un compilador es un programa que una vez que reside en memoria y oal ejecutarse, toma un programa fuente y lo traduce completo a un programa equivalente en otro lenguaje de programacin, que generalmente es lenguaje de o mquina. a Mientras que un intrprete va traduciendo y ejecutando, el compilador no e se encarga de ejecutar, sino simplemente de producir un programa equivalente, susceptible de ser cargado a la memoria de la mquina y ser ejecutado en un a momento posterior. A los intrpretes se les conoce tambin como mquinas virtuales, porque una e e a

1.6 Ejecucin de programas o

28

vez que estn cargados en una mquina se comportan como si fueran otra compua a tadora, aquella cuyo lenguaje de mquina es el que se est traduciendo y ejecua a tando.

1.6.1.

Filosof de programacin as oDependiendo del tipo de problema que queramos resolver numrico, admie nistrativo, de propsito general, inteligencia articial, lgico tenemos distintos o o lenguajes de programacin que permiten representar de mejor manera los formao tos de los datos y los recursos que requerimos para resolver el problema. As , para procesos numricos se requieren bibliotecas muy extensas con funciones mae temticas, un manejo sencillo de matrices y, en general, de espacios de varias a dimensiones, etc. El lenguaje que fue diseado para este tipo de problemas fue n FORTRAN y recientemente se usa C. Si lo que queremos es resolver problemas administrativos tenemos a COBOL, que se rehsa a morir, o VisualBasic que u provee una fabricacin rpida de interfaces con el usuario3 . Como representantes o a de lenguajes de propsito general tenemos Pascal, C, Algol. Para problemas que o involucran cambios de estado en los datos, o situaciones que suceden no forzosamente una despus de la otra se cuenta con lenguajes orientados a objetos como e C++, SmallTalk y Java. Para resolver problemas que involucran manejo simblico o de datos, como lo que se requiere para Inteligencia Articial, se tienen lenguajes como LISP y Scheme. Para problemas de tipo lgico se tiene ProLog. Tenemos o tambin lenguajes que se utilizan para trabajar en el Web y que se conocen coe mo de desarrollo acelerado, como Python y Ruby. En n, casi cualquier tipo de aplicacin que se nos ocurra, se puede disear un lenguaje de programacin para o n o el cul el lenguaje que se utilice en el algoritmo sea muy cercano al lenguaje de a programacin: ste es el objetivo que se persigue cuando se disean nuevos lenguao e n jes de programacin. Este curso se enfocar a resolver problemas que se expresan o a fcilmente con orientacin a objetos, y el lenguaje que utilizaremos es Java. a o Es importante darse cuenta que cualquier problema se puede resolver utilizando cualquier lenguaje: nalmente, todo programa tiene que traducirse a lenguaje de mquina, por lo que no importa en qu lenguaje hayamos programado, termia e naremos con un programa equivalente escrito en lenguaje de mquina. El meollo a del asunto es, simplemente, qu tanto trabajo nos cuesta pensar en el problema e de un cierto tipo cuando lo queremos resolver en un lenguaje pensado para resolver otro tipo distinto de problemas. Buscamos que el lenguaje de programacin oUna interfaz con el usuario es aquel programa que permite una comunicacin mejor entre o el usuario y el programa en la computadora. Se usa para referirse a las interfaces grcas. a3

29

Introduccin o

se ajuste de manera sencilla a nuestro modo de pensar respecto al problema que deseamos resolver.

1.7 Caracter sticas de JavaJava es un lenguaje orientado a objetos, cuyo principal objetivo de diseo es su n portabilidad, esto es que sin cambios sed pueda ejecutar en cualquier computadora. Otro objetivo de Java fue su uso remoto en la red. Una manera de hacer programas escritos en Java es mediante el siguiente truco: Se traduce el programa escrito en Java a un lenguaje de bajo nivel, tipo lenguaje de mquina, pero que no sea el de una mquina en espec a a co. Se construye (programa) un intrprete de este lenguaje de mquina, coe a nocido como una mquina virtual, y se ejecuta el programa en lenguaje de a mquina en la mquina virtual de Java. a a Esto resulta relativamente sencillo. El lenguaje de mquina de Java se llama a bytecode. Es ms fcil construir una mquina virtual que entienda el bytecode que a a a construir un compilador para cada posible lenguaje de mquina. Adems, una vez a a que est denida la mquina virtual, se le pueden agregar capacidades al lenguaje a a simplemente dando su transformacin a bytecode. o Por todo esto, para ejecutar un programa escrito en Java necesitamos: a. Tener un compilador de Java que traduzca de programas escritos en Java a bytecode (javac). b. Tener un intrprete de bytecode (o mquina virtual de Java) a la que se le da e a como datos el programa en bytecode y los datos pertinentes al programa.

Ejercicios1.1.- De entre los conceptos vistos, cul es el que consideras ms relevante para: a a (a) La construccin de la computadora digital. o (b) El diseo e implementacin de lenguajes de programacin. n o o

1. Ejercicios (c) La automatizacin de procesos que manejan informacin. o o

30

1.2.- En las siguientes dos columnas, relaciona una columna con otra. Cada entidad en la primer columna puede estar relacionada con ms de una entidad a en la segunda columna y viceversa. ciencias de la computacin o tecnolog de la informacin as o informtica a algoritmo Hollerith Shannon Turing Gdel o Pascal Mauchly von Neumann entrada denicin o ejecucin o sistema binario automatizacin o logaritmos algebra binario octal programa almacenado eciencia registro unitario

1.3.- Cul o cules son las diferencias entre un algoritmo y un procedimiento? a a 1.4.- Cul de las caracter a sticas de un algoritmo consideras ms importante para a poder ejecutarlo? Justica. 1.5.- Cules son las ventajas y desventajas de un sistema binario frente a un a sistema numrico decimal? e 1.6.- Transforma de base 10 a base 7 las siguientes cantidades: (a) 439210 (b) 342710 (a) 56318 (b) 3578 (a) 286110 (b) 3445710 (a) 4A5C16 (b) 499916 (c) 33610 (d) 25710 (c) 43748 (d) 76548 (c) 36310 (d) 275210 (c) 3A16 (d) F F F16

1.7.- Transforma de base 8 a base 10 las siguientes cantidades:

1.8.- Transforma las siguientes cantidades de base 10 a base 16:

1.9.- Transforma las siguientes cantidades de base 16 a base 10:

31 1.10.- Pasa de hexadecimal a binario las siguientes cantidades: (c) 33316 (a) A35C16 (d) F F F16 (b) 49F 916 1.11.- Pasa de hexadecimal a octal las siguientes cantidades: (c) 3F 316 (a) A4C516 (d) 88816 (b) 944416

Introduccin o

1.12.- Qu ser ms tardado de ejecutar, un programa compilado o uno intere a a pretado? 1.13.- Supongamos que tenemos una representacin de enteros de signo y magnio tud que ocupa 16 bits. (a) Cul es el menor nmero entero que se puede representar? a u (b) Cul es el mayor nmero entero que se puede representar? a u 1.14.- Supongamos que tenemos una representacin de enteros de complemento a o 2 que ocupa 16 bits. (a) Cul es el menor nmero entero que se puede representar? a u (b) Cul es el mayor nmero entero que se puede representar? a u 1.15.- Supongamos que tenemos nmeros reales de punto otante con un expou nente en complemento a 2 con 8 bits y una mantisa en complemento a 2 con 24 bits. (a) Cul es la precisin, en decimal, que tienen los reales con esta reprea o sentacin? o (b) Cul es la mxima magnitud (en decimal) de un real con esta reprea a sentacin? o (c) Cuntos posibles nmeros reales distintos podemos representar de esta a u manera? 1.16.- Es la arquitectura de von Neumann relevante para las computadoras multicore?

El proceso del software2.1 Qu es la programacin? e o

2

Como ya platicamos al hablar de lenguajes de programacin, la programao cin consiste en elaborar un algoritmo, escrito en un lenguaje susceptible de ser o ejecutado por una computadora, para resolver una clase de problemas. Podemos pensar en un algoritmo como la denicin de una funcin. Una vez o o denida sta, se procede a aplicar la funcin a distintos conjuntos de argumentos e o (datos) para obtener el resultado. El proceso que nos lleva nalmente a aplicar un programa a datos determinados conlleva varias etapas, algunas de ellas repetitivas. En el estado inicial de este proceso tendremos un enunciado del problema que deseamos resolver, junto con la forma que van a tomar los datos (cuntos datos, de qu tipo). En el estado a e nal deberemos contar con un programa correcto que se puede instalar en una computadora para ser ejecutado con cualquier conjunto de datos que cumpla las especicaciones planteadas. Por ello deberemos observar los siguientes pasos (ver gura 2.1 en la siguiente pgina para el proceso del Software1 ): aEl diagrama que presentamos es lo que corresponde a un proceso de software en cascada, ya que se regresa una y otra vez a etapas anteriores, hasta que se pueda llegar al nal del diagrama.1

2.1 Qu es la programacin? e o

34

Figura 2.1

Proceso del softwareEspecicacin o

Anlisis y diseo a n

Implementacin o

Validacin o

Mantenimiento

Renamiento y extensin o

Especicacin del problema: Se nos presenta el enunciado del problema y deo bemos determinar de manera precisa las especicaciones: de dnde partimos o (con qu entradas contamos) y a dnde queremos llegar (cul es el resultae o a do que deseamos obtener). Como producto de esta etapa producimos tres incisos: a. Enunciado preciso del problema. b. Entradas. c. Salidas.

35

El proceso del software

Anlisis y dise o del algoritmo: Planteamos la manera en que vamos a transa n formar los datos de entrada para obtener el resultado que buscamos y procedemos a elaborar un modelo de la solucin. Muchas veces este modelo o involucra varios pasos intermedios (estados de los datos) o, ms que un rea sultado concreto, buscamos un cierto comportamiento, como en el caso de un juego o una simulacin como la de un reloj. En estos ultimos casos deo beremos pensar en procesos sucesivos que nos lleven de un estado de cosas (estado de los datos) al estado inmediato sucesor fotos instantneas y cul a a o cules son las transformaciones de los datos que nos producen el siguiente a estado. Dependiendo del ambiente (dominio) de nuestro problema, las soluciones que diseemos debern tener distintas caracter n a sticas. La primera regla, que comparten todos los dominios es: a) La solucin debe ser correcta, eciente y efectiva. o Es claro que toda solucin debe ser correcta, esto es, resolver el problema. o Una solucin es eciente si usa una cantidad razonable de recursos y se o ejecuta en un tiempo razonable. Respecto a esta caracter stica, la unica excepcin posible a esta regla se presenta si estamos haciendo un programa o para ayudarnos a calcular algo o para sacarnos de un brete momentneo o a coyuntural, el programa se va a utilizar pocas veces en un lapso corto de tiempo; tal vez hasta podemos eliminar la caracter stica de que sea eciente. En los primeros aos de las computadoras, casi todos los programas eran n de este tipo: la gente los hac para s mismos, o para un grupo reducido a que estaba muy al tanto de lo que estaba pasando. Que un programa sea efectivo quiere decir que el programa termina. Hoy en d en que las computadoras estn en todo, la mayor de la gente a, a a involucrada haciendo programas los hace para otros. Adems, el tamao a n de los sistemas ha crecido tanto que ya casi nadie es el dueo de sus n programas, sino que se trabaja en el contexto de proyectos grandes, con mucha gente involucrada. En este tipo de situaciones, que hoy en d son a ms la regla que la excepcin, se requiere adems que los programas: a o a b) Sean modulares. Se puedan trazar claramente las fronteras entre pedazos del programa (o sistema) que atacan un cierto subproblema, para que la tarea se pueda repartir. c) Tengan un bajo nivel de acoplamiento. Esta propiedad se reere a que utilicen lo menos posible del mundo exterior y entreguen lo m nimo po-

2.1 Qu es la programacin? e o

36

sible: que haya poco trco entre los mdulos, de tal manera que haya la a o posibilidad de reutilizarlos. d) Alta cohesin, que se reere al hecho de que todo lo que est relacionado o e (funciones, datos) se encuentren juntos, para que sean fciles de localizar, a entender y modicar. Implementacin o construccin del modelo: En esta etapa deberemos trao o ducir nuestro algoritmo al lenguaje de programacin que hayamos elegido. o A esta etapa se le conoce tambin como de codicacin. Esta no es una labor e o muy dif si es que tenemos un diseo que siga la losof 2 del lenguaje de cil, n a programacin. o Durante las etapas de diseo e implementacin se debe asegurar la don o cumentacin del programa, que algunas veces aparece como una etapa o del proceso. Sin embargo, esto no es o no deber ser una etapa separada a del proceso, ya que lo ideal es que conforme se va progresando se vaya documentando el programa (o en su caso el diseo). Hoy en d existen muchos n a paquetes que ayudan a llevar a cabo el diseo y que apoyan la elaboracin de n o la documentacin, por lo que actualmente es imperdonable que falte docuo mentacin en los programas. En el presente, en que los programas se hacen o en un 90 % de los casos para otros, es muy importante que el programa lo pueda entender cualquier lector humano; esto se logra, la mayor de las a 3 veces, mediante la documentacin . o Prueba y validacin: Debemos tener la seguridad de que nuestro programa hao ce lo que se supone debe hacer. Para esto hay pruebas informales, que consisten en presentarle al programa distintos conjuntos de datos y vericar que el programa hace lo que tiene que hacer. Estas pruebas deben incluir conjuntos de datos errneos, para vericar que el programa sabe defenderse o en situaciones anmalas. Tambin existen mdulos espec o e o cos en ciertos lenguajes de programacin, como JUnit de Java, que permite elaborar pruebas o unitarias para nuestro cdigo. o La validacin de los programas conlleva demostraciones matemticas de que o a los enunciados cambian el estado de los datos de la manera que se busca.Con esto nos referimos a la manera como el lenguaje de programacin interpreta el mundo: o por procedimientos, orientado a objetos, funcional, lgico. A esto le llamamos paradigmas de o programacin. o 3 En el contexto de aprender a programar la documentacin es muy importante para el que va o a calicar el programa y para el que est aprendiendo, ya que le permite recuperar el contexto a en el que resolvi algo de cierta manera. o2

37

El proceso del software

Mantenimiento: La actividad que mayor costo representa hoy en d es la del a mantenimiento de los sistemas. Tenemos dos tipos de mantenimiento: correctivo y extensivo. El correctivo tiene que ver con situaciones que el programa o sistema no est resolviendo de manera adecuada. El mantenimiento extena sivo tiene que ver con extender las capacidades del programa o sistema para que enfrente conjuntos nuevos de datos o entregue resultados adicionales. Sin una documentacin adecuada, estas labores no se pueden llevar a cabo. o Sin un diseo correcto, es prcticamente imposible extender un sistema. n a Renamiento y extensin: Esta etapa generalmente la llevan a cabo personas o distintas a las que disearon el sistema. Se busca que cuando se extiende un n sistema no se tape un hoyo haciendo otro. La modularidad ayuda, pues se entiende mejor el funcionamiento del programa si se ataca por mdulos. Peo ro esta propiedad debe tener, adems, la propiedad de encapsulamiento, que a consiste en que cada mdulo tiene perfectamente delimitado su campo de o accin, la comunicacin entre mdulos es muy controlada y una implemeno o o tacin interna (modo de funcionar) que pueda ser cambiada sin que altere o su comportamiento y sin que haya que cambiar nada ms. a Estas etapas, como ya mencionamos en algunas de ellas, no se presentan forzosamente en ese orden. Ms an, muchas veces se da por terminada una de ellas, a u pero al proceder a la siguiente surgen problemas que obligan a regresar a etapas anteriores a modicar el producto o, de plano, rehacerlo. Queremos insistir en la importancia de tener un buen anlisis y un buen diseo, no importa cunto a n a tiempo nos lleve: sta es la llave para que en etapas posteriores no tengamos que e regresar a rehacer, o nos veamos en la necesidad de tirar trabajo ya hecho. Pasemos a detallar un poco ms algunas de las etapas de las que hablamos. a

Especicacin oUna buena especicacin, sea formal o no, hace hincapi, antes que nada, o e en cul es el resultado que se desea obtener. Este resultado puede tomar muy a distintas formas. Digamos que el cmputo corresponde a un modelo de un sistema o (la instrumentacin o implementacin del modelo). o o Podemos entonces hablar de los estados por los que pasa ese sistema, donde un estado corresponde a los valores posibles que toman las variables. Por ejemplo, si tenemos las variables x, y, z, que participan en un determinado clculo, un posible a estado ser a: t x 5, y 7, z 9 u Si tenemos la especicacin de un programa (rutina) que intercambie los valores o

2.1 Qu es la programacin? e o de dos variables x, y, podemos pensarlo as :

38

t t

x K1 , x K2 ,

y

K2 K1

u u

es el estado inicial (con los valores que empieza el proceso), mientras que y

corresponde al estado nal deseado. Podemos adelantar que una manera de lograr que nuestro modelo pase del estado inicial al estado nal es si a x le damos el valor de K2 (el valor que tiene y al empezar) y a y le damos el valor que ten x. a Podemos representar este proceso de la siguiente manera:

t x K1 , t x K2 ,A x ponerle K2 A y ponerle K1

y

K2 u K1 u

y

// estado inicial // Proceso // Proceso // estado nal

y podemos garantizar que nuestras operaciones cumplen con llevar al modelo al estado nal. Sin embargo, las operaciones que estamos llevando a cabo estn cona siderando a K1 y K2 valores constantes. Un proceso ms general ser el siguiente: a a

t x K1

// estado inicial En t copia el valor que tiene x // Proceso En x copia el valor que tiene y // Proceso t x K2 , y K2 , t K1 u estado intermedio // En estos momentos x e y valen lo mismo! En y copia el valor de t // Proceso t x K 2 , y K1 u // estado nal y

K2 u

y este proceso funciona no importando qu valores iniciales dimos para x e y. e Resumiendo, un estado de un proceso, cmputo o modelo es una lista de vao riables, cada una de ellas con un cierto valor. Una especicacin de un problema es la descripcin del problema, que como o o m nimo debe tener el estado nal del cmputo. El estado inicial puede ser jado o a partir del estado nal (determinando qu se requiere para poder alcanzar ese e estado), o bien puede darse tambin como parte de la especicacin. e o

Anlisis y diseo a nPodemos decir, sin temor a equivocarnos, que la etapa de diseo es la ms n a importante del proceso. Si sta se lleva a cabo adecuadamente, las otras etapas e

39

El proceso del software

se simplican notoriamente. La parte dif en la elaboracin de un programa cil o de computadora es el anlisis del problema (denir exactamente qu se desea) y a e el diseo de la solucin (plantear cmo vamos a obtener lo que deseamos). Para n o o esta actividad se requiere de creatividad, inteligencia y paciencia. La experiencia juega un papel muy importante en el anlisis y diseo. Dado que la experiencia a n se debe adquirir, es conveniente contar con una metodolog que nos permita ir a construyendo esa experiencia. As como hay diversidad en los seres humanos, as hay maneras distintas de analizar y resolver un problema. En esa bsqueda por automatizar o matematiu zar el proceso de razonamiento, se buscan mtodos o metodolog que nos lleven e as desde la especicacin de un problema hasta su mantenimiento, de la mejor mao nera posible. El principio fundamental que se sigue para analizar y disear una n solucin es el de divide y vencers, reconociendo que si un problema resulta deo a masiado complejo para que lo ataquemos, debemos partirlo en varios problemas de menor magnitud. Podemos reconocer tres vertientes importantes en cuanto a las maneras de dividir el problema: a) Programacin o anlisis estructurado, que impulsa la descomposicin del proo a o blema en trminos de acciones, convergiendo todas ellas en un conjunto de e datos, presentes todo el tiempo. La divisin se hace en trminos del proceso, o e reconociendo distintas etapas en el mismo. Dado que el nfasis es en el proceso, e cada mdulo del sistema corresponde a un paso o etapa del proceso. Cuando o usamos este enfoque perdemos la posibilidad de encapsular, pues los datos se encuentran disponibles para todo mundo, y cada quien pasa y les mete mano. Adems, hay problemas que son dif a ciles de analizar en trminos de etapas. e Por ejemplo, los juegos de computadora estilo aventura, las simulaciones de sistemas biolgicos, el sistema de control de un dispositivo qu o mico, un sistema operativo. Sin embargo, esta metodolog es muy adecuada para disear, como a n lo acabamos de mencionar, un cierto proceso que se lleva a cabo de manera secuencial. b) Anlisis y diseo orientado a objetos. El anlisis orientado a objetos pretende a n a otro enfoque, partiendo al problema de acuerdo a los objetos presentes. Determina cules son las responsabilidades de cada objeto y qu le toca hacer a a e cada quin. e c) Diseo funcional, que involucra generalmente recursin, y que denota el diseo n o n como la aplicacin sucesiva de funciones a los datos de entrada hasta obtener o el resultado nal.

2.1 Qu es la programacin? e o

40

Implementacin del modelo oPara la programacin, como ya mencionamos, utilizaremos Java y aprovechao remos la herramienta JavaDoc para que la documentacin se vaya haciendo, como o es deseable, durante la codicacin. o

MantenimientoPorque se trata de un curso, no nos veremos expuestos a darle mantenimiento a nuestros programas, excepto cuando detecten que algo no funciona bien. En las sesiones de laboratorio, sin embargo, tendrn que trabajar con programas ya a hechos y extenderlos, lo que tiene que ver con el mantenimiento. Tambin es la e losof de este material empezar con una aplicacin bsica e irla extendiendo en a o a poder y sosticacin. o o

2.1.1.

Conceptos en la orientacin a objetos oAl hacer el anlisis de nuestro problema, como ya mencionamos, trataremos a de dividir la solucin en tantas partes como sea posible, de tal manera que cada o parte sea fcil de entender y disear. La manera de dividir el problema ser en a n a trminos de actores y sus respectivas responsabilidades (o facultades): qu puede e e y debe hacer cada actor para contribuir a la solucin. Cada uno de estos actores o corresponde a un objeto. Agrupamos y abstraemos a los objetos presentes en clases. Cada clase cumple con: Tiene ciertas caracter sticas. Funciona de determinada manera. Quedan agrupados en una misma clase aquellos objetos que presentan las mismas caracter sticas y funcionan de la misma manera. En el diseo orientado a objetos, entonces, lo primero que tenemos que hacer n es clasicar nuestro problema: encontrar las distintas clases involucradas en el mismo. Las clases nos proporcionan un patrn de conocimiento qu es lo que debe o e saber , conocer, recordar cada objeto de la clase y un patrn de comportamiento: o nos dicen qu y cmo se puede hacer con los datos de la clase. Es como el guin e o o de una obra de teatro, ya que la obra no se nos presenta hasta en tanto no haya actores. Los actores son los objetos, que son ejemplares o instancias 4 de las clases (representantes de las clases).4

instancia es una traduccin literal que no existe en espaol. o n

41

El proceso del software

Al analizar un problema debemos tratar de identicar a los objetos involucrados. Una vez que tengamos una lista de los objetos (agrupando datos que tienen propsitos similares, por ejemplo), debemos abstraer, encontrando caracter o sticas comunes, para denir las clases que requerimos. Distinguimos a un objeto de otro de la misma clase por su nombre identidad o identicador . Nos interesa de un objeto dado: i. Su estado: cul es el valor de sus atributos. a ii. Su conducta: Qu cosas sabe hacer. e Cmo va a reaccionar cuando se le hagan solicitudes. o El nmero y tipo de atributos (variables) con que cuenta un objeto est deteru a minado por la denicin de la clase a la que pertenece, aunque el estado est deo a terminado por cada objeto, ya que cada objeto es capaz de almacenar su propia informacin. Lo correspondiente a (ii) est dado por la denicin de la clase, que o a o nos da un patrn de conducta. o Tratando de aclarar un poco, pensemos en lo que se conoce como sistema cliente/servidor. Cliente es aqul que pide, compra, solicita algo: un servicio, un e valor, un trabajo. Servidor es aqul que provee lo que se le est pidiendo. Esta e a relacin de cliente/servidor, sin embargo, no es esttica. El servidor puede tomar o a el papel de cliente y viceversa. Lo que le interesa al cliente es que el servidor le proporcione aquello que el cliente est pidiendo. No le importa cmo se las arregla el servidor para hacerlo. a o Si el cliente le pide al servidor algo que el servidor no sabe hacer, que no reconoce, simplemente lo ignora, o le contesta que eso no lo sabe hacer. El anlisis orientado a objetos pretende reconocer a los posibles clientes y servia dores del modelo, y las responsabilidades de cada quien. Divide la responsabilidad global del proceso entre distintos objetos. Un concepto muy importante en la orientacin a objetos es el encapsulamiento o de la informacin. Esto quiere decir que cada objeto es dueo de sus datos y sus o n funciones, y puede o no permitir que objetos de otras clases ajenas vean o utilicen sus recursos. Un objeto entonces tiene la propiedad de que encapsula tanto a los procesos (funciones) como a los datos. Esto es, conoce cierta informacin y sabe cmo llevar o o a cabo determinadas operaciones. La ventaja del encapsulamiento es que en el momento de disear nos va a permitir trazar una l n nea alrededor de operaciones y datos relacionados y tratarlos como una cpsula, sin preocuparnos en ese momento a de cmo funciona, sino unicamente de qu es capaz de hacer. o e

2.1 Qu es la programacin? e o

42

En el caso de los objetos, la cpsula alrededor del mismo oculta al exterior la a manera en que el objeto trabaja, el cmo. Cada objeto tiene una interfaz pblica o u y una representacin privada. Esto nos permite hacer abstracciones ms fcil y o a a elaborar modelos ms sencillos, pues lo que tomamos en cuenta del objeto es a exclusivamente su interfaz; posponemos la preocupacin por su representacin o o privada y por el cmo. o Pblicamente un objeto anuncia sus habilidades: puedo hacer estas cosas, u puedo decir estas cosas; pero no dice cmo es que las puede hacer o cmo es que o o sabe las cosas. Los objetos actan como un buen jefe cuando le solicitan a otro u objeto que haga algo: simplemente le hacen la solicitud y lo dejan en paz para que haga lo que tiene que hacer; no se queda ah mirando sobre su hombro mientras lo hace. El encapsulamiento y el ocultamiento de la informacin colaboran para aislar o a una parte del sistema de otras, permitiendo de esta manera la modicacin y o extensin del mismo sin el riesgo de introducir efectos colaterales no deseados. o Para determinar cules son los objetos presentes en un sistema, se procede de la a siguiente manera: 1. Se determina cules funcionalidades e informacin estn relacionadas y dea o a ben permanecer juntas, y se encapsulan en una clase. 2. Entonces se decide cules funcionalidades e informacin se le van a solicitar a a o representantes de esta clase (qu servicios va a prestar). Estos se mantienen e pblicos, mientras que el resto se esconde en el interior de los objetos de esa u clase. Esto se logra mediante reglas de acceso, que pueden ser de alguno de los tipos que siguen: P blico: Se permite el acceso a objetos de cualquier otra clase. u Privado: Slo se permite el acceso a objetos de la misma clase. o En algunos lenguajes de programacin se permiten otros tipos de acceso. Por o ejemplo, en Java tambin tenemos los siguientes, pero que no pretendemos dejar e claros por el momento: Paquete: Se permite el acceso a objetos que estn agrupados en el mismo paquete a (generalmente un sistema o aplicacin). o Protegido: Se permite el acceso a objetos de clases que hereden de esta clase. Veamos la terminolog involucrada en el diseo orientado a objetos: a n

43

El proceso del software

AtributosAlgunos sistemas o lenguajes orientados a objetos llaman a stos variables e propias, variables miembro o variables de estado. Se reeren a los valores que debe recordar cada objeto y que describe el estado del objeto. Cada objeto puede tener un valor distinto en cada uno de estos atributos. Como uno de sus nombres indica (variables de estado), conforman el estado del objeto, que puede cambiar durante la ejecucin de la aplicacin. o o

Mensajes (messages)Un objeto le pide un servicio a otro mandndole un mensaje. A esta accin le a o llamamos el env de un mensaje y es la unica manera en que un objeto se puede o comunicar con otro. Un mensaje consiste del nombre de una operacin y los argumentos que la o operacin requiere. La solicitud no especica cmo debe ser satisfecha. o o

Comportamiento o conducta (behaviour )El conjunto de mensajes a los que un objeto puede responder es lo que se conoce como la conducta o el comportamiento del objeto. Al nombre de la operacin en el mensaje le llamamos el nombre del mensaje. o

Mtodos (methods) eCuando un objeto recibe un mensaje, ejecuta la operacin que se le solicita o mediante la ejecucin de un mtodo. Un mtodo es un algoritmo paso a paso o e e que se ejecuta como respuesta a un mensaje cuyo nombre es el mismo que el del mtodo. Para que un mtodo pueda ser invocado desde un objeto de otra clase, e e debe ser pblico. En el caso de algunos lenguajes de programacin, a los mtou o e dos se les llama funciones miembro (member functions), porque son funciones (procedimientos) que estn denidos en, son miembros de, la clase. a

2.1 Qu es la programacin? e o

44

Clases (classes)Si dos objetos presentan el mismo comportamiento, decimos que pertenecen a la misma clase. Una clase es una especicacin genrica para un nmero arbitrario o e u de objetos similares. Las clases permiten construir una taxonom de los objetos a en un nivel abstracto, conceptual. Nos permiten describir a un grupo de objetos. Por ejemplo, cuando describimos a los seres humanos damos las caracter sticas que les son comunes. Cada ser humano es un objeto que pertenece a esa clase. Hay que insistir en que las clases corresponden unicamente a descripciones de objetos, no tienen existencia en s mismas.

Ejemplares (instances)Las instancias corresponden, de alguna manera, a los ejemplares que podemos exhibir de una clase dada. Por ejemplo, describimos a los seres humanos y decimos que Fulanito es un ejemplar de la clase de seres humanos: existe, tiene vida propia, le podemos pedir a Fulanito que haga cosas. Fulanito es un objeto de la clase de seres humanos. Fulanito es el nombre (identicador, identidad) del ejemplar u objeto. Su comportamiento es el descrito por los mtodos de su clase. e Est en un cierto estado, donde el estado es el conjunto de datos (caracter a sticas) junto con valores particulares. En cambio, si hablamos de un ser humano en abstracto, de la categor que a describe a todos los seres humanos, no podremos decir cul es su altura o su color a de pelo, sino unicamente cules son los colores de pelo vlido. Tambin sabemos a a e que come, pero no podemos decir si con las manos, utilizando una cuchara o una tortilla. Un ejemplar tiene caracter sticas concretas, mientras que una clase describe todas las posibles formas que puede tomar cada una de las caracter sticas. Un mismo objeto puede pasar por distintos estados. Por ejemplo, podemos denir que las caracter sticas de un ser humano incluyen: estado de conciencia, estado de animo, posicin. Fulanito puede estar dormido o despierto, contento o o triste, parado o sentado, correspondiendo esto a cada una de las caracter sticas (o variables). Sin embargo, hay variables entre las que corresponden a un objeto que si bien cambian de un objeto a otro (de una instancia a otra), una vez denidas en el objeto particular ya no cambian, son invariantes. Por ejemplo, el color de los ojos, el gnero, la forma de la nariz5 . eNo estamos considerando, por supuesto, la posibilidad de cirug implantes o pupilentes as, que puedan cambiar el estado de un ser humano.5

45

El proceso del software

Herencia (inheritance)Es frecuente encontrar una familia de objetos (o clases) que tienen un ncleo u en comn, pero que dieren cada uno de ellos por algn atributo, una o ms u u a funciones. Cuando esto sucede debemos reconocer al ncleo original, identicando u a una clase abstracta (o sper-clase, no forzosamente abstracta) a partir de la u cual cada una de las clases de la familia son una extensin. A esta caracter o stica se le conoce como herencia: las clases en la familia de la que hablamos, heredan de la clase abstracta o clase base, remedando un arbol como el que se muestra en la gura 2.2. En esta gura las clases abstractas o base se presentan encuadradas con l neas intermitentes, mientras que las subclases se presentan encuadradas con l nea continua. A este tipo de esquema le llamamos jerarqu de clases 6 . Cuando a una clase es abstracta queremos decir que no tenemos suciente informacin para o construir objetos completos de ella. Por ejemplo, la clase Elementos geomtricos e no da suciente informacin para construir a un objeto de la misma, pues no dice o su forma precisa.

Figura 2.2

Arbol de herencia en clasesElementos geomtricos e

punto

l nea

Volumen

recta

curva Supercie

cubo

cilindro

a esfera pirmide

cuadrado6

rectngulo a

c rculo

elipse

Vale la pena notar que los niveles en el rbol no estn dibujados adecuadamente, pues clases a a en el mismo nivel jerrquico no estn alineadas en la guras. a a

2.2 Dise o orientado a objetos n

46

Polimorsmo (polymorphism)Dado que tenemos la posibilidad de agrupar a las clases por familias, queremos la posibilidad de que, dependiendo de cul de los herederos se trate, una a funcin determinada se lleve a cabo de manera personal a la clase. Por ejemplo, o si tuviramos una familia, la funcin de arreglarse se deber llevar a cabo de e o a distinta manera para la abuela que para la nieta. Pero la funcin se llama igual: o arreglarse. De la misma manera en orientacin a objetos, conforme denimos heo rencia podemos modicar el comportamiento de un cierto mtodo, para que tome e en consideracin los atributos adicionales de la clase heredera. A esto, el que el o mismo nombre de mtodo pueda tener un signicado distinto dependiendo de la e clase a la que pertenece el objeto particular que lo invoca, es a lo que se llama polimorsmo tomar varias formas.

2.1.2.

Solucin del problema oEn resumen, presentados ante un problema, estos son los pasos que debemos realizar: 1. Escribir de manera clara los requisitos y las especicaciones del problema. 2. Identicar las distintas clases que colaboran en la solucin del problema y la o relacin entre ellas; asignar a cada clase las responsabilidades correspondieno tes en cuanto a informacin y proceso (atributos y mtodos respectivameno e te); identicar las interacciones necesarias entre los objetos de las distintas clases (diseo). n 3. Codicar el diseo en un lenguaje de programacin, en este caso Java. n o 4. Compilar y depurar el programa. 5. Probarlo con distintos juegos de datos. De lo que hemos visto, la parte ms importante del proceso va a ser el anlisis a a y el diseo, as que vamos a hablar de l con ms detalle. n e a

2.2 Diseo orientado a objetos nEl diseo orientado a objetos es el proceso mediante el cual se transforman las n especicaciones (o requerimientos) de un sistema en una especicacin detallada o de objetos. Esta ultima especicacin debe incluir una descripcin completa de o o

47

El proceso del software

los papeles y responsabilidades de cada objeto y la manera en que los objetos se comunican entre s . Al principio, el proceso de diseo orientado a objetos es exploratorio. El din seador busca clases, agrupando de distintas maneras para encontrar la manera n ms natural y razonable de abstraer (modelar) el sistema. Inicialmente consiste a de los siguientes pasos: 1. Determina (encuentra) las clases en tu sistema. 2. Determina qu operaciones son responsabilidad de cada clase, y cules son e a los conocimientos que la clase debe mantener o tener presentes para poder cumplir con sus responsabilidades. 3. Determina las formas en las que los objetos colaboran con otros objetos para delegar sus responsabilidades. Estos pasos producen: una lista de clases dentro de tu aplicacin; o una descripcin del conocimiento y operaciones que son responsabilidad de o cada clase; y una descripcin de la colaboracin entre clases. o o Una vez que se tiene este esquema, conviene tratar de precisar una jerarqu a entre las clases que denimos. Esta jerarqu establece las relaciones de herencia a entre las clases. Dependiendo de la complejidad del diseo, podemos tener anidan dos varios niveles de encapsulamiento. Si nos encontramos con varias clases a las que conceptualizamos muy relacionadas, podemos hablar entonces de subsistemas. Un subsistema, desde el exterior, es visto de la misma manera que u