Next Up Previous Hi Index

Chapter 1

El Camino del Programa

El objetivo de este libro es enseñarle a pensar como lo hacen los científicos informáticos. Esta manera de pensar combina las mejores características de la matemática, la ingeniería, y las ciencias naturales. Como los matemáticos, los científicos informáticos usan lenguajes formales para designar ideas (específicamente, computaciones). Como los ingenieros, ellos diseñan cosas, ensamblando sistemas a partir de componentes y evaluando ventajas y desventajas de cada una de las alternativas. Como los científicos, ellos observan el comportamiento de sistemas complejos, forman hipótesis, y prueban sus predicciones.

La habilidad más importante del científico informático es la solución de problemas. La solución de problemas incluye poder formular problemas, pensar en la solución de manera creativa, y expresar una solución con claridad y precisión. Como se verá, el proceso de aprender a programar es la oportunidad perfecta para desarrollar la habilidad de resolver problemas. Por esa razón este capítulo se llama "El Camino del programa".

A cierto nivel, usted aprenderá a programar, lo cual es una habilidad muy útil por sí misma. A otro nivel, usted utilizará la programación para obtener algún resultado. Ese resultado se verá más claramente durante el proceso.

1.1 El lenguaje de programación Python

El lenguaje de programación que aprenderá es Python. Python es un ejemplar de un lenguaje de alto nivel; otros ejemplos de lenguajes de alto nivel son C, C++, Perl y Java.

Como se puede deducir de la nomenclatura "lenguaje de alto nivel", también existen lenguajes de bajo nivel, a los que también se califica como lenguajes de máquina o lenguajes ensambladores. A propósito, los computadores sólo ejecutan programas escritos en lenguajes de bajo nivel. Los programas de alto nivel tienen que traducirse antes de ejecutarse. Esta traducción lleva tiempo, lo cual es una pequeña desventaja de los lenguajes de alto nivel.

Aun así las ventajas son enormes. En primer lugar, la programación en lenguajes de alto nivel es mucho más fácil; escribir programas en un lenguaje de alto nivel toma menos tiempo, los programas son más cortos y más fáciles de leer, y es más probable que estos programas sean correctos. En segundo lugar, los lenguajes de alto nivel son portables, lo que significa que pueden ejecutarse en tipos diferentes de computadores sin modificación alguna o con pocas modificaciones. Los programas escritos en lenguajes de bajo nivel sólo pueden ser ejecutarse en un tipo de computador y deben reescribirse para ejecutarlos en otro.

Debido a estas ventajas, casi todos los programa se escriben en un lenguaje de alto nivel. Los lenguajes de bajo nivel sólo se usan para unas pocas aplicaciones especiales.

Hay 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, lo que significa que lleva a cabo lo que indica el programa. Traduce el programa poco a poco, leyendo y ejecutando cada comando.

Un compilador lee el programa y lo traduce todo al mismo tiempo, antes de ejecutar cualquiera de las instrucciones. En este caso, al programa de alto nivel se le llama el código fuente, y al programa traducido el código de objeto o el código ejecutable. Una vez compilado el programa, puede ejecutarlo repetidamente sin volver a traducirlo.

Python se considera como lenguaje interpretado porque los programas de Python se ejecutan por medio de un intérprete. Existen dos maneras de usar el intérprete: modo de comando y modo de guión. En modo de comando se escriben sentencias en el lenguaje Python y el intérprete muestra el resultado.

$ python
Python 1.5.2 (#1, Feb 1 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 pone en marcha el intérprete Python. Las dos líneas siguientes son mensajes del intérprete. La tercera línea comienza con >>>, que es la invitación del intérprete para indicar que está listo. Escribimos print 1 + 1 y el intérprete contestó 2.

Alternativamente, se puede escribir el programa en un archivo y usar el intérprete para ejecutar el contenido de dicho archivo. El archivo se llama, en este caso, un guión. Por ejemplo, en un editor de texto se puede crear un archivo latoya.py que contenga esta línea:

print 1 + 1

Por acuerdo unánime, los archivos que contienen programas de Python tienen nombres que terminan con .py.

Para ejecutar el programa, se le tiene que indicar el nombre del guión al intérprete.

$ python latoya.py
2

En otros entornos de desarrollo los detalles de la ejecución de programas pueden ser diferentes. Aemás, la mayoría de programas son más interesantes que el mencionado.

La mayoría de ejemplos en este libro se ejecutan desde en la línea de comando. La línea de comando es muy apropiada para el desarrollo de programas y para pruebas rápidas porque se pueden teclear las instrucciones de Python y se pueden ejecutar inmediatamente. Una vez que un programa está completo, puede archivarse en un guión para ejecutarlo o modificarlo en el futuro.

1.2 ¿Qué es un programa?

Un programa es una secuencia de instrucciones que especifican cómo ejecutar una computación. La computación puede ser algo matemático, como solucionar un sistema de ecuaciones o determinar las raíces de un polinomio, pero también puede ser una computación simbólica, como buscar y reemplazar el texto de un documento o (aunque parezca raro) compilar un programa.

Las instrucciones (comandos, órdenes) tienen una apariencia diferente en lenguajes de programación diferentes, pero existen algunas funciones básicas que se presentan en casi todo lenguaje:

entrada
Recibir datos del teclado, o un archivo u otro aparato.
salida
Mostrar datos en el monitor o enviar datos a un archivo u otro aparato.
matemáticas
Ejecutar operaciones básicas de matemáticas como la adición y la multiplicación.
operación condicional
Probar la veracidad de alguna condición y ejecutar una secuencia de instrucciones apropiada.
repetición
Ejecutar alguna acción repetidas veces, normalmente con alguna variación.

Lo crea o no, eso es todo. Todos los programas que existen, por complicados que sean, están formulados exclusivamente con tales instrucciones. Así, una manera de describir la programación es: El proceso de romper una tarea en tareas cada vez más pequeñas hasta que estas tareas sean suficientemente simples para ser ejecutadas con una de estas instrucciones simples.

Quizás esta descripción sea un poco ambigua. No se preocupe. Lo explicaremos con más detalle con el tema de los algoritmos.

1.3 ¿Qué es la depuración (debugging)?

La programación es un proceso complejo y, por ser realizado por humanos, a menudo desemboca en errores. Por razones caprichosas, esos errores se llaman bugs y el proceso de buscarlos y corregirlos se llama depuración (en inglés "debugging").

Hay tres tipos de errores que pueden ocurrir en un programa, de sintaxis, en tiempo de ejecución y semánticos. Es muy útil distinguirlos para encontrarlos mas rápido.

Errores sintácticos

Python sólo puede ejecutar un programa si el programa es correcto sintácticamente. En caso contrario, es decir si el programa no es correcto sintácticamente, el proceso falla y devuelve un mensaje de error. El término sintaxis se refiere a la estructura de cualquier programa y a las reglas de esa estructura. Por ejemplo, en español la primera letra de toda oración debe ser mayúscula, y todas las oraciones deben terminar con un punto. esta oración tiene un error sintáctico. Esta oración también

Para la mayoría de lectores, unos pocos errores sintácticos no son significatvos, y por eso pueden leer la poesía de e. e. cummings sin anunciar errores de sintaxis. Python no es tan permisivo. Si hay aunque sea un solo error sintáctico en el programa, Python mostrará un mensaje de error y abortará la ejecución del programa. Durante las primeras semanas de su carrera como programador pasará, seguramente, mucho tiempo buscando errores sintácticos. Sin embargo, tal como adquiera experiencia tendrá menos errores y los encontrará mas rápido.

Errores en tiempo de ejecución

El segundo tipo de error es un error en tiempo de ejecución. Este error no aparece hasta que se ejecuta el programa. Estos errores también se llaman excepciones porque indican que algo excepcional (y malo) ha ocurrido.

Con los programas que vamos a escribir al principio, los errores en tiempo de ejecución ocurrirán con poca frecuencia, así que puede pasar bastante tiempo hasta que vea uno.

Errores semánticos

El tercer tipo de error es el error semántico. Si hay un error de lógica en su programa, el programa se ejecutará sin ningún mensaje de error, pero el resultado no será el deseado. Será cualquier otra cosa. Concretamente, el programa hará lo que usted le dijo.

A veces ocurre que el programa escrito no es el programa que se tenía en mente. El sentido o significado del programa (su semántica) no es correcto. Es difícil hallar errores de lógica, porque requiere trabajar al revés, observando el resultado del programa para averiguar lo que hace.

Depuración experimental

Una de las técnicas más importantes que usted aprenderá es la depuración. Aunque a veces es frustrante, la depuración es una de las partes más intelectualmente ricas, interesantes y estimulantes de la programación.

La depuración es una actividad parecida a la tarea de un investigador: se tienen que estudiar las claves para inducir los procesos y eventos llevaron a los resultados que tiene a la vista.

La depuración también es una ciencia experimental. Una vez que se tiene la idea de cuál es el error, se modifica el programa y se intenta nuevamente. Si su hipótesis fue la correcta se pueden predecir los resultados de la modificación y estará más cerca de un programa correcto. Si su hipótesis fue errónea tendrá que idearse otra hipótesis. Como dijo Sherlock Holmes, "Cuando se ha descartado lo imposible, lo que queda, no importa cuan inverosímil, debe ser la verdad." (A. Conan Doyle, The Sign of Four)

Para algunas personas, la programación y la depuración son lo mismo: la programación es el proceso de depurar un programa gradualmente hasta que haga lo que usted quiera. La idea es que debería usted comenzar con un programa que haga algo y hacer pequeñas modificaciones, depurándolas sobre la marcha, de modo que siempre tenga un programa que funcione.

Por ejemplo, Linux es un sistema operativo que contiee miles de líneas de código, pero Linus Torvalds lo comenzó como un programa para explorar el microprocesador Intel 80836. Según Larry Greenfield, "Uno de los proyectos tempranos de Linus fue un programa que alternaba la impresión de AAAA con BBBB. Este programa evolucionó en Linux" (de The Linux Users' Guide Versión Beta 1).

Otros capítulos tratarán más acerca del tema de depuración y otras técnicas de programación.

1.4 Lenguajes formales y lenguajes naturales

Los lenguajes naturales son los lenguajes hablados por seres humanos, como el español, el inglés y el francés. No los han diseñados personas (aunque se intente poner cierto orden en ellos), sino que se han desarrollado naturalmente.

Los lenguajes formales son lenguajes diseñados por humanos y que tienen aplicaciones específicas. La notación matemática, por ejemplo, es un lenguaje formal ya que se presta a la representación de las relaciones entre números y símbolos. Los químicos utilizan 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 desarrollados para expresar computaciones.

Los lenguajes formales casi siempre tienen reglas sintácticas estrictas. Por ejemplo, 3+3=6 es una expresión matemática correcta, pero 3=+6$ no lo es. De la misma manera, H20 es una nomenclatura química correcta, pero 2Zz no lo es.

Existen dos clases de reglas sintácticas, en cuanto a unidades y estructura. Las unidades son los elementos básicos de un lenguaje, como lo son las palabras, los números y los elementos químicos. Por ejemplo, en 3=+6$, $ no es una unidad matemática aceptada (al menos hasta donde nosotros sabemos. Similarmente, 2Xx no es formal porque no hay ningún elemento con la abreviatura Zz.

La segunda clase de regla sintáctica está relacionada con la estructura de un elemento; o sea, el orden de las unidades. La estructura de la sentencia 3=+6$ no se acepta porque no se puede escribir el símbolo de igualdad seguido de un símbolo positivo. Similarmente, las fórmulas moleculares tienen que mostrar el número de subíndice después del elemento, no antes.

A manera de práctica, trate de producir una oración con estructura aceptada pero que esté compuesta de unidades irreconocibles. Luego escriba otra oración con unidades aceptables pero con estructura no válida.

Al leer una oración, sea en un lenguaje natural o una sentencia en un lenguaje técnico, se debe discernir la estructura de la oración. En un lenguaje natural este proceso, llamado análisis sintáctico ocurre subconscientemente.

Por ejemplo cuando usted escucha la oración "El otro zapato cayó", entiende que "el otro zapato" es el sujeto y "cayó" es el verbo. Cuando se ha analizado la oración sintácticamente, se puede deducir el significado, o la semántica, de la oración. Suponiendo que sepa lo ques es un zapato y lo que es caer, entenderá el significado de la oración.

Aunque existen muchas cosas en común entre los lenguajes naturales y los lenguajes formales     por ejemplo las unidades, la estructura, la sintaxis y la semántica     también existen muchas diferencias:

ambigüedad
Los lenguajes naturales tienen muchísimas ambigüedades, que los hablantes sortean usando claves contextuales y otra información. Los lenguajes formales se diseñan para estar completamente libres de ambigüedades o tanto como sea posible, lo que quiere decir que cualquier sentencia tiene sólo un significado, sin importar el contexto.
redundancia
Para reducir la ambigüedad y los malentendidos, las lenguas naturales utilizan bastante redundancia. Como resultado suelen ser prolijos. Los lenguajes formales son menos redundantes y más concisos.
literalidad
Los lenguajes naturales tienen muchas metáforas y frases hechas. El significado de un dicho, por ejemplo "Estirar la pata", es diferente al significado de sus sustantivos y verbos. En este ejemplo, la oración no tiene nada que ver con un pie y significa 'morirse'. Los lenguajes formales no difieren de su significado literal.

Los que aprenden a hablar un lenguaje natural     es decir, todo el mundo     muchas veces tienen dificultad en adaptarse a los lenguajes formales. A veces la diferencia entre los lenguajes formales y los naturales es comparable a la diferencia entre la prosa y la poesía:

Poesía
Se utiliza una palabra por su cualidad auditiva tanto como por su significado. El poema, en su totalidad, produce un efecto o reacción emocional. La ambigüedad no es solo común sino utilizada a propósito.
Prosa
El significado literal de la palabra es mas importante y la estructura da más significado aún. La prosa se presta al análisis más que la poesía, pero todavía contiene ambigüedad.
Programas
El significado de un programa es inequívoco y literal, y es entendido en su totalidad analizando las unidades y la estructura.

He aquí unas sugerencias para la lectura de un programa (y de otros lenguajes formales). Primero, recuerde que los lenguajes formales son mucho más densos que los lenguajes naturales, y por consecuente lleva más tiempo leerlos. También, la estructura es muy importante, así que entonces no es una buena idea leerlo de pies a cabeza, de izquierda a derecha. En vez de eso, aprenda a separar las diferentes partes en su mente, identificar las unidades e interpretar la estructura. Finalmente, ponga atención a los detalles. Los fallos de puntuación y la ortografía, que puede obviar en el lenguaje natural, pueden suponer una gran diferencia en un lenguaje formal.

1.5 El primer programa

Tradicionalmente el primer programa en un lenguaje nuevo se llama "Hola, mundo" (Hello world!) porque sólo muestra las palabras "Hola a todo el mundo". En Python es así:

print "Hola, mundo"

Este es un ejemplo de una sentencia print, la cual no imprime nada en papel, más bien muestra un valor. En este caso, el resultado es las palabras

Hola, mundo

Las comillas señalan el comienzo y el final del valor; no aparecen en el resultado.

Alguna gente evalúa la calidad de un lenguaje de programación por la simplicidad del programa "Hola, mundo". Si seguimos ese criterio, Python cumple con todas sus metas.

1.6 Glosario

solución de problemas
El proceso de formular un problema, hallar la solución y expresar esa solución.
lenguaje de alto nivel
Un lenguaje como Python diseñado para ser fácil de leer y escribir para la gente.
lenguaje de bajo nivel
Un lenguaje de programación diseñado para ser fácil de ejecutar para un computador; también se lo llama "lenguaje de máquina" o "lenguaje ensamblador".
portabilidad
La cualidad de un programa que le permite ser ejecutado en más de un tipo de computador.
interpretar
Ejecutar un programa escrito en un lenguaje de alto nivel traduciéndolo línea por línea
compilar
Traducir un programa escrito en un lenguaje de alto nivel a un lenguaje de bajo nivel todo al mismo tiempo, en preparación para la ejecución posterior.
código fuente
Un programa escrito en un lenguaje de alto nivel antes de ser compilado.
código de objeto
La salida del compilador una vez que ha traducido el programa.
programa ejecutable
Otro nombre para el código de objeto que está listo para ejecutarse.
guión
Un programa archivado (que va a ser interpretado).
programa
Un conjunto de instrucciones que especifica una computación.
algoritmo
Un proceso general para resolver una clase completa de problemas.
error (bug)
Un error en un programa.
depuración
El proceso de hallazgo y eliminación de los tres tipos de errores de programación.
sintaxis
La estructura de un programa.
error sintáctico
Un error en un programa que hace que el programa sea imposible de analizar sintácticamente (e imposible de interpretar).
error en tiempo de ejecución
Un error que no ocurre hasta que el programa ha comenzado a ejecutarse e impide que el programa continúe.
excepción
Otro nombre para un error en tiempo de ejecución.
error semántico
Un error en un programa que hace que ejecute algo que no era lo deseado.
semántica
El significado de un programa.
language natural
Cualquier lenguaje hablado que evolucionó de forma natural.
lenguaje formal
Cualquier lenguaje diseñado por humanos que tiene un propósito específico, como la representación de ideas matemáticas o programas de computadores; todos los lenguajes de programación son lenguajes formales.
unidad
Uno de los elementos básicos de la estructura sintáctica de un programa, análogo a una palabra en un lenguaje natural.
análisis sintáctico
La examinación de un programa y el análisis de su estructura sintáctica.
sentencia print
Una instrucción que causa que el intérprete Python muestre un valor en el monitor.


Next Up Previous Hi Index