Introduccion a-la-programacion-python

2,150 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,150
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
76
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Introduccion a-la-programacion-python

  1. 1. Introducción a la programación con Python Andrés Marzal Isabel Gracia Departamento de lenguajes y sistemas informáticos Codis d’assignatura II04 i IG04Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 Introducción a la programación con Python - UJI
  2. 2. Introducci´n a la programaci´n o o con Python Andr´s Marzal e Isabel Gracia Departamento de Lenguajes y Sistemas Inform´ticos a Universitat Jaume IEdita: Publicacions de la Universitat Jaume I. Servei de Comunicació i Publicacions Campus del Riu Sec. Edifici Rectorat i Serveis Centrals. 12071 Castelló de la Plana http://www.tenda.uji.es e-mail: publicacions@uji.esCol·lecció Sapientia, 23www.sapientia.uji.esISBN: 978-84-692-5869-9Aquest text està subjecte a una llicència Reconeixement-NoComercial-CompartirIgual deCreative Commons, que permet copiar, distribuir i comunicar públicament l’obra sempreque especifique l’autor i el nom de la publicació i sense objectius comercials, i també per-met crear obres derivades, sempre que siguen distribuïdes amb aquesta mateixa llicència.http://creativecommons.org/licenses/by-nc-sa/2.5/es/deed.ca Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 II Introducción a la programación con Python - UJI
  3. 3. Prefacio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 III Introducción a la programación con Python - UJI
  4. 4. Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 IV Introducción a la programación con Python - UJI
  5. 5. Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 Introducción a la programación con Python - UJI
  6. 6. Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 VI Introducción a la programación con Python - UJI
  7. 7. Prefacio˂˂Introducci´n a la programaci´n con Python˃˃ e ˂˂Introducci´n a la programaci´n con C˃˃ o o o odesarrollan el temario de la asignatura ˂˂Metodolog´ y tecnolog´ de la programaci´n˃˃ de ıa ıa olas titulaciones de Ingenier´ Inform´tica e Ingenier´ T´cnica en Inform´tica de Gesti´n ıa a ıa e a ode la Universitat Jaume I. En ella se pretende ense˜ar a programar y, a diferencia de lo nque es usual en cursos introductorios a la programaci´n, se propone el aprendizaje con odos lenguajes de programaci´n: Python y C. o ¿Por qu´ dos lenguajes de programaci´n? Python y C son bien diferentes. El primero e oes un lenguaje de muy alto nivel que permite expresar algoritmos de forma casi directa(ha llegado a considerarse ˂˂pseudoc´digo ejecutable˃˃) y hemos comprobado que se trata ode un lenguaje particularmente adecuado para la ense˜anza de la programaci´n. Esta n oimpresi´n se ve corroborada por la adopci´n de Python como lenguaje introductorio en o ootras universidades. El lenguaje C exige una gran atenci´n a multitud de detalles que odificultan la implementaci´n de algoritmos a un estudiante que se enfrenta por primera ovez al desarrollo de programas. No obstante, C sigue siendo un lenguaje de programaci´n ode referencia y debe formar parte del curr´ ıculum de todo inform´tico: su proximidad al acomputador nos permite controlar con gran precisi´n el consumo de recursos computacio- onales. Aprender Python antes que C permite estudiar las estructuras de control y de datosb´sicas con un alto nivel de abstracci´n y, as´ entender mejor qu´ supone, exactamente, a o ı, ela mayor complejidad de la programaci´n en C y hasta qu´ punto es mayor el grado o ede control que nos otorga. Por ejemplo, una vez se han estudiado listas en Python, suimplementaci´n en C permite al estudiante no perder de vista el objetivo ultimo: cons- o ´truir una entidad con cierto nivel de abstracci´n usando unas herramientas concretas (los opunteros). De ese modo se evita una desafortunada confusi´n entre estructuras din´micas o ay punteros que es frecuente cuando ´stas se estudian unicamente a la luz de un lenguaje e ´como C. En cierto modo, pues, Python y C se complementan en el aprendizaje y ofrecenuna visi´n m´s rica y completa de la programaci´n. Las similitudes y diferencias entre o a oambos permiten al estudiante inferir m´s f´cilmente qu´ es fundamental y qu´ accesorio a a e eo accidental al dise˜ar programas en un lenguaje de programaci´n cualquiera. n o ¿Y por qu´ otro libro de texto introductorio a la programaci´n? Ciertamente hay muchos e olibros que ense˜an a programar desde cero. Creemos que estos dos libros de texto se ndiferencia de ellos tanto en el hecho de estudiar secuencialmente dos lenguajes como enla forma en que se exponen y desarrollan los conocimientos. Hemos procurado adoptarsiempre el punto de vista del estudiante y presentar los conceptos y estrategias paradise˜ar programas b´sicos paso a paso, incrementalmente. La experiencia docente nos ha n aido mostrando toda una serie l´ ıneas de razonamiento inapropiadas, errores y vicios enlos que caen muchos estudiantes. El texto trata de exponer, con mayor o menor fortuna,esos razonamientos, errores y vicios para que el estudiante los tenga presentes y procureevitarlos. As´ en el desarrollo de algunos programas llegamos a ofrecer versiones err´neas ı, opara, acto seguido, estudiar sus defectos y mostrar una versi´n corregida. Los apuntes oest´n repletos de cuadros que pretenden profundizar en aspectos marginales, llamar la aatenci´n sobre alg´n extremo, ofrecer algunas pinceladas de historia o, sencillamente, o udesviarse de lo sustancial con alguna digresi´n que podr´ resultar motivadora para el o ıa 1 Introducción a la programación con Python - UJI Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9
  8. 8. estudiante. Hemos de recalcar que este libro pretende ense˜ar a programar y no es un manual nexhaustivo sobre el lenguaje de programaci´n Python. Son particularmente rese˜ables o ndos omisiones: los diccionarios y las clases. No forman parte de esta edici´n (aunque oposiblemente se incluir´n en otra posterior) porque hemos preferido centrarnos en aquellos aaspectos que tanto Python como C presentan en com´n. La orientaci´n a objetos se puede u otratar a partir del material expuesto en estos vol´menes, pero hubiera resultado dif´ u ıcilincluir estos contenidos en el volumen de Python y no poder tratarlos adecuadamente enel volumen dedicado a C. Queremos aprovechar para dar un consejo a los estudiantes que no nos cansamos derepetir: es imposible aprender a programar limit´ndose a leer unos apuntes o a seguir apasivamente una explicaci´n en clase (especialmente si el per´ o ıodo de estudio se concen-tra en una o dos semanas). Programar al nivel propio de un curso introductorio no esparticularmente dif´ pero constituye una actividad intelectual radicalmente nueva para ıcil,los estudiantes. Es necesario darse una oportunidad para ir asentando los conocimien-tos y las estrategias de dise˜o de programas (y as´ superar el curso). Esa oportunidad n ı,requiere tiempo para madurar. . . y trabajo, mucho trabajo; por eso el texto ofrece m´s de acuatrocientos ochenta ejercicios. S´lo tras haberse enfrentado a buena parte de ellos se oestar´ preparado para demostrar que se ha aprendido lo necesario. a Hay centenares de diferencias entre las dos primeras ediciones (publicadas comoapuntes en la Universidad Jaume I y en formato electr´nico en Internet) y ´sta. No s´lo o e ohemos corregido erratas (y errores), hemos a˜adido tambi´n nuevos ejemplos, modificado n eotros, preparado nuevos ejercicios, reubicado ejercicios para que aparezcan en lugaresque hemos juzgado m´s apropiados, etc. Los programas se presentan con una tipograf´ a ıaque, creemos, facilita notablemente la lectura. El documento PDF ofrece, adem´s, la aposibilidad de descargar c´modamente el texto de los programas (que se pueden descargar ode http://ocw.uji.es). Esperamos que esta posibilidad se traduzca en un mayor animo ´del estudiante para experimentar con los programas.Convenios tipogr´ficos aHemos tratado de seguir una serie de convenios tipogr´ficos a lo largo del texto. Los aprogramas, por ejemplo, se muestran con fondo gris, as´ ı: 1 print ’ Hola,␣mundo!’ !Por regla general, las l´ ıneas del programa aparecen numeradas a mano izquierda. Estanumeraci´n tiene por objeto facilitar la referencia a puntos concretos del programa y no odebe reproducirse en el fichero de texto si se copia el programa. Cuando se quiere destacar el nombre del fichero en el que reside un programa, sedispone este en una barra encima del c´digo: o hola mundo.py print ’ Hola,␣mundo!’ ! 1 Si se trabaja con la versi´n electr´nica del libro en formato PDF (disponible en la o op´gina web http://ocw.uji.es) es posible acceder c´modamente al texto de los pro- a ogramas. Para ello, basta con desempaquetar el fichero programas.tgz (o programas.zip)en el mismo directorio en el que est´ ubicado el documento PDF. Los programas accesibles etienen un icono que representa un documento escrito en la esquina superior izquierda.Junto al icono aparece el nombre real del fichero: como ofrecemos varias versiones de unmismo programa, nos hemos visto obligados a seguir un esquema de numeraci´n que modi- ofica el propio nombre del fichero. La primera versi´n de un fichero llamado hola mundo.py oes hola mundo 1.py, la segunda hola mundo 2.py, y as´ sucesivamente. ıIntroducci´n Marzal/Isabel Gracia -Python 978-84-692-5869-9 Andrés a la programaci´n con ISBN: o o 2 Introducción a la programación con Python - c UJI UJI
  9. 9. hola mundo 1.py hola mundo.py 1 print ’ Hola,’, ’mundo!’ !Si, aunque haya varias versiones, no aparece un n´mero al final del nombre del fichero udescargable, se entiende que esa es la versi´n definitiva. o hola mundo.py hola mundo.py 1 print ’ Hola,␣mundo!’ !Al pinchar en el icono, se abre un fichero de texto con el navegador web o editor de textosque se indique en las preferencias del visualizador de documentos PDF. Cuando el programa contiene alg´n error grave, aparecen un par de rayos flanqueando ual nombre del programa: E hola mundo.py E rint ’ Hola,␣mundo!’ ! 1Algunos programas no est´n completos y, por ello, presentan alguna deficiencia. No aobstante, hemos optado por no marcarlos como err´neos cuando ´stos evolucionaban en o eel curso de la exposici´n. o La informaci´n que se muestra por pantalla aparece siempre recuadrada. El resultado ode ejecutar hola mundo.py se mostrar´ as´ a ı:! Hola, mundo! En ocasiones mostraremos las ´rdenes que deben ejecutarse en un int´rprete de o eo´rdenes Unix. El prompt del int´rprete se representar´ con un s´ e a ımbolo de d´lar: o ↱$ python hola_mundo.py!Hola, mundo!La parte que debe teclear el usuario o el programador se muestra siempre con un fondogris. El retorno de carro se representa expl´ıcitamente con el s´ ımbolo . ↱ Las sesiones interactivas del int´rprete de Python tambi´n se muestran recuadradas. e eEl prompt primario del int´rprete Python se muestra con los caracteres ˂˂˃˃ y el esecundario con ˂˂...˃˃. Las expresiones y sentencias que teclea el programador se destacancon fondo gris. ↱ ’Hola,’ + ’␣’ + ’mundo!’ !’ Hola, mundo!’ ↱ if ’Hola’ == ’mundo’: ↱... print ’si’ ↱... else: ↱... print ’no’ ↱...noAgradecimientosEste texto es fruto de la experiencia docente de todo el profesorado de las asignaturas de˂˂Metodolog´ y tecnolog´ de la programaci´n˃˃ y se ha enriquecido con las aportaciones, ıa ıa ocomentarios y correcciones de muchos profesores del departamento de Lenguajes y Sis-temas Inform´ticos de la Universitat Jaume I de Castell´: Juan Pablo Aibar Ausina, Rafael a oBerlanga Llavor´ Antonio Castellanos L´pez, Pedro Garc´ Sevilla, Mar´ Dolores Llid´ ı, o ıa ıa oEscriv´, David Llorens Pi˜ana, Jos´ Luis Llopis Borr´s, Juan Miguel Vilar Torres, V´ a n e a ıctorManuel Jim´nez Pelayo y Ram´n Mollineda C´rdenas. Para todos ellos, nuestro agrade- e o acimiento. El agradecimiento a David Llorens Pi˜ana es doble por desarrollar, adem´s, el n aIntroducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 Andrés a la programaci´n con ISBN: o o 3 Introducción a la programación con Python - UJI c UJI
  10. 10. entorno de programaci´n PythonG. Finalmente, agradecemos la colaboraci´n de cuantos o onos han hecho llegar sugerencias o han detectado erratas. Castell´ de la Plana, a 8 de octubre de 2009. o Andr´s Marzal Var´ e Isabel Gracia Luengo. e oIntroducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 Andrés Marzal/Isabel Gracia Python o o 4 Introducción a la programación con Python - cUJI UJI
  11. 11. Cap´ ıtulo 1Introducci´n o ¿Qu´ sabes de este asunto? pregunt´ el Rey a Alicia. e o Nada dijo Alicia. ¿Absolutamente nada? insisti´ el Rey. o Absolutamente nada dijo Alicia. Esto es importante dijo el Rey, volvi´ndose hacia los jurados. e LEWIS CARROLL, Alicia en el pa´ de la maravillas. ısEl objetivo de este curso es ense˜arte a programar, esto es, a dise˜ar algoritmos y expre- n nsarlos como programas escritos en un lenguaje de programaci´n para poder ejecutarlos oen un computador. Seis t´rminos t´cnicos en el primer p´rrafo. No est´ mal. Vayamos paso a paso: e e a aempezaremos por presentar en qu´ consiste, b´sicamente, un computador. e a1.1. ComputadoresEl diccionario de la Real Academia define computador electr´nico como ˂˂M´quina electr´- o a onica, anal´gica o digital, dotada de una memoria de gran capacidad y de m´todos de tra- o etamiento de la informaci´n, capaz de resolver problemas matem´ticos y l´gicos mediante o a ola utilizaci´n autom´tica de programas inform´ticos.˃˃ o a a La propia definici´n nos da indicaciones acerca de algunos elementos b´sicos del o acomputador: la memoria, y alg´n dispositivo capaz de efectuar c´lculos matem´ticos y l´gicos. u a a o La memoria es un gran almac´n de informaci´n. En la memoria almacenamos todo tipo e ode datos: valores num´ricos, textos, im´genes, etc. El dispositivo encargado de efectuar e aoperaciones matem´ticas y l´gicas, que recibe el nombre de Unidad Aritm´tico-L´gica a o e o(UAL), es como una calculadora capaz de trabajar con esos datos y producir, a partirde ellos, nuevos datos (el resultado de las operaciones). Otro dispositivo se encarga detransportar la informaci´n de la memoria a la UAL, de controlar a la UAL para que efect´e o ulas operaciones pertinentes y de depositar los resultados en la memoria: la Unidad deControl. El conjunto que forman la Unidad de Control y la UAL se conoce por UnidadCentral de Proceso (o CPU, del ingl´s ˂˂Central Processing Unit˃˃). e Podemos imaginar la memoria como un armario enorme con cajones numerados y laCPU como una persona que, equipada con una calculadora (la UAL), es capaz de buscaroperandos en la memoria, efectuar c´lculos con ellos y dejar los resultados en la memoria. a 5 Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 Introducción a la programación con Python - UJI
  12. 12. Memoria 1 2 Unidad Central de Proceso 3 . 4 Unidad de Control Unidad Aritm´tico-L´gica e o . . Utilizaremos un lenguaje m´s t´cnico: cada uno de los ˂˂cajones˃˃ que conforman la a ememoria recibe el nombre de celda (de memoria) y el n´mero que lo identifica es su uposici´n o direcci´n, aunque a veces usaremos estos dos t´rminos para referirnos tambi´n o o e ea la correspondiente celda. Cada posici´n de memoria permite almacenar una secuencia de unos y ceros de otama˜o fijo. ¿Por qu´ unos y ceros? Porque la tecnolog´ actual de los computadores n e ıase basa en la sencillez con que es posible construir dispositivos binarios, es decir, quepueden adoptar dos posibles estados: encendido/apagado, hay corriente/no hay corriente,cierto/falso, uno/cero. . . ¿Es posible representar datos tan variados como n´meros, textos, uim´genes, etc. con s´lo unos y ceros? La respuesta es s´ (aunque con ciertas limitaciones). a o ıPara entenderla mejor, es preciso que nos detengamos brevemente a considerar c´mo seorepresenta la informaci´n con valores binarios. o1.2. Codificaci´n de la informaci´n o oUna codificaci´n asocia signos con los elementos de un conjunto a los que denominamos osignificados. En occidente, por ejemplo, codificamos los n´meros de cero a nueve con uel conjunto de signos {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Al hacerlo, ponemos en correspondenciaestos s´ ımbolos con cantidades, es decir, con su significado: el s´ ımbolo ˂˂6˃˃ representa ala cantidad seis. El conjunto de signos no tiene por qu´ ser finito. Podemos combinar elos d´ıgitos en secuencias que ponemos en correspondencia con, por ejemplo, los n´meros unaturales. La sucesi´n de d´ o ıgitos ˂˂99˃˃ forma un nuevo signo que asociamos a la cantidadnoventa y nueve. Los ordenadores s´lo tienen dos signos b´sicos, {0, 1}, pero se pueden o acombinar en secuencias, as´ que no estamos limitados a s´lo dos posibles significados. ı o Una variable que s´lo puede tomar uno de los dos valores binarios recibe el nombre ode bit (acr´nimo del ingl´s ˂˂binary digit˃˃). Es habitual trabajar con secuencias de bits o ede tama˜o fijo. Una secuencia de 8 bits recibe el nombre de byte (aunque en espa˜ol el n nt´rmino correcto es octeto, ´ste no acaba de imponerse y se usa la voz inglesa). Con una e esecuencia de 8 bits podemos representar 256 (28 ) significados diferentes. El rango [0, 255]de valores naturales comprende 256 valores, as´ que podemos representar cualquiera de ıellos con un patr´n de 8 bits. Podr´ o ıamos decidir, en principio, que la correspondenciaentre bytes y valores naturales es completamente arbitraria. As´ podr´ ı, ıamos decidir quela secuencia 00010011 representa, por ejemplo, el n´mero natural 0 y que la secuencia u01010111 representa el valor 3. Aunque sea posible esta asociaci´n arbitraria, no es odeseable, pues complica enormemente efectuar operaciones con los valores. Sumar, porejemplo, obligar´ a tener memorizada una tabla que dijera cu´l es el resultado de efectuar ıa ala operaci´n con cada par de valores, ¡y hay 65536 pares diferentes! o Los sistemas de representaci´n posicional de los n´meros permiten establecer esa o uasociaci´n entre secuencias de bits y valores num´ricos naturales de forma sistem´tica. o e aCentramos el discurso en secuencias de 8 bits, aunque todo lo que exponemos a con-tinuaci´n es v´lido para secuencias de otros tama˜os1 . El valor de una cadena de bits o a nb7 b6 b5 b4 b3 b2 b1 b0 es, en un sistema posicional convencional, 7 bi ·2i . As´ la secuencia i=0 ı,de bits 00001011 codifica el valor 0·27 +0·26 +0·25 +0·24 +1·23 +0·22 +1·21 +1·20 =8 + 2 + 1 = 11. El bit de m´s a la izquierda recibe el nombre de ˂˂bit m´s significativo˃˃ a ay el bit de m´s a la derecha se denomina ˂˂bit menos significativo˃˃. a Ocho bits ofrecen un rango de valores muy limitado. Es habitual en los ordenadores modernos trabajar 1con grupos de 4 bytes (32 bits) u 8 bytes (64 bits). Introducci´n Marzal/Isabel Gracia -Python 978-84-692-5869-9 Andrés a la programaci´n con ISBN: o o 6 Introducción a la programación con Python - UJI c UJI
  13. 13. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .· 1 ¿Cu´l es el m´ximo valor que puede representarse con 16 bits y un sistema de a arepresentaci´n posicional como el descrito? ¿Qu´ secuencia de bits le corresponde? o e· 2 ¿Cu´ntos bits se necesitan para representar los n´meros del 0 al 18, ambos inclu- a usive? .................................................................................. El sistema posicional es especialmente adecuado para efectuar ciertas operacionesaritm´ticas. Tomemos por caso la suma. Hay una ˂˂tabla de sumar˃˃ en binario que te emostramos a continuaci´n: o sumandos suma acarreo 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1El acarreo no nulo indica que un d´ ıgito no es suficiente para expresar la suma de dosbits y que debe a˜adirse el valor uno al bit que ocupa una posici´n m´s a la izquierda. n o aPara ilustrar la sencillez de la adici´n en el sistema posicional, hagamos una suma de odos n´meros de 8 bits usando esta tabla. En este ejemplo sumamos los valores 11 y 3 en usu representaci´n binaria: o 00001011 + 00000011Empezamos por los bits menos significativos. Seg´n la tabla, la suma 1 y 1 da 0 con uacarreo 1: Acarreo 1 00001011 + 00000011 0El segundo d´ıgito empezando por derecha toma el valor que resulta de sumar a 1 y 1 elacarreo que arrastramos. O sea, 1 y 1 es 0 con acarreo 1, pero al sumar el acarreo quearrastramos de la anterior suma de bits, el resultado final es 1 con acarreo 1: Acarreo 1 1 00001011 + 00000011 10Ya te habr´s hecho una idea de la sencillez del m´todo. De hecho, ya lo conoces bien, a epues el sistema de numeraci´n que aprendiste en la escuela es tambi´n posicional, s´lo o e oque usando diez d´ ıgitos diferentes en lugar de dos, as´ que el procedimiento de suma es ıesencialmente id´ntico. He aqu´ el resultado final, que es la secuencia de bits 00001110, e ıo sea, el valor 14: Acarreo 1 1 00001011 + 00000011 00001110 La circuiter´ electr´nica necesaria para implementar un sumador que act´e como el ıa o udescrito es extremadamente sencilla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .· 3 Calcula las siguientes sumas de n´meros codificados con 8 bits en el sistema uposicional:Introducci´n a la programaci´n con ISBN: 978-84-692-5869-9 Andrés Marzal/Isabel Gracia - Python o o 7 Introducción a la programación con Python - UJIUJI c
  14. 14. a) 01111111 + 00000001 b) 01010101 + 10101010 c) 00000011 + 00000001 .................................................................................. Debes tener en cuenta que la suma de dos n´meros de 8 bits puede proporcionar una ucantidad que requiere 9 bits. Suma, por ejemplo, las cantidades 255 (en binario de 8 bitses 11111111) y 1 (que en binario es 00000001): Acarreo 1 1 1 1 1 1 1 11111111 + 00000001 (1)00000000El resultado es la cantidad 256, que en binario se expresa con 9 bits, no con 8. Decimosen este caso que la suma ha producido un desbordamiento. Esta anomal´ debe ser tenida ıaen cuenta cuando se usa o programa un ordenador. Hasta el momento hemos visto c´mo codificar valores positivos. ¿Podemos representar otambi´n cantidades negativas? La respuesta es s´ Consideremos brevemente tres formas e ı.de hacerlo. La primera es muy intuitiva: consiste en utilizar el bit m´s significativo para acodificar el signo; si vale 0, por ejemplo, el n´mero expresado con los restantes bits es upositivo (con la representaci´n posicional que ya conoces), y si vale 1, es negativo. Por oejemplo, el valor de 00000010 es 2 y el de 10000010 es −2. Efectuar sumas con valorespositivos y negativos resulta relativamente complicado si codificamos as´ el signo de un ın´mero. Esta mayor complicaci´n se traslada tambi´n a la circuiter´ necesaria. Mala u o e ıacosa. Una forma alternativa de codificar cantidades positivas y negativas es el denominado˂˂complemento a uno˃˃. Consiste en lo siguiente: se toma la representaci´n posicional de oun n´mero (que debe poder expresarse con 7 bits) y se invierten todos sus bits si es unegativo. La suma de n´meros codificados as´ es relativamente sencilla: se efect´a la u ı usuma convencional y, si no se ha producido un desbordamiento, el resultado es el valorque se deseaba calcular; pero si se produce un desbordamiento, la soluci´n se obtiene osumando el valor 1 al resultado de la suma (sin tener en cuenta ya el bit desbordado).Ve´moslo con un ejemplo. Sumemos el valor 3 al valor −2 en complemento a uno: a Acarreo 1 1 1 1 1 1 1 00000011 + 11111101 (1)00000000 ↓ 00000000 + 00000001 00000001La primera suma ha producido un desbordamiento. El resultado correcto resulta de sumaruna unidad a los 8 primeros bits. La codificaci´n en complemento a uno tiene algunas desventajas. Una de ellas es que ohay dos formas de codificar el valor 0 (con 8 bits, por ejemplo, tanto 00000000 como11111111 representan el valor 0) y, por tanto, s´lo podemos representar 255 valores o([−127, 127]), en lugar de 256. Pero el principal inconveniente es la lentitud con que serealizan operaciones como la suma: cuando se produce un desbordamiento se han deefectuar dos adiciones, es decir, se ha de invertir el doble de tiempo. Una codificaci´n alternativa (y que es la utilizada en los ordenadores) es la denomina- oda ˂˂complemento a dos˃˃. Para cambiar el signo a un n´mero hemos de invertir todos sus ubits y sumar 1 al resultado. Esta codificaci´n, que parece poco natural, tiene las ventajas ode que s´lo hay una forma de representar el valor nulo (el rango de valores representados oIntroducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 Andrés Marzal/Isabel Gracia Python o o 8 Introducción a la programación con Python - cUJI UJI
  15. 15. es [−128, 127]) y, principalmente, de que una sola operaci´n de suma basta para obtener oel resultado correcto de una adici´n. Repitamos el ejemplo anterior. Sumemos 3 y −2, opero en complemento a dos: Acarreo 1 1 1 1 1 1 00000011 + 11111110 (1)00000001Si ignoramos el bit desbordado, el resultado es correcto.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .· 4 Codifica en complemento a dos de 8 bits los siguientes valores:a) 4 b) −4 c) 0 d) 127 e) 1 f) −1·5 Efect´a las siguientes sumas y restas en complemento a dos de 8 bits: ua) 4 + 4 b) −4 + 3 c) 127 − 128 d) 128 − 127 e) 1 − 1 f) 1 − 2 .................................................................................. Bueno, ya hemos hablado bastante acerca de c´mo codificar n´meros (aunque m´s o u aadelante ofreceremos alguna reflexi´n acerca de c´mo representar valores con parte frac- o ocional). Preocup´monos por un instante acerca de c´mo representar texto. Hay una tabla e oque pone en correspondencia 127 s´ ımbolos con secuencias de bits y que se ha asumidocomo est´ndar. Es la denominada tabla ASCII, cuyo nombre son las siglas de ˂˂American aStandard Code for Information Interchange˃˃. La correspondencia entre secuencias de bitsy caracteres determinada por la tabla es arbitraria, pero aceptada como est´ndar. La letra a˂˂a˃˃, por ejemplo, se codifica con la secuencia de bits 01100001 y la letra ˂˂A˃˃ se codificacon 01000001. En el ap´ndice A se muestra esta tabla. El texto se puede codificar, pues, ecomo una secuencia de bits. Aqu´ tienes el texto ˂˂Hola˃˃ codificado con la tabla ASCII: ı 01001000 01101111 01101100 01100001 Pero, cuando vemos ese texto en pantalla, no vemos una secuencia de bits, sino laletra ˂˂H˃˃, seguida de la letra ˂˂o˃˃,. . . Lo que realmente vemos es un gr´fico, un patr´n de a op´ ıxeles almacenado en la memoria del ordenador y que se muestra en la pantalla. Un bitde valor 0 puede mostrarse como color blanco y un bit de valor 1 como color negro. Laletra ˂˂H˃˃ que ves en pantalla, por ejemplo, es la visualizaci´n de este patr´n de bits: o o 01000010 01000010 01000010 01111110 01000010 01000010 01000010 En la memoria del ordenador se dispone de un patr´n de bits para cada car´cter2 . o aCuando se detecta el c´digo ASCII 01001000, se muestra en pantalla el patr´n de bits o ocorrespondiente a la representaci´n gr´fica de la ˂˂H˃˃. Truculento, pero eficaz. o a No s´lo podemos representar caracteres con patrones de p´ o ıxeles: todos los gr´ficos ade ordenador son simples patrones de p´ ıxeles dispuestos como una matriz. Como puedes ver, basta con ceros y unos para codificar la informaci´n que manejamos oen un ordenador: n´meros, texto, im´genes, etc. u a 2 La realidad es cada vez m´s compleja. Los sistemas modernos almacenan los caracteres en memoria de aotra forma, pero hablar de ello supone desviarnos mucho de lo que queremos contar.Introducci´n a la programaci´n con ISBN: 978-84-692-5869-9 Andrés Marzal/Isabel Gracia - Python o o 9 Introducción a la programación con Python - UJIUJI c
  16. 16. 1.3. Programas y lenguajes de programaci´n oAntes de detenernos a hablar de la codificaci´n de la informaci´n est´bamos comentando o o aque la memoria es un gran almac´n con cajones numerados, es decir, identificables con evalores num´ricos: sus respectivas direcciones. En cada caj´n se almacena una secuencia e ode bits de tama˜o fijo. La CPU, el ˂˂cerebro˃˃ del ordenador, es capaz de ejecutar acciones nespecificadas mediante secuencias de instrucciones. Una instrucci´n describe una acci´n o omuy simple, del estilo de ˂˂suma esto con aquello˃˃, ˂˂multiplica las cantidades que hay ental y cual posici´n de memoria˃˃, ˂˂deja el resultado en tal direcci´n de memoria˃˃, ˂˂haz o ouna copia del dato de esta direcci´n en esta otra direcci´n˃˃, ˂˂averigua si la cantidad o oalmacenada en determinada direcci´n es negativa˃˃, etc. Las instrucciones se representan omediante combinaciones particulares de unos y ceros (valores binarios) y, por tanto, sepueden almacenar en la memoria. Combinando inteligentemente las instrucciones en una secuencia podemos hacer quela CPU ejecute c´lculos m´s complejos. Una secuencia de instrucciones es un programa. a aSi hay una instrucci´n para multiplicar pero ninguna para elevar un n´mero al cubo, po- o udemos construir un programa que efect´e este ultimo c´lculo a partir de las instrucciones u ´ adisponibles. He aqu´ grosso modo, una secuencia de instrucciones que calcula el cubo a ı,partir de productos: 1. Toma el n´mero y multipl´ u ıcalo por s´ mismo. ı 2. Multiplica el resultado de la ultima operaci´n por el n´mero original. ´ o u Las secuencias de instrucciones que el ordenador puede ejecutar reciben el nombrede programas en c´digo de m´quina, porque el lenguaje de programaci´n en el que est´n o a o aexpresadas recibe el nombre de c´digo de m´quina. Un lenguaje de programaci´n es o a ocualquier sistema de notaci´n que permite expresar programas. o1.3.1. C´digo de m´quina o aEl c´digo de m´quina codifica las secuencias de instrucciones como sucesiones de unos o ay ceros que siguen ciertas reglas. Cada familia de ordenadores dispone de su propiorepertorio de instrucciones, es decir, de su propio c´digo de m´quina. o a Un programa que, por ejemplo, calcula la media de tres n´meros almacenados en las uposiciones de memoria 10, 11 y 12, respectivamente, y deja el resultado en la posici´n ode memoria 13, podr´ tener el siguiente aspecto expresado de forma comprensible para ıanosotros: Memoria 1 Sumar contenido de direcciones 10 y 11 y dejar resultado en direcci´n 13 o 2 Sumar contenido de direcciones 13 y 12 y dejar resultado en direcci´n 13 o 3 Dividir contenido de direcci´n 13 por 3 y dejar resultado en direcci´n 13 o o 4 Detener En realidad, el contenido de cada direcci´n estar´ codificado como una serie de unos o ıay ceros, as´ que el aspecto real de un programa como el descrito arriba podr´ ser ´ste: ı ıa e Memoria 1 10101011 00001010 00001011 00001101 2 10101011 00001101 00001100 00001101 Unidad Central de Proceso (CPU) 3 00001110 00001101 00000011 00001101 4 00000000 00000000 00000000 00000000 Unidad de Control Unidad Aritm´tico-L´gica e o . . . Andrés Marzal/Isabel Gracia - ISBN: 978-84-692-5869-9 10 Introducción a la programación con Python - UJIIntroducci´n a la programaci´n con Python o o 10 c UJI
  17. 17. La CPU es un ingenioso sistema de circuitos electr´nicos capaz de interpretar el osignificado de cada una de esas secuencias de bits y llevar a cabo las acciones quecodifican. Cuando la CPU ejecuta el programa empieza por la instrucci´n contenida en ola primera de sus posiciones de memoria. Una vez ha ejecutado una instrucci´n, pasa a ola siguiente, y sigue as´ hasta encontrar una instrucci´n que detenga la ejecuci´n del ı o oprograma. Supongamos que en las direcciones de memoria 10, 11 y 12 se han almacenado losvalores 5, 10 y 6, respectivamente. Representamos as´ la memoria: ı Memoria 1 Sumar contenido de direcciones 10 y 11 y dejar resultado en direcci´n 13 o 2 Sumar contenido de direcciones 13 y 12 y dejar resultado en direcci´n 13 o 3 Dividir contenido de direcci´n 13 por 3 y dejar resultado en direcci´n 13 o o 4 Detener .. .. . .10 511 1012 6 .. .. . . Naturalmente, los valores de las posiciones 10, 11 y 12 estar´n codificados en binario, aaunque hemos optado por representarlos en base 10 en aras de una mayor claridad. La ejecuci´n del programa procede del siguiente modo. En primer lugar, se ejecuta la oinstrucci´n de la direcci´n 1, que dice que tomemos el contenido de la direcci´n 10 (el o o ovalor 5), lo sumemos al de la direcci´n 11 (el valor 10) y dejemos el resultado (el valor 15) oen la direcci´n de memoria 13. Tras ejecutar esta primera instrucci´n, la memoria queda o oas´ ı: Memoria 1 Sumar contenido de direcciones 10 y 11 y dejar resultado en direcci´n 13 o 2 Sumar contenido de direcciones 13 y 12 y dejar resultado en direcci´n 13 o 3 Dividir contenido de direcci´n 13 por 3 y dejar resultado en direcci´n 13 o o 4 Detener .. .. . .10 511 1012 613 15 .. .. . .A continuaci´n, se ejecuta la instrucci´n de la direcci´n 2, que ordena que se tome el o o ocontenido de la direcci´n 13 (el valor 15), se sume al contenido de la direcci´n 12 (el o ovalor 6) y se deposite el resultado (el valor 21) en la direcci´n 13. La memoria pasa a oquedar en este estado. Memoria 1 Sumar contenido de direcciones 10 y 11 y dejar resultado en direcci´n 13 o 2 Sumar contenido de direcciones 13 y 12 y dejar resultado en direcci´n 13 o 3 Dividir contenido de direcci´n 13 por 3 y dejar resultado en direcci´n 13 o o 4 Detener .. .. . .10 511 1012 613 21 .. .. . .Introducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 Andrés Marzal/Isabel Gracia Python o o 11 11 Introducción a la programación con Python - cUJI UJI
  18. 18. Ahora, la tercera instrucci´n dice que hemos de tomar el valor de la direcci´n 13 (el valor o o21), dividirlo por 3 y depositar el resultado (el valor 7) en la direcci´n 13. Este es el oestado en que queda la memoria tras ejecutar la tercera instrucci´n: o Memoria 1 Sumar contenido de direcciones 10 y 11 y dejar resultado en direcci´n 13 o 2 Sumar contenido de direcciones 13 y 12 y dejar resultado en direcci´n 13 o 3 Dividir contenido de direcci´n 13 por 3 y dejar resultado en direcci´n 13 o o 4 Detener .. .. . .10 511 1012 613 7 .. .. . .Y finalmente, la CPU detiene la ejecuci´n del programa, pues se encuentra con la ins- otrucci´n Detener en la direcci´n 4. o o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .· 6 Ejecuta paso a paso el mismo programa con los valores 2, −2 y 0 en las posicionesde memoria 10, 11 y 12, respectivamente.· 7 Dise˜a un programa que calcule la media de cinco n´meros depositados en las n uposiciones de memoria que van de la 10 a la 14 y que deje el resultado en la direcci´n o ¯de memoria 15. Recuerda que la media x de cinco n´meros x1 , x2 , x3 , x4 y x5 es u 5 i=1 xi x1 + x2 + x3 + x4 + x5 ¯ x= = . 5 5· 8 Dise˜a un programa que calcule la varianza de cinco n´meros depositados en las n uposiciones de memoria que van de la 10 a la 14 y que deje el resultado en la direcci´n ode memoria 15. La varianza, que se denota con σ 2 , es 5 i=1 (xi − x )2 ¯ σ2 = , 5 ¯donde x es la media de los cinco valores. Sup´n que existe una instrucci´n ˂˂Multiplicar el o ocontenido de direcci´n a por el contenido de direcci´n b y dejar el resultado en direcci´n o o oc˃˃. .................................................................................. ¿Qu´ instrucciones podemos usar para confeccionar programas? Ya hemos dicho que eel ordenador s´lo sabe ejecutar instrucciones muy sencillas. En nuestro ejemplo, s´lo o ohemos utilizado tres instrucciones distintas: una instrucci´n de suma de la forma ˂˂Sumar contenido de direcciones p y o q y dejar resultado en direcci´n r˃˃;o una instrucci´n de divisi´n de la forma ˂˂Dividir contenido de direcci´n p o o o por q y dejar resultado en direcci´n r˃˃; o y una instrucci´n que indica que se ha llegado al final del programa: Detener. o¡Pocos programas interesantes podemos hacer con tan s´lo estas tres instrucciones! Na- oturalmente, en un c´digo de m´quina hay instrucciones que permiten efectuar sumas, o arestas, divisiones y otras muchas operaciones. Y hay, adem´s, instrucciones que permiten aescoger qu´ instrucci´n se ejecutar´ a continuaci´n, bien directamente, bien en funci´n e o a o ode si se cumple o no determinada condici´n (por ejemplo, ˂˂Si el ´ltimo resultado o ues negativo, pasar a ejecutar la instrucci´n de la posici´n p˃˃). o oIntroducci´n a la programaci´n con ISBN: 978-84-692-5869-9 Andrés Marzal/Isabel Gracia - Python o o 12 12 Introducción a la programación con Python - UJIUJI c
  19. 19. 1.3.2. Lenguaje ensambladorEn los primeros tiempos de la inform´tica los programas se introduc´ en el ordenador a ıandirectamente en c´digo de m´quina, indicando uno por uno el valor de los bits de cada una o ade las posiciones de memoria. Para ello se insertaban manualmente cables en un panelde conectores: cada cable insertado en un conector representaba un uno y cada conectorsin cable representaba un cero. Como puedes imaginar, programar as´ un computador ıresultaba una tarea ardua, extremadamente tediosa y propensa a la comisi´n de errores. oEl m´s m´ a ınimo fallo conduc´ a un programa incorrecto. Pronto se dise˜aron notaciones ıa nque simplificaban la programaci´n: cada instrucci´n de c´digo de m´quina se representaba o o o amediante un c´digo mnemot´cnico, es decir, una abreviatura f´cilmente identificable con o e ael prop´sito de la instrucci´n. o o Por ejemplo, el programa desarrollado antes se podr´ representar como el siguiente ıatexto: SUM #10, #11, #13 SUM #13, #12, #13 DIV #13, 3, #13 FINEn este lenguaje la palabra SUM representa la instrucci´n de sumar, DIV la de dividir y oFIN representa la instrucci´n que indica que debe finalizar la ejecuci´n del programa. La o oalmohadilla (#) delante de un n´mero indica que deseamos acceder al contenido de la uposici´n de memoria cuya direcci´n es dicho n´mero. Los caracteres que representan el o o uprograma se introducen en la memoria del ordenador con la ayuda de un teclado y cadaletra se almacena en una posici´n de memoria como una combinaci´n particular de unos o oy ceros (su c´digo ASCII, por ejemplo). o Pero, ¿c´mo se puede ejecutar ese tipo de programa si la secuencia de unos y ceros oque la describe como texto no constituye un programa v´lido en c´digo de m´quina? Con a o ala ayuda de otro programa: el ensamblador. El ensamblador es un programa traductorque lee el contenido de las direcciones de memoria en las que hemos almacenado c´digos omnemot´cnicos y escribe en otras posiciones de memoria sus instrucciones asociadas en ec´digo de m´quina. o a El repertorio de c´digos mnemot´cnicos traducible a c´digo de m´quina y las reglas o e o aque permiten combinarlos, expresar direcciones, codificar valores num´ricos, etc., recibe eel nombre de lenguaje ensamblador, y es otro lenguaje de programaci´n. o1.3.3. ¿Un programa diferente para cada ordenador?Cada CPU tiene su propio juego de instrucciones y, en consecuencia, un c´digo deomaquina y uno o m´s lenguajes ensambladores propios. Un programa escrito para una aCPU de la marca Intel no funcionar´ en una CPU dise˜ada por otro fabricante, como a nMotorola3 . ¡Incluso diferentes versiones de una misma CPU tienen juegos de instruccionesque no son totalmente compatibles entre s´ los modelos m´s evolucionados de una familia ı!: ade CPU pueden incorporar instrucciones que no se encuentran en los m´s antiguos4 . a Si queremos que un programa se ejecute en m´s de un tipo de ordenador, ¿habr´ que a aescribirlo de nuevo para cada CPU particular? Durante mucho tiempo se intent´ definir oalg´n tipo de ˂˂lenguaje ensamblador universal˃˃, es decir, un lenguaje cuyos c´digos u o 3 A menos que la CPU se haya dise˜ado expresamente para reproducir el funcionamiento de la primera, ncomo ocurre con los procesadores de AMD, dise˜ados con el objetivo de ejecutar el c´digo de m´quina de n o alos procesadores de Intel. 4 Por ejemplo, a˜adiendo instrucciones que faciliten la programaci´n de aplicaciones multimedia (como n oocurre con los Intel Pentium MMX y modelos posteriores) impensables cuando se dise˜´ la primera CPU de nola familia (el Intel 8086).Introducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 Andrés a la programaci´n con ISBN: o o 13 13 Introducción a la programación con Python - UJI c UJI
  20. 20. ¡Hola, mundo! Nos gustar´ mostrarte el aspecto de los programas escritos en lenguajes ensambladores ıa reales con un par de ejemplos. Es una tradici´n ilustrar los diferentes lenguajes de o programaci´n con un programa sencillo que se limita a mostrar por pantalla el mensaje o ˂˂Hello, World!˃˃ (˂˂¡Hola, mundo!˃˃), as´ que la seguiremos. He aqu´ ese programa escrito ı ı en los lenguajes ensambladores de dos CPU distintas: a mano izquierda, el de los procesadores 80x86 de Intel (cuyo ultimo representante por el momento es el Pentium ´ 4) y a mano derecha, el de los procesadores de la familia Motorola 68000 (que es el procesador de los primeros ordenadores Apple Macintosh). .data start: msg: move.l #msg,-(a7) .string Hello, World!n move.w #9,-(a7) len: trap #1 .long . - msg addq.l #6,a7 .text move.w #1,-(a7) .globl _start trap #1 _start: addq.l #2,a7 push $len clr -(a7) push $msg trap #1 push $1 msg: dc.b Hello, World!,10,13,0 movl $0x4, %eax call _syscall addl $12, %esp push $0 movl $0x1, %eax call _syscall _syscall: int $0x80 ret Como puedes ver, ambos programas presentan un aspecto muy diferente. Por otra parte, los dos son bastante largos (entre 10 y 20 l´ ıneas) y de dif´ comprensi´n. ıcil omnemot´cnicos, sin corresponderse con los del c´digo de m´quina de ning´n ordenador e o a uconcreto, fuesen f´cilmente traducibles al c´digo de m´quina de cualquier ordenador. a o aDisponer de dicho lenguaje permitir´ escribir los programas una sola vez y ejecutarlos ıaen diferentes ordenadores tras efectuar las correspondientes traducciones a cada c´digo ode m´quina con diferentes programas ensambladores. a Si bien la idea es en principio interesante, presenta serios inconvenientes: Un lenguaje ensamblador universal no puede tener en cuenta c´mo se dise˜ar´n or- o n a denadores en un futuro y qu´ tipo de instrucciones soportar´n, as´ que posiblemente e a ı quede obsoleto en poco tiempo. Programar en lenguaje ensamblador (incluso en ese supuesto lenguaje ensamblador universal) es complicad´ ısimo por los numerosos detalles que deben tenerse en cuenta.Adem´s, puestos a dise˜ar un lenguaje de programaci´n general, ¿por qu´ no utilizar a n o eun lenguaje natural, es decir un lenguaje como el castellano o el ingl´s? Programar un ecomputador consistir´ simplemente, en escribir (¡o pronunciar frente a un micr´fono!) ıa, oun texto en el que indic´semos qu´ deseamos que haga el ordenador usando el mismo a elenguaje con que nos comunicamos con otras personas. Un programa inform´tico podr´ a ıaencargarse de traducir nuestras frases al c´digo de m´quina, del mismo modo que un o aprograma ensamblador traduce lenguaje ensamblador a c´digo de m´quina. Es una idea o aatractiva, pero que queda lejos de lo que sabemos hacer por varias razones:Introducci´n a la programaci´n con - ISBN: 978-84-692-5869-9 Andrés Marzal/Isabel Gracia Python o o 14 14 Introducción a la programación con Python - cUJI UJI
  21. 21. La complejidad intr´ ınseca de las construcciones de los lenguajes naturales dificulta enormemente el an´lisis sint´ctico de las frases, es decir, comprender su estructura a a y c´mo se relacionan entre s´ los diferentes elementos que las constituyen. o ı El an´lisis sem´ntico, es decir, la comprensi´n del significado de las frases, es a a o a´n m´s complicado. Las ambig¨edades e imprecisiones del lenguaje natural hacen u a u que sus frases presenten, f´cilmente, diversos significados, aun cuando las poda- a mos analizar sint´cticamente. (¿Cu´ntos significados tiene la frase ˂˂Trabaja en un a a banco.˃˃?) Sin una buena comprensi´n del significado no es posible efectuar una o traducci´n aceptable. o1.3.4. Lenguajes de programaci´n de alto nivel oHay una soluci´n intermedia: podemos dise˜ar lenguajes de programaci´n que, sin ser tan o n opotentes y expresivos como los lenguajes naturales, eliminen buena parte de la compleji-dad propia de los lenguajes ensambladores y est´n bien adaptados al tipo de problemas eque podemos resolver con los computadores: los denominados lenguajes de programaci´n ode alto nivel. El calificativo ˂˂de alto nivel˃˃ se˜ala su independencia de un ordenador nconcreto. Por contraposici´n, los c´digos de m´quina y los lenguajes ensambladores se o o adenominan lenguajes de programaci´n de bajo nivel. o He aqu´ el programa que calcula la media de tres n´meros en un lenguaje de alto ı univel t´ ıpico (Python):a = 5b = 10c = 6media = (a + b + c) / 3Las tres primeras l´ ıneas definen los tres valores y la cuarta calcula la media. Como puedesver, resulta mucho m´s legible que un programa en c´digo de m´quina o en un lenguaje a o aensamblador. Para cada lenguaje de alto nivel y para cada CPU se puede escribir un programa quese encargue de traducir las instrucciones del lenguaje de alto nivel a instrucciones dec´digo de m´quina, con lo que se consigue la deseada independencia de los programas con o arespecto a los diferentes sistemas computadores. S´lo habr´ que escribir una versi´n del o a oprograma en un lenguaje de programaci´n de alto nivel y la traducci´n de ese programa o oal c´digo de m´quina de cada CPU se realizar´ autom´ticamente. o a a a1.3.5. Compiladores e int´rpretes eHemos dicho que los lenguajes de alto nivel se traducen autom´ticamente a c´digo de a om´quina, s´ pero has de saber que hay dos tipos diferentes de traductores dependiendo a ı,de su modo de funcionamiento: compiladores e int´rpretes. e Un compilador lee completamente un programa en un lenguaje de alto nivel y lotraduce en su integridad a un programa de c´digo de m´quina equivalente. El programa o ade c´digo de m´quina resultante se puede ejecutar cuantas veces se desee, sin necesidad o ade volver a traducir el programa original. Un int´rprete act´a de un modo distinto: lee un programa escrito en un lenguaje de e ualto nivel instrucci´n a instrucci´n y, para cada una de ellas, efect´a una traducci´n a o o u olas instrucciones de c´digo de m´quina equivalentes y las ejecuta inmediatamente. No o ahay un proceso de traducci´n separado por completo del de ejecuci´n. Cada vez que o oejecutamos el programa con un int´rprete, se repite el proceso de traducci´n y ejecuci´n, e o oya que ambos son simult´neos. aIntroducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 Andrés a la programaci´n con ISBN: o o 15 15 Introducción a la programación con Python - UJI c UJI
  22. 22. Compiladores e int´rpretes. . . de idiomas e Puede resultarte de ayuda establecer una analog´ entre compiladores e int´rpretes de ıa e lenguajes de programaci´n y traductores e int´rpretes de idiomas. o e Un compilador act´a como un traductor que recibe un libro escrito en un idioma u determinado (lenguaje de alto nivel) y escribe un nuevo libro que, con la mayor fidelidad posible, contiene una traducci´n del texto original a otro idioma (c´digo de m´quina). o o a El proceso de traducci´n (compilaci´n) tiene lugar una sola vez y podemos leer el libro o o (ejecutar el programa) en el idioma destino (c´digo de m´quina) cuantas veces queramos. o a Un int´rprete de programas act´a como su hom´nimo en el caso de los idiomas. Sup´n e u o o que se imparte una conferencia en ingl´s en diferentes ciudades y un int´rprete ofrece e e su traducci´n simult´nea al castellano. Cada vez que la conferencia es pronunciada, o a el int´rprete debe realizar nuevamente la traducci´n. Es m´s, la traducci´n se produce e o a o sobre la marcha, frase a frase, y no de un tir´n al final de la conferencia. Del mismo modo o act´a un int´rprete de un lenguaje de programaci´n: traduce cada vez que ejecutamos u e o el programa y adem´s lo hace instrucci´n a instrucci´n. a o o Por regla general, los int´rpretes ejecutar´n los programas m´s lentamente, pues e a aal tiempo de ejecuci´n del c´digo de m´quina se suma el que consume la traducci´n o o a osimult´nea. Adem´s, un compilador puede examinar el programa de alto nivel abarcando a am´s de una instrucci´n cada vez, por lo que es capaz de producir mejores traducciones. a oUn programa interpretado suele ser mucho m´s lento que otro equivalente que haya sido acompilado (¡t´ıpicamente entre 2 y 100 veces m´s lento!). a Si tan lento resulta interpretar un programa, ¿por qu´ no se usan unicamente compi- e ´ladores? Es pronto para que entiendas las razones, pero, por regla general, los int´rpretes epermiten una mayor flexibilidad que los compiladores y ciertos lenguajes de programaci´n ode alto nivel han sido dise˜ados para explotar esa mayor flexibilidad. Otros lenguajes nde programaci´n, por contra, sacrifican la flexibilidad en aras de una mayor velocidad ode ejecuci´n. Aunque nada impide que compilemos o interpretemos cualquier lenguaje de oprogramaci´n, ciertos lenguajes se consideran apropiados para que la traducci´n se lleve o oa cabo con un compilador y otros no. Es m´s apropiado hablar, pues, de lenguajes de aprogramaci´n t´ o ıpicamente interpretados y lenguajes de programaci´n t´o ıpicamente com-pilados. Entre los primeros podemos citar Python, BASIC, Perl, Tcl, Ruby, Bash, Java oLisp. Entre los segundos, C, C#, Pascal, C++ o Fortran. En este curso aprenderemos a programar usando dos lenguajes de programaci´n dis-otintos: uno interpretado, Python, y otro compilado, C. Este volumen se dedica al lenguajede programaci´n con Python. Otro volumen de la misma colecci´n se dedica al estudio o ode C, pero partiendo de la base de que ya se sabe programar con Python.1.3.6. PythonExisten muchos otros lenguajes de programaci´n, ¿por qu´ aprender Python? Python o epresenta una serie de ventajas que lo hacen muy atractivo, tanto para su uso profesionalcomo para el aprendizaje de la programaci´n. Entre las m´s interesantes desde el punto o ade vista did´ctico tenemos: a Python es un lenguaje muy expresivo, es decir, los programas Python son muy compactos: un programa Python suele ser bastante m´s corto que su equivalente a en lenguajes como C. (Python llega a ser considerado por muchos un lenguaje de programaci´n de muy alto nivel.) o Python es muy legible. La sintaxis de Python es muy elegante y permite la escritura de programas cuya lectura resulta m´s f´cil que si utiliz´ramos otros lenguajes de a a a programaci´n. oIntroducci´n Marzal/Isabel Gracia -Python 978-84-692-5869-9 Andrés a la programaci´n con ISBN: o o 16 16 Introducción a la programación con Python - c UJI UJI
  23. 23. Python ofrece un entorno interactivo que facilita la realizaci´n de pruebas y ayuda o a despejar dudas acerca de ciertas caracter´ısticas del lenguaje. El entorno de ejecuci´n de Python detecta muchos de los errores de programaci´n o o que escapan al control de los compiladores y proporciona informaci´n muy rica o para detectarlos y corregirlos. Python puede usarse como lenguaje imperativo procedimental o como lenguaje orientado a objetos. Posee un rico juego de estructuras de datos que se pueden manipular de modo sencillo. Estas caracter´ısticas hacen que sea relativamente f´cil traducir m´todos de c´lculo a a e aprogramas Python. Python ha sido dise˜ado por Guido van Rossum y est´ en un proceso de continuo n adesarrollo por una gran comunidad de desarrolladores. Aproximadamente cada seis mesesse hace p´blica una nueva versi´n de Python. ¡Tranquilo! No es que cada medio a˜o se u o ncambie radicalmente el lenguaje de programaci´n, sino que ´ste se enriquece manteniendo o een lo posible la compatibilidad con los programas escritos para versiones anteriores.Nosotros utilizaremos caracter´ ısticas de la versi´n 2.3 de Python, por lo que deber´s o autilizar esa versi´n o una superior. o Una ventaja fundamental de Python es la gratuidad de su int´rprete. Puedes descar- egar el int´rprete de la p´gina web http://www.python.org. El int´rprete de Python e a etiene versiones para pr´cticamente cualquier plataforma en uso: sistemas PC bajo Linux, asistemas PC bajo Microsoft Windows, sistemas Macintosh de Apple, etc. Para que te vayas haciendo a la idea de qu´ aspecto presenta un programa completo een Python, te presentamos uno que calcula la media de tres n´meros que introduce por uteclado el usuario y muestra el resultado por pantalla:a = float(raw_input(’Dame un n´mero:’)) ub = float(raw_input(’Dame otro n´mero:’)) uc = float(raw_input(’Y ahora, uno m´s:’)) amedia = (a + b + c) / 3print ’La media es’, media En los ultimos a˜os Python ha experimentado un important´ ´ n ısimo aumento del n´mero ude programadores y empresas que lo utilizan. Aqu´ tienes unas citas que han encabezado ıdurante alg´n tiempo la web oficial de Python (http://www.python.org): u Python ha sido parte importante de Google desde el principio, y lo sigue siendo a medida que el sistema crece y evoluciona. Hoy d´ docenas de ıa, ingenieros de Google usan Python y seguimos buscando gente diestra en este lenguaje. PETER NORVIG, director de calidad de b´squedas de Google Inc. u Python juega un papel clave en nuestra cadena de producci´n. Sin ´l, un pro- o e yecto de la envergadura de ˂˂Star Wars: Episodio II˃˃ hubiera sido muy dif´ ıcil de sacar adelante. Visualizaci´n de multitudes, proceso de lotes, composici´n o o de escenas. . . Python es lo que lo une todo. TOMMY BRUNETTE, director t´cnico senior de Industrial Light Magic . eIntroducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 Andrés a la programaci´n con ISBN: o o 17 17 Introducción a la programación con Python - UJI c UJI
  24. 24. Python est´ en todas partes de Industrial Light Magic. Se usa para extender a la capacidad de nuestras aplicaciones y para proporcionar la cola que las une. Cada imagen generada por computador que creamos incluye a Python en alg´n punto del proceso. u PHILIP PETERSON, ingeniero principal de I+D de Industrial Light Magic.1.3.7. CEl lenguaje de programaci´n C es uno de los m´s utilizados en el mundo profesional. La o amayor´ de las aplicaciones comerciales y libres se han desarrollado con el lenguaje de ıaprogramaci´n C. El sistema operativo Linux, por ejemplo, se ha desarrollado en C en su opr´ctica totalidad. a ¿Por qu´ es tan utilizado el lenguaje C? C es un lenguaje de prop´sito general e oque permite controlar con gran precisi´n los factores que influyen en la eficiencia de olos programas. Pero esta capacidad de control ˂˂fino˃˃ que ofrece C tiene un precio: laescritura de programas puede ser mucho m´s costosa, pues hemos de estar pendientes ade numerosos detalles. Tan es as´ que muchos programadores afirman que C no es un ılenguaje de alto nivel, sino de nivel intermedio. ¡Hola de nuevo, mundo! Te presentamos los programas ˂˂¡Hola, mundo!˃˃ en Python (izquierda) y C (derecha). print ’Hello, world!’ #include stdio.h int main(void) { printf(Hello, world!n); return 0; } Como puedes comprobar, Python parece ir directamente al problema: una sola l´ ınea. Empezaremos aprendiendo Python. Aqu´ tienes una version en C del c´lculo de la media de tres n´meros le´ ı a u ıdos porteclado:#include stdio.hint main(void){ double a, b, c, media; printf(Dame un n´mero: ); u scanf(%lf, a); printf(Dame otro n´mero: ); u scanf(%lf, b); printf(Y ahora, uno m´s: ); a scanf(%lf, c); media = (a + b + c) / 3; printf(La media es %fn, media); return 0;} C ha sufrido una evoluci´n desde su dise˜o en los a˜os 70. El C, tal cual fue concebido o n npor sus autores, Brian Kernighan y Dennis Ritchie, de la compa˜´ norteamericana de nıaIntroducci´nMarzal/Isabel Gracia - Python978-84-692-5869-9 Andrés a la programaci´n con ISBN: o o 18 18 Introducción a la programación con Python - UJI c UJI

×