Siguiente Arriba Anterior Título Índice

Capítulo 1:

Comentarios

Un paseo por el programa

El propósito de este libro es el de enseñarle a pensar como un informático. Esta forma de pensar combina algunos de los mejores aspectos de las matemáticas, la ingeniería y las ciencias naturales. Al igual que los matemáticos, los informáticos emplean un lenguaje formal para expresar ideas (especialmente en cómputos). De la misma forma que los ingenieros, diseñan cosas, juntan componentes formando sistemas y evalúan las alternativas de las piezas intercambiables. Y, como los científicos, observan el comportamiento de los sistemas complejos, establecen hipótesis y ponen a prueba sus pronósticos.

La única destreza más importante para un informático es la de resolver problemas. Resolver problemas significa tener la habilidad para formular problemas, pensar soluciones creativas y expresar la solución de forma clara y precisa. Como resultado, el proceso de aprender a programar es una excelente oportunidad para practicar la destreza de resolver problemas. Esta es la razón por la cual el capítulo se llama: "Un paseo por el programa".

Por un lado, va a aprender a programar, una habilidad útil en sí misma. Por otro lado, va a utilizar la programación como un medio para un fin. A medida que avancemos, ese fin se irá perfilando.

1.1 El lenguaje de programación de Python

El programa de programación que va a aprender se llama Python. Python es un ejemplo de lenguaje de alto nivel; otros tipo de lenguajes de alto nivel de los que debe haber oído son: C, C++, Perl y Java.

Como puede imaginar, aparte de los "lenguajes de alto nivel", también hay lenguajes de bajo nivel, denominados también "lenguajes máquina" o "lenguajes ensambladores". En general, los ordenadores sólo pueden ejecutar programas que estén escritos en lenguajes de bajo nivel. Por tanto, los lenguajes que han sido escritos en un lenguaje de alto nivel deben ser procesados antes de que se puedan ejecutar. Este proceso suplementario lleva algún tiempo, lo que resulta ser una pequeña desventaja de los lenguajes de alto nivel.

Pero las ventajas son impresionantes. En primer lugar, es mucho más fácil programar en un lenguaje de alto nivel. Los programas que hayan sido escritos en un lenguaje de alto nivel necesitan menos tiempo para ser escritos, son más cortos y fáciles de leer y, además, tienen más probabilidades de estar escritos correctamente. En segundo lugar, los lenguajes de alto nivel son portátiles, es decir, se pueden ejecutar en diferentes tipos de ordenadores con pocas o ninguna modificación. Los programas de bajo nivel se pueden ejecutar en un solo tipo de ordenador y tienen que ser reescritos para que se puedan ejecutar en otros.

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

Existen dos tipos de programas que traducen lenguajes de alto nivel a lenguajes de bajo nivel: intérpretes y compiladores. Un intérprete lee un programa de alto nivel y lo ejecuta, es decir, hace lo que el programa le manda. Va procesando el programa poco a poco y, de forma alternativa, lee las líneas y lleva a cabo los cómputos.

Un compilador lee el programa y lo traduce completamente antes de que el programa empiece a ejecutarse. En este caso, el programa de alto nivel se llama código fuente, y el programa traducido es el código objeto o ejecutable. Una vez que el programa esté compilado, se puede ejecutar repetidamente sin necesidad de más traducciones.

Python se considera como un lenguaje interpretado ya que los programas Python son ejecutados por un intérprete. Hay dos maneras de utilizar el intérprete: en la modalidad línea de comando o en la modalidad script. En la modalidad línea de comando, se escriben programas Python y el intérprete imprime el resultado:

$ python
Python 1.5.2 (nº 1, 1 de febrero del 2000, 16:32:16)
Copyright 1991-1995 Stichting Mathematish Centrum, Amsterdam
>>> print 1 + 1
2

La primera línea de este ejemplo es el comando que ejecuta el intérprete de Python. Las siguientes dos líneas son mensajes que realiza el intérprete. La tercera línea comienza con >>>, que es el aviso que utiliza el intérprete para mostrar que ya está preparado. Se escribió print 1 + 1, y el intérprete respondió 2.

De forma alternativa, se puede escribir un programa en un archivo y utilizar el intérprete para ejecutar los contenidos de ese archivo. Este tipo de archivo se llama script. Por ejemplo, se utiliza un editor de textos para crear un archivo denominado atoya.py con los siguientes contenidos:

print 1 + 1

Por convención, los archivos que albergan programas Pyhton tienen nombres que terminan en .py.

Es necesario decirle al intérprete el nombre del script para ejecutar el programa:

$ python latoya.py
2

Los detalles de ejecución de programas pueden ser diferentes en otros entornos de desarrollo. Es más, la mayoría de los programas son más interesantes que el que se ha utilizado.

La mayoría de los ejemplos de este libro se ejecutan en la línea de comandos. Es conveniente trabajar en la línea de comandos para desarrollar programas y probarlos, porque, de este modo, éstos pueden ser escritos y ejecutados inmediatamente. Una vez se haya ejecutado un programa, se puede almacenar en un script de manera que se pueda ejecutar o modificar en el futuro. Comentarios

1.2 ¿Qué es un programa?

Un programa es una secuencia de instrucciones que especifican cómo realizar un cómputo. El cómputo puede ser algo matemático, como resolver un sistema de ecuaciones o calcular las raíces de un polinomio, pero, también, puede ser un cómputo simbólico, como la búsqueda y sustitución de un texto en un documento o, por raro que parezca, la compilación de un programa.

Los detalles son diferentes para cada lenguaje, pero hay algunas instrucciones básicas que aparecen en casi todos los lenguajes:

input
La llegada de información desde un teclado, un archivo o cualquier otro dispositivo.
output
Mostrar información en la pantalla o enviar información a un archivo o cualquier otro dispositivo.
math
Llevar a cabo operaciones matemáticas básicas como sumar o multiplicar.
conditional execution
Comprobar ciertas condiciones y ejecutar las secuencias de instrucciones apropiadas.
repetition
Llevar a cabo una acción de forma repetida, normalmente con alguna variación.

Aunque sea difícil de creer, esto es todo lo que hay. Todos los programas que se utilizan, da igual su dificultad, están formados por instrucciones que se asemejan a éstos. Por lo tanto, se puede describir la programación como un proceso por el cual se desglosa una tarea larga y compleja en una más pequeña con sus subtareas hasta que las subtareas sean lo suficientemente simples para llevarse a cabo con una de las instrucciones básicas.

Esto puede resultar un poco impreciso, pero se volverá a tratar el tema cuando se hable de algoritmos. Comentarios

1.3 ¿Qué es una depuración?

La programación es un proceso complejo y, debido a que está creada por el ser humano, con frecuencia induce a errores. Por motivos fortuitos, los errores de programación se llaman bugs y el proceso para localizarlos y corregirlos, debugging.

En un programa pueden aparecer tres tipos de errores: errores de sintaxis, en tiempo de ejecución y de semántica. Es muy útil hacer diferencias, para así localizarlos más rápido.

Errores de sintaxis

Python sólo puede realizar un programa si este es sintácticamente correcto; de lo contrario, el proceso falla y vuelve a aparecer un mensaje de error. La sintaxis se refiere a la estructura de un programa y a las reglas de esa estructura. Por ejemplo, en inglés, una frase debe comenzar con mayúscula y terminar con un periodo. en esta frase hay un error de sintaxis. Al igual que en ésta

Para la mayoría de los lectores, un par de errores de sintaxis no es un problema importante, y esto se debe a que se puede leer la poesía de e.e. cummings sin advertir mensajes de error. Pyhton no es tan indulgente. Si hay un solo error de sintaxis en alguna parte del programa, Python imprimirá un mensaje de error y terminará, y no será capaz de ejecutar el programa. Durante las primeras semanas de su carrera de programación, probablemente pasará un montón de tiempo localizando errores de sintaxis. A la misma vez que va ganando experiencia, irá cometiendo menos errores y encontrándolos más rápido.

Errores en tiempo de ejecución

El segundo tipo de errores es en tiempo de ejecución, llamado así debido a que el error no aparece hasta que se inicia el programa. Estos errores también se llaman excepciones ya que, normalmente, indican que algo excepcional (y malo) ha ocurrido.

Los errores en tiempo de ejecución son poco frecuentes en los programas sencillos que verá en los primeros capítulos, así que puede que pase un tiempo hasta que se encuentre con uno.

Errores de semántica

El tercer tipo de errores es un error de semántica. Si existe un error de semántica en el programa, éste se ejecutará con éxito, esto es, el ordenador no generará ningún mensaje de error, pero tampoco hará lo correcto. Hará otra cosa. Específicamente, hará lo que se le ha dicho que haga.

El problema es que el programa que se escribió no es el programa que se quería escribir. El significado del programa (su semántica) es erróneo. Identificar los errores de semántica puede ser un tanto difícil, porque requiere que se trabaje al revés al tener que mirar el resultado del programa e intentar descifrar lo que está haciendo.

Depuración experimental

Una de las habilidades más importantes que adquirirá es la de la depuración. Aunque puede resultar frustrante, la depuración es una del las partes más ricas intelectualmente, desafiantes e interesantes de la programación.

En cierta manera, la depuración es como un trabajo de detectives. Hay que enfrentarse a pistas y deducir los métodos y eventos que llevan a los resultados que se pueden ver.

La depuración es, también, como una ciencia experimental. Una vez que se tiene una idea de lo que va mal, se modifica el programa y se intenta otra vez. Si la hipótesis es correcta, puede predecir el resultado de la modificación, y así estar un paso más cercano a tener un programa que funcione. Si por el contrario, es errónea, debe buscarse una nueva. Como dijo Sherlock Holmes, "Cuando has eliminado lo imposible, lo que queda, por muy improbable que parezca, tiene que ser la verdad". (A. Conan Doyle, El signo de los cuatro)

Para algunas personas, la programación y la depuración significan lo mismo. Es decir, la programación es el proceso de depuración gradual de un programa hasta que este hace lo que uno quiere. La idea es que se debería comenzar con un programa que crea algo y luego ir haciendo pequeñas modificaciones, depurarlas a medida que se va avanzando, para así tener siempre un programa que funciona.

Por ejemplo, Linux es un sistema operativo que contiene miles de líneas de códigos, pero comenzó como un simple programa que Linus Tordvals usó para explorar el chip Intel 80386. Según Larry Greenfield, "Uno de los primeros proyectos de Linus fue un programa que se podía trasladar entre la tipografía AAAA y BBBB. Esto posteriormente dio lugar a Linux". (La guía de usuario Linux Versión Beta 1)

Los capítulos siguientes hacen más sugerencias sobre la depuración y otras prácticas de depuración. Comentarios

1.4 Lenguajes formales y lenguas

Las lenguas son los idiomas que hablamos las personas, como el inglés, el español y el francés. No fueron creadas por el ser humano (aunque intentemos estructurarlas); evolucionaron de forma natural.

Los lenguajes formales han sido diseñados por el ser humano para desempeñar tareas específicas. Por ejemplo, la notación que utilizan los matemáticos es un lenguaje formal que es particularmente útil para indicar relaciones entre números y símbolos. Los químicos hacen uso de un lenguaje formal para representar la estructura química de las moléculas. Y lo más importante:

Los lenguajes de programación son lenguajes formales que han sido diseñados para expresar cómputos.

Los lenguajes formales suelen tener reglas estrictas en cuanto a su sintaxis. Por ejemplo, 3+3=6 es una expresión matemática sintácticamente correcta, pero 3=+6$ no lo es. H2O es una expresión química sintácticamente correcta, pero 2Zz no lo es.

Las reglas sintácticas pueden ser de dos tipos, relacionadas con elementos (tokens) y estructuras. Los elementos son las partes básicas de un lenguaje, como las palabras, los números y los elementos químicos. Uno de los problemas con 3=+6$ es que $ no es un elemento válido en matemáticas (al menos que nosotros sepamos). De igual modo, 2Zz no es válido porque no hay ningún elemento con la abreviatura Zz.

El segundo tipo de error sintáctico atañe a la estructura de una expresión, esto es, la forma en la que los elementos están ordenados. The statement 3=+6$ no es estructuralmente válida porque no se puede poner un signo más justo después de un signo igual. Del mismo modo, las fórmulas moleculares han de tener subíndices después del nombre del elemento, y no antes.

Como ejercicio, cree lo que parezca ser una frase en español bien estructurada que contenga elementos irreconocibles. Luego, escriba otra frase cuyos elementos sean todos válidos pero con una estructura incorrecta.

Cuando usted lee una frase en español o una expresión en un lenguaje formal, deberá identificar cúal es la estructura de la frase (aunque en una lengua este proceso se lleva a cabo inconscientemente). Este proceso se llama parsing (análisis sintáctico).

Por ejemplo, cuando se oye la frase «Los años pesan» se entiende que «Los años» es el sujeto y «pesan» es el verbo. Una vez se haya analizado sintácticamente una frase se puede identificar qué significa, o la semántica de la oración. Se entenderá el significado general de la frase al darse por hecho que se sabe qué son los años y qué significa pesar.

Aunque los lenguajes formales y las lenguas tienen muchas cosas en común (elementos, estructura, sintaxis y semántica), hay muchas diferencias.

ambigüedad
Las lenguas cuentan con muchas ambigüedades que se esclarecen al usar la información contextual y otros elementos. Los lenguajes formales están diseñados para que sean lo menos ambiguo posible, lo que significa que cualquier expresión tiene un solo significado, a pesar del contexto.
redundancia
Las lenguas emplean muy a menudo la redundancia para deshacer la ambigüedad y disminuir los malentendidos. De esta manera, con frecuencia son un tanto verbosos. Los lenguajes formales son menos redundantes y más concisos.
literalidad
Las lenguas tienen muchas expresiones idiomáticas y metáforas. Si decimos «Los años pesan» es probable que no nos refiramos a los años en general y que no pese nada, puesto que es una acción metafórica. Los lenguajes formales expresan exactamente lo que dicen.

La gente que crece hablando una lengua (todo el mundo) a menudo encuentra complicado adaptarse a los lenguajes formales. De alguna manera, la diferencia entre los lenguajes formales y las lenguas es como la diferencia que hay entre la poesía y la prosa pero, además, tenemos lo siguiente:

Poesía
Las palabras se emplean tanto por su sonido como por su significado, y el poema en su totalidad crea un efecto o una respuesta emocional. Además de ser común, la ambigüedad se utiliza deliberadamente.
Prosa
El significado literal de las palabras cobra más importancia, y la estructura aporta un mayor significado. La prosa se presta más al análisis que la poesía, aunque a menudo sigue siendo ambigua.
Programas
El significado de un programa informático es literal y no tiene ambigüedad, y se puede entender completamente mediante el análisis de los elementos y la estructura.

Estas son algunas sugerencias para entender programas (y otros lenguajes formales). Primero, recuerde que los lenguajes formales son mucho más complicados que las lenguas, así que cuesta más entenderlos. Además, la estructura es muy importante; por ello, no es conveniente leer de arriba a abajo o de izquierda a derecha. En vez de esto, aprenda a estructurar el programa en su mente, identificando los elementos e interpretando la estructura. Finalmente, hay que tener en cuenta los detalles. Las minucias como los errores de ortografía y la mala puntuación, los cuales se pueden sobreentender en las lenguas, pueden suponer una gran diferencia en un lenguaje formal. Comentarios

1.5 Nuestro primer programa

Normalmente, el primer programa que se escribe en un lenguaje nuevo se llama «¡Hola mundo!», porque lo único que hace es mostrar las palabras «¡Hola mundo!». En Python, será algo así:

print «¡Hola, mundo!»

Esto es un ejemplo de orden, aunque realmente no imprime nada en papel. Sólo muestra un valor en la pantalla. En este caso, el resultado son las palabras.

¡Hola, Mundo!

Las comillas indican el principio y el final de un valor en el programa, no aparecen en el resultado.

Algunos juzgan la calidad de un lenguaje de programación por la simplicidad del programa «¡Hola mundo!». En este aspecto, Python lo hace tan bien como le es posible. Comentarios

1.6 Glosario

resolución de problemas
El proceso de formular un problema, encontrar una solución y expresarla.
lenguaje de alto nivel
Lenguaje de programación como Python que está diseñado de forma que sea fácil de leer y de escribir para las personas.
lenguaje de bajo nivel
Lenguaje de programación que está diseñado de forma que sea fácil de ejecutar para el ordenador; también llamado "lenguaje máquina" o "lenguaje ensamblador."
portabilidad
Propiedad de un programa de poder ejecutarse en más de un tipo de ordenador.
interpretar
Ejecutar un programa en un lenguaje de alto nivel traduciendolo a una línea a la vez.
compilar
Traducir un programa escrito en lenguaje de alto nivel a un lenguaje de bajo nivel todo de una vez, a la vez que queda preaparado para su posterior ejecución.
código fuente
Programa en lenguaje de alto nivel antes de ser compilado.
código objeto
Resultado del compilador despues de traducir el programa.
ejecutable
Otro nombre para el código objeto que está preparado para ser ejecutado.
script
Programa almacenado en un archivo (normalmente uno que será interpretado en el futuro).
programa
Conjunto de instrucciones que especifica un cómputo.
algoritmo
Proceso general para resolver una categoría de problemas.
bug
Error en un programa.
debugging (depuración)
Proceso de buscar y eliminar cualquiera de los tres tipos de errores de programación.
sintaxis
Estructura de un programa.
error de sintaxis
Error en un programa que hace imposible el análisis (y, por ello, se produce una imposibilidad a la hora de la interpretación).
error en tiempo de ejecución
Error que no ocurre hasta que el programa ha comenzado a ejecutarse pero que evita que el programa pueda seguir ejecutándose.
excepción
Otro nombre para error en tiempo de ejecución.
error de semántica
Error en un programa que hace una cosa diferente a la que el programador quería en un inicio.
semántica
Significado de un programa.
lengua
Cualquiera de las lenguas que las personas hablan y que evolucionaron de manera natural.
lenguaje formal
Cualquiera de los lenguajes que el hombre ha diseñado para fines específicos, como la representación de ideas matemáticas o programas informáticos. Todos los lenguajes de programación son lenguajes formales.
elemento
Uno de los elementos básicos de la estructura sintáctica de un programa, similar a una palabra en una lengua.
analizar sintácticamente
Examinar un programa y analizar su estructura sintáctica.
orden
Una instrucción que hace que el compilador de Python muestre un valor en la pantalla.


Siguiente Arriba Anterior Hola Índice

ÿ