Cibernetia > Manuales > Python
Búsqueda personalizada







Capítulo 1 El camino del programa

El objetivo de este libro es enseñarte a pensar como un informático. Esta manera de pensar combina algunas de las mejores características de las matemáticas, la ingeniería, la física y la ciencia. Al igual que los matemáticos, los informáticos utilizan lenguajes formales para denotar ideas (específicamente, los cálculos). Al igual que los ingenieros, diseñan, ensamblando componentes para montar sistemas y evalúan alternativas. Al igual que los científicos, observan el comportamiento de sistemas complejos, forma hipótesis, y comprueban predicciones.

La habilidad más importante para un investigador es la capacidad para solucionar problemas. Ser capaz de solucionar problemas significa tener la habilidad de formularlos correctamente, imaginar soluciones creativas y expresar estas soluciones de forma clara y precisa. En la práctica, el proceso de aprender a programas constituye una oportunidad excelente para ejercitar nuestra capacidad para solucionar problumes. Por eso que este capítulo se llama, "El camino del programa."

Por una parte, aprenderás a programar, una habilidad útil por sí misma. Por otro lado, usarás la programación como un medio para lograr un propósito. Según vayas avanzando, este propósito se hará más evidente.

1.1 El lenguaje de programación Python

El lenguaje de programación que vas a aprender es Python. Python es una buena muestra de lenguaje de alto nivel; otros lenguajes de alto nivel de los que quizá hayas oído hablar son C, C++, Perl o Java.

Como se puede deducir de la denominación "lenguaje de alto nivel", existen también lenguages de bajo nivel, que a veces se denominan "lenguajes de máquina" o "lenguages de ensamblaje". Dicho en pocas palabras, los ordenadores sólo pueden ejecutar los programas escritos en lenguajes de bajo nivel. Por lo tanto, los programas escritos en un lenguaje de alto nivel tienen que ser procesados antes de que puedan funcionar. Este proceso añadido consume algo de tiempo, lo cual constituye una pequeña desventaja de los lenguajes de alto nivel.

Pero las ventajas son enormes. En primer lugar, es mucho más fácil programar con un lenguaje de alto nivel. Los programas escritos en un lenguaje de alto nivel se escriben en menos tiempo y son más cortos y fáciles de leer, y es más fácil no cometer errores. En segundo lugar, los lenguajes de alto nivel son portables, lo que significa que pueden funcionar en diferentes tipos de ordenadores con pocas modificaciones o incluso ninguna modificación. Los programas de bajo nivel sólo pueden ejecutarse en un único tipo de ordenador, de modo que deben reescribirse si queremos que el programa funcione en otro tipo de máquina.

Debido a estas ventajas, casi todos los programas se escriben en lenguajes de alto nivel. Los lenguajes de bajo nivel se utilizan sólo para algunas aplicaciones especializadas.

Hay dos tipos de programas que convierten programas escritos con lenguajes de alto nivel en código de bajo nivel: los intérpretes y los compiladores. Un intérprete lee un programa de alto nivel y lo ejecuta, lo que significa que el programa hace lo que dice. Proceso el programa paso a paso, leyendo alternativamente líneas de código y ejecutando las instrucciones.

Un compilador lee el programa y lo traduce por completo antes de empezar a ejecutarlo. En este caso, el programa escrito en lenguaje de alto nivel se llama "código fuente", y el programa traducido a bajo nivel se llama "código objeto" o "ejecutable". Una vez que se compila un programa, se puede ejecutar repetidamente sin necesidad de volver a traducirlo.

Python es considerado un lenguaje interpretado porque es un intérprete el que ejecuta los programas escritos en Python. Hay dos maneras de utilizar el intérprete: el modo interactivo y modo de secuencia de comandos. En el modo interactivo, puedes escribir programas Python y el intérprete imprime el resultado:

Python 2.4.1 (#1, Apr 29 2005, 00:28:56)
Type "help", "copyright", "credits" or "license" for more information.
>>> print 1 + 1
2

Las dos primeras líneas en este ejemplo son las que muestra el intérprete al iniciarse. La tercera línea comienza con >>>, que es el prompt que el intérprete utiliza para indicar que está listo. Si escribes 1 + 1, el intérprete responde 2.

Si lo prefieres, puedes almacenar el código en un archivo y usar el intérprete para ejecutar el contenido del archivo. Este archivo se llama script. Por ejemplo, puede usar un editor de texto para crear un archivo llamado dinsdale.py con el siguiente contenido:

print 1 + 1

Por convención, los scripts de Python tienen nombres que terminan en .py.

Para ejecutar el script, debes decirle al intérprete el nombre del archivo. En una ventana de comandos UNIX, deberías escribir python dinsdale.py. En otros entornos de desarrollo, los detalles de la ejecución de secuencias de comandos son diferentes.

Trabajar en modo interactivo es muy adecuado para poder probar pequeñas porciones de código, ya que puedes teclear y ejecutar de inmediato. Pero si el código se compone de varias líneas, es más práctico guardarlo como una secuencia de comandos para poder modificarlo y ejecutarlo en el futuro.

1.2 ¿Qué es un programa?

Un programa es una secuencia de instrucciones que especifica cómo llevar a cabo una proceso. El proceso podría ser matemático, como resolver un sistema de ecuaciones o buscar las raíces de un polinomio, pero también puede ser simbólico, como buscar y reemplazar texto en un documento o (aunque parezca extraño) compilar de un programa.

Los detalles cambian entre los diferentes lenguajes, pero algunas instrucciones básicas aparecen en casi todos:

  • Entrada: Obtener datos desde el teclado, un archivo, o algún otro dispositivo.
  • Salida: Mostrar datos en la pantalla o enviar datos a un archivo u otro dispositivo.
  • Instrucciones matemáticas: Realizar operaciones matemáticas básicas como la adición y la multiplicación.
  • Ejecución condicional: Comprobar si se cumplen determinadas condiciones, y ejecutar la secuencia apropiada de instrucciones.
  • Repetición: Realizar alguna acción en repetidas ocasiones, por lo general con alguna variación.

Lo crea o no, eso es prácticamente todo lo que hay. Todos los programs, no importa cuán complicados sean, se componen de instrucciones similares a estas. De este modo, puedes pensar en la programación como en el proceso de dividir una tarea grande y compleja en subtareas más pequeñas, hasta que éstas últimas son suficientemente simples para ser ejecutadas mediante el mencionado conjunto de instrucciones básicas.

Esto puede sonar un poco vago, pero volveremos a ello cuando hablemos de algoritmos.

1.3 ¿Qué es la depuración?

La programación es propensa a errores. Los errores de programación se llaman bugs y el proceso de identificar tales errores se llama debugging (depuración).

En un programa se pueden dar tres tipos de errores: errores de sintaxis, errores de tiempo de ejecución y errores semánticos. Es útil saber distinguir entre ellos a fin de identificarlos más rápidamente.

1.3.1 Errores de sintaxis

Python sólo pueden ejecutar un programa si la sintaxis es correcta, de lo contrario, el intérprete muestra un mensaje de error. La sintaxis se refiere a la estructura de un programa y de las normas acerca cómo estructurarlo. Por ejemplo, en inglés, una frase debe empezar con una letra mayúscula y terminar con un punto. esta frase contiene un error de sintaxis. Y esta también

Para la mayoría de los lectores, unos pocos errores de sintaxis no constituyen un problema serio. Por eso podemos leer la poesía de e. e. cummings sin "lanzar" mensajes de error. Python no es tan benévolo. Si hay un solo error de sintaxis en cualquier parte del programa, Python te mostrará un mensaje de error y se acabó, y tú te quedarás sin poder ejecutar el programa. Durante las primeras semanas de tu carrera como programador, es muy probable que dediques mucho tiempo a la buscar errores de sintaxis. A medida que vayas adquieriendo experiencia, cometerás menos errores y los identificarás más rápido.

1.3.2 Errores de ejecución

El segundo tipo de error es el error en tiempo de ejecución, llamado así porque no aparece hasta que el programa ha empezado a ejecutarse. Estos errores son llamados también "excepciones", ya que por lo general indican que algo excepcional (y malo) ha ocurrido.

Los errores en tiempo de ejecución son poco frecuentes en programas tan simples como los que vamos a ver en los primeros capítulos, así que podría pasar algo de tiempo antes de que te topes con uno.

1.3.3 Errores semánticos

El tercer tipo de error es el error semántico. Si has cometido un error semántico, el programa se ejecutará aparentemente con éxito, en el sentido en que el ordenador no generará ningún mensaje de error, pero sin embargo el programa no hará lo que se supone que debía hacer, sino otra cosa. De hecho, el programa hará exactamente lo que le dijiste que hiciera.

El problema es precisamente que el programa que escribiste no es el programa que querías escribir. El significado del programa (su semántica) está mal. La identificación de los errores semánticos puede ser complicada ya que requiere seguir la pista de lo que hace el programa tratando de comprenderlo.

1.3.4 Depuración experimental

Una de las habilidades más importantes vas a adquirir es la capacidad para "depurar". Aunque pueda parecer frustrante, la depuración es una de las tareas más ricas intelectuamente, desafiantes e interesante de la programación.

En cierto modo, la depuración es un trabajo detectivesco. Te enfrentas a pistas, y tienes que inferir los procesos y acontecimientos que dieron lugar a los resultados que se ven.

Depurar es también como una especie de ciencia experimental. Una vez que tengas una idea de lo que va mal, modificarás el programa y volverás a intentarlo. Si la hipótesis es correcta, podrás predecir el resultado de la modificación, y estarás un paso más cerca de que el programa funcione. Si la hipótesis es incorrecta, tendrás que elaborar una nueva. Como señaló Sherlock Holmes, "Cuando se ha eliminado lo imposible, lo que queda, por poco probable que parezca, debe ser la verdad." (A. Conan Doyle, El Signo de los Cuatro)

Para algunas personas, la programación y la depuración son la misma cosa. Es decir, la programación es el proceso de depurar un programa gradualmente hasta que hace lo que quieres que haga. La idea es que debes comenzar con un programa que hace algo y hacer pequeñas modificaciones, depurándolo sobre la marcha, para contar siempre con un programa con el que trabajar.

Por ejemplo, Linux es un sistema operativo que contiene miles de líneas de código, pero que comenzó como un simple programa de Linus Torvalds utilizarse para estudiar el chip 80386 de Intel. Según Larry Greenfield, "Uno de los priemro proyectos de Linus fue un programa que imprimía alternativamente AAAA y BBBB. Esto fue evolucionando hasta convertirse en Linux. "(The Linux Users' Guide Beta Version 1)

En capítulos posteriores se hacen más sugerencias sobre la depuración y otras tareas propias de la programación.

1.4 Lenguages formales y naturales

Los lenguajes naturales son los idiomas que hablan las personas, tales como el inglés, el español o el francés. Estos idiomas no fueron diseñados por la gente (aunque la gente trata de imponer cierto orden en elolos), sino que evolucionó de forma natural.

Los lenguajes formales, en cambio, hans sido diseñados por personas para dar respuesta a necesidades específicas. Por ejemplo, la notación que utilizan los matemáticos es un lenguaje formal que es especialmente apropiado para expresar relaciones entre números y símbolos. En el ámbito de la química, se utiliza también un lenguaje formal para representar la estructura de las moléculas. Y lo que es más importante:

Los lenguajes de programación son los lenguajes formales diseñados para expresar los procesos computacionales.

Los lenguajes formales tienden a tener normas estrictas acerca de su sintaxis. Por ejemplo, 3 + 3 = 6 es una declaración matemática sintácticamente correcta, pero 3 + = 3 $ 6 no lo es. H2O es una fórmula química sintácticamente correcta, pero 2Zz no lo es.

Las reglas de sintaxis se dividen en dos grupos: las que afectan a los signos y las que se refieren a la estructura del lenguaje. Los signo son los elementos básicos del lenguaje, tales como las palabras, los números o los elementos químicos. Uno de los problemas de 3 + = 3 $ 6 es que $ no es un signo válido en matemáticas (hasta donde alcanzan mis conocimientos). Del mismo modo, 2Zz no es válido, porque no hay un elemento químico cuyo símbolo sea Zz.

El segundo tipo de error de sintaxis se refiere a la estructura de una declaración, es decir, la forma en que los signos se organizan. La declaración 3 + = 3 $ 6 no es válida porque aunque "+" e "=" son signos válidos, no se admite expresarlos de esta forma, uno inmediatamente después del otro. Del mismo modo, en una fórmula química el subíndice va después del nombre del elemento, no antes.

Ejercicio 1. Escribe una frase bien estructurada en español con signos incorrectos. A continuación, escribe otra oración en que todos los signos sean válidos pero la estructura sea incorrecta.

Cuando se lee una frase en cualquier idioma o una declaración en un lenguaje formal, hay que identificar la estructura de la oración (en un lenguaje natural, este proceso se realiza normalmente de forma inconsciente). Tal proceso se denomina análisis sintáctico.

Por ejemplo, al oír la frase "se bajó del burro" entendemos que un sujeto elidido realizó una acción (bajar), cuyo complemento es "del burro". Una vez analizada la oración es posible entender su significado, es decir, su semántica. Suponiendo que sabes lo que es un burro y lo que significa bajar, y suponiendo también que estás familiarizado con la sintaxis del español, deberías entender el significado de la frase.

Aunque los lenguajes formales y los naturales tienen muchas características en común (símbolos, estructura, sintaxis y semántica) existen muchas diferencias entre ellos:

  • Ambigüedad:
    Los lenguajes naturales son muy ambiguos, su significado depende de la información que aporta el contexto. Los lenguajes formales, en cambio, pretender ser casi o totalmente inequívocos, lo que significa que cualquier declaración tiene exactamente un sentido, independientemente del contexto.
  • Redundancia:
    Con el fin de hacer frente a la ambigüedad y reducir los malentendidos, los lenguajes naturales emplean muchas redundancias. Los lenguajes formales son menos redundantes y más conciso.
  • Literalidad:
    Los lenguajes naturales están llenos de frases hechas y metáforas. Si yo digo "se bajó del burro" es muy probable que ni me refiera a ningún burro ni nadie bajara de ningún sitio. Probablemente quiero decir que alguien admitió un error o rectificó su postura. En lenguaje formal, en cambio, una expresión significa exactamente lo que dice.

Las personas que crecen hablando un lenguaje natural a menudo tienen dificultades para adaptarse a la disciplina de los lenguajes formales. En cierto modo, la diferencia entre lenguaje formal y lenguaje natural es similar a la diferencia entre prosa y poesía, pero más aún:

  • Poesía:
    Se utilizan las palabras por su sonido, así como por su significado, y todo el poema en conjunto crea un efecto estético y emocional. La ambigüedad no es sólo común, sino incluso deliberada.
  • Prosa:
    El sentido literal de las palabras es más importante, y la estructura aporta significado. La prosa es más susceptibles de análisis que la poesía, pero aun así es a menudo ambigua.
  • Programas:
    El significado de un programa de ordenador es inequívoco y literal, y puede ser entendido completamente estudiando los signos empleados y su estructura.

Aquí van algunas sugerencias para leer programas (y otros lenguajes formales). En primer lugar, recuerda que los lenguajes formales son mucho más densos que los lenguajes naturales, por lo que se necesita más tiempo para leerlos. Además, la estructura es muy importante, por lo que normalmente no es buena idea leer de arriba abajo y de izquierda a derecha. En lugar de eso, aprende a analizar el programa asimilándolo, identificando los signos empleados e interpretando su estructura. Por último, los detalles. Pequeños errores ortográficos o de puntuación, que podrías pasar por alto en un lenguaje natural, pueden tener efectos significativos en un lenguaje formal.

1.5 El primer programa

Tradicionalmente, el primer programa que se escribe en un lenguaje de programación se llama "¡Hola, mundo!", porque todo lo que hace es mostrar las palabras, "¡Hola, mundo!". En Python, sería algo parecido a:

print "¡Hola, mundo!"

Este es un ejemplo de una instrucción para imprimir (print), que de hecho no imprime nada en papel. Se muestra un resultado en la pantalla. En este caso, el resultado está formado por las palabras.

¡Hola, mundo!

Las comillas en el programa marca el comienzo y el final del texto que se mostrará, y no aparecen en el resultado.

Algunas personas juzgar la calidad de un lenguaje de programación por la simplicidad del programa "¡Hola, mundo!". Según este criterio, Python es de una calidad insuperable.

1.6 Depuración

Es una buena idea leer este libro delante de un ordenador para que puedas probar los ejemplos a medida que vas avanzando. Puedes ejecutar la mayoría de los ejemplos en el modo interactivo del intérprete de Python, pero si escribes el código en un archivo de comandos, te será más fácil introducir y probar variaciones.

Siempre que experimentes con una nueva característica, debes tratar de cometer errores. Por ejemplo, en el programa "¡Hola, mundo!", ¿qué ocurre si eliminas una de las comillas? ¿Qué pasa si elimino todas las comillas? ¿Qué sucede si escribes mal print?

Este tipo de experimentos no sólo te ayudarán a recordar lo que lees, sino que también te ayudarán a entender la depuración, puesto que te permitirán familiarizarte con los mensajes de error. Y esto nos lleva al Primer Teorema de Depuración:

Es mejor cometer errores ahora y a propósito que más tarde y por casualidad.

Aprender de los errores puede ser frustrante, pero es una de las partes más importantes de aprender a pensar como un informático. Al final de cada capítulo hay una sección de depuración, como ésta que estás leyendo, con mis ideas (y teoremas) sobre depuración. Espero que te sirvan de ayuda.

1.7 Glosario

Resolución de problemas: el proceso consistente en formular un problema, encontrar una solución y expresar dicha solución.

Lenguaje de alto nivel: un lenguaje de programación, como Python, diseñado para que sea fácil de leer y escribir para los seres humanos.

Lenguaje de bajo nivel: un lenguaje de programación que está diseñado para que sea fácil de ejecutar por un ordenador; también llamado "lenguaje de máquina" o "lenguaje ensamblador".

Portabilidad: propiedad de un programa, que consiste en que éste puede funcionar en diferentes tipos de máquinas.

Interpretar: ejecutar un programa en un lenguaje de alto nivel, de modo que el programa se traduce y ejecuta línea a línea.

Compilar: traducir de una sola vez un programa escrito en un lenguaje de alto nivel a un lenguaje de bajo nivel, para su posterior ejecución.

Código fuente: un programa en un lenguaje de alto nivel antes de ser compilado.

Código objeto: la salida del compilador después de que éste traduzca el programa.

Ejecutable: otro nombre para el "código objeto", listo para ser ejecutado.

Prompt: los caracteres mostrados por el intérprete para indicar que está listo para recibir instrucciones por parte del usuario.

Secuencia de comandos: un programa almacenado en un archivo (por lo general, código que deberá ser interpretado).

Programa: un conjunto de instrucciones que especifican un proceso computacional.

Algoritmo: un procedimiento general para resolver una tipo de problemas.

Error: un error en un programa.

Depuración: el proceso de búsqueda y solución de cualquiera de los tres tipos de errores de programación.

Sintaxis: la estructura de un programa.

Error de sintaxis: un error que hace imposible analizar un programa (y, por tanto, hace imposible interpretarlo).

Excepción: un error que se detecta mientras el programa está funcionando.

Semántica: el significado de un programa.

Error semántico: un error que provoca que un programa haga algo distinto a lo que pretende el programador.

Lenguaje natural: cualquiera de los idiomas que hablan las personas.

Lenguaje formal: cualquiera de los lenguajes diseñados expresamente para fines específicos, tales como la representación de ideas matemáticas o la creación de programas de ordenador.

Signo (o símbolo, en inglés token): uno de los elementos básicos de la estructura sintáctica de un programa, análogo a una palabra en un lenguaje natural.

Parse (en español bárbaro, parsear): examinar un programa y analizar la estructura sintáctica.

Instrucción de impresión: instrucción que hace que el intérprete de Python muestre información en pantalla.

1.8 Ejercicios

  • Usa un navegador web para ir a http://python.org. Esta página contiene una gran cantidad de información sobre Python y enlaces a páginas relacionadas con Python, y te permite buscar en la documentación de Python.
    Por ejemplo, si introduces print en el cuadro de búsqueda, el primer enlace que aparece es la documentación de la instrucción print. Por ahora, no todo lo que vas a encontrar tendrá sentido para ti, ¡pero no está de más saber dónde encontrarlo!
  • Inicia el intérprete de Python y escribe help() para iniciar la herramienta de ayuda en línea. También puedes escribir help('print') para obtener información sobre un tema en particular, en este caso, la instrucción print.
Manuales | Tesis: Ordenadores, Circuitos integrados...
english
Cibernetia