martes, julio 18, 2006

Bucles infinitos

No me he cansado de repetir (todavía) que los programas informáticos no son otra cosa que conjuntos de instrucciones que el ordenador "comprende" y ejecuta secuencialmente. Por ejemplo, imaginemos un programa formado por tres instrucciones que se leerán en orden (primero la 1, luego la 2 y por último la 3):
  1. Pide al usuario que escriba su nombre
  2. Escribe en la impresora el nombre del usuario
  3. Fin
Es fácil ver entonces que, a lo largo de la ejecución de un programa, el ordenador irá leyendo y procesando estas órdenes de una en una. Claro que no todo es linealidad pura y dura: muchas veces, al diseñar un programa, nos interesaría repetir algunas instrucciones un determinado número de veces, o ejecutarlas sólo si se dan ciertas condiciones.

Todo esto son mecanismos que nos permiten alterar de alguna manera el flujo del programa. Imaginemos que quisieramos pedir e imprimir el nombre de 3 usuarios con el programa anterior. Una forma sería:
  1. Pide al usuario que escriba su nombre
  2. Escribe en la impresora el nombre del usuario
  3. Pide al usuario que escriba su nombre
  4. Escribe en la impresora el nombre del usuario
  5. Pide al usuario que escriba su nombre
  6. Escribe en la impresora el nombre del usuario
  7. Fin
Pero esto no parece muy productivo... tal vez podríamos hacer algo así:
  1. Repite las siguientes instrucciones 3 veces:
    1. Pide al usuario que escriba su nombre
    2. Escribe en la impresora el nombre del usuario
  2. Fin
Esta estructura se conoce como "bucle", pues supone introducir un ciclo en el orden de ejecución del programa. Un bucle está formado por una condición y un conjunto de instrucciones que se ejecutan mientras se verifica esa condición. En nuestro caso, la condición sería que "el número de iteraciones del bucle sea menor o igual a 3", pero podemos poner la condición que queramos.

Y también puede ser que la condición que seleccionemos se verifique siempre... con lo cual el ordenador quedará permanentemente ejecutando las instrucciones que compongan el bucle. Por ejemplo, el bucle...
  1. Repite la siguiente instrucción siempre que 1 sea igual a 1
    1. No hagas nada
... dejará al ordenador en un ciclo continuo de no hacer nada. Tampoco será un problema serio, pues el bucle sólo afectará al programa que lo contenga, y en principio el Sistema Operativo no se desestabilizará. Este tipo de bucles son conocidos en informática como bucles infinitos, y pueden causar fallos bastante graves...

Tal vez piense que evitarlos debe de ser trivial, pero rara vez se sabe de antemano cuántas veces se ejecutará un bucle, y puede ser que suceda algo que no hayamos previsto en el diseño que desencadene una secuencia sin fin... tiene su cosa, no crea...

Bien, ahora imagine un programa con esta pinta:
  1. Ejecuta la instrucción número 1
¿Qué hará el ordenador? Leerá la instrucción 1. ¿Qué dice? Que ejecute la instrucción 1. Vale, voy a leerla. ¿Qué dice? Que ejecute la instrucción 1... y así hasta el infinito (o hasta que el Sistema Operativo arrebate el procesador al programa)

Por cierto, que tiene usted mucha suerte: si fuera un ordenador jamás habría llegado a leer esto, sino que se habría quedado eternamente leyendo el bucle anterior... ¿Por qué? Bien, se trata de algo que veremos en la próxima entrada :-P

5 Comentarios:

A las 8:31 a. m., Anonymous Anónimo escribió... (¡Gracias, Anonymous Anónimo!)

Pocas veces me he reido tanto como con el chiste aquel del programador muerto en la ducha con un bote de champú en las manos que decía:
- Lavar
- Enjuagar
- Repetir
:D

 
A las 9:11 a. m., Anonymous Anónimo escribió... (¡Gracias, Anonymous Anónimo!)

¡jajajajaja! ¡no me acordaba! xD me encantan estas cosas :-P

 
A las 11:40 a. m., Anonymous Anónimo escribió... (¡Gracias, Anonymous Anónimo!)

Estos bucles son los responsables de que a veces una videconsola se quede "pollo"? Que se cuelge vamos.
Con ese ultimo parrafo me he acordado de la pelicula "colega, donde esta mi coche?" y me he reido bastante, en la escena de los tatuajes: "Ei, que pone en el mio? -Tio, y en el mio? -Mola, pero que pone en el mio? -Tio, y en el mio? -MOlA!, pero que pone en el mio?..." xD

Oh, y fuiste tu quien puso el video del algoritmo japo? De unos japos haciendo lo mismo, creo que del programa pitagara noseke.

 
A las 1:52 p. m., Anonymous Anónimo escribió... (¡Gracias, Anonymous Anónimo!)

Yo tengo un par de colegas que tenian problemas con entender lo que hace un bucle... o algo asi...
espero el proximo articulo! =P

 
A las 8:12 p. m., Blogger Pau escribió... (¡Gracias, Blogger Pau!)

Hola a todos y gracias por los comentarios,

Flup: Las consolas pueden colgarse por (casi) los mismos motivos que los ordenadores (los explico en éste artículo). Por otro lado, y sin ser un entendido en el tema, la causa más frecuente de que las consolas se queden bloqueadas suele deberse a problemas físicos: lentes sucias, discos estropeados y deterioro de los componentes, por ser aparatos sometidos a un intenso desgaste.

Y de lo último que mencionas no tengo ni idea :-P Pero si encuentras tal vídeo no dudes en enviar el link en un comentario o a través de la dirección del blog.

Arth: No es lo mismo un bucle que un bucle infinito: el primero es una estrategia habitual en programación, mientras que el segundo es un fallo de las aplicaciones. Partiendo de esa base, el problema que explicas se debe probablemente a un archivo o un componente de una web que ha sido accidentalmente borrado o dañado. El mensaje informando del error está previsto para que los diseñadores de la web lo arreglen: está dirigido a los autores o a los usuarios, pero por una falta de previsión en el diseño de la tecnología se presenta a los usuarios. En efecto, tú no tienes nada que depurar... simplemente la web tiene un fallo.

De todos modos para consultas generales y no del todo relacionadas con el contenido del post, puede ser una buena idea utilizar el correo electrónico: así garantizarás que tu duda sea resuelta adecuadamente en el consultorio SF.

¡Saludos y gracias a todos!

 

Recuerda que nos hemos mudado a nosololinux.com

<< Home