sábado, 3 de abril de 2010

while (1) { ... }


Una de las primeras cosas que le enseñan a uno cuando empieza a estudiar ingeniería informática es la potencia de los bucles.

Sí, hablo de esas tareas repetitivas para las que supuestamente tan malos somos los humanos, por eso de que no queremos perder el tiempo calculando a mano los 10 mil primeros decimales de pi, o porque no está bien visto dedicarse a dibujar 30 imágenes por segundo para poder entretener a alguien que quiere jugar al Halo (aunque yo lo vería bien :P)

Para los no iniciados, la estructura de un bucle, en general, es algo como esto:

mientras (condición verdadera)
{ hacer esto }

Los programadores, tan osados ellos, definieron lo que se llama "bucle infinito", esto es, aquel cuya condición siempre se cumple, y que, por tanto, se ejecuta ilimitadamente. El bucle infinito puede tener muchas formas:

Puede ser algo tan sencillo como: while (true) { ... }, algo muy utilizado, por ejemplo, en videojuegos, donde queremos que continuamente se estén dibujando imágenes en la pantalla. Estos bucles infinitos son "los buenos", porque se hacen adrede, y en principio entendiendo lo que significa.

Pero claro, como siempre, hay formas de cagarla, y que aparezca un bucle infinito donde en principio no debería. Suelen ser situaciones mucho más complejas, en las que ocurren cosas concurrentemente, y hay muchos más factores que influyen en la condición del bucle.

Y no, no me he puesto a escribir a las cuatro de la mañana para explicaros lo que es un bucle, sino porque todo esto tiene una analogía bastante clara con lo que es nuestra vida hoy en día.

En general, uno puede comenzar a hacer una tarea repetitiva bien determinada, como por ejemplo lavar los platos. Uno lava un plato, luego lava el siguiente, hasta que lava el último.

Esto, traducido a "lenguaje informático", sería algo como:

while (quedan platos sucios)
{lavar el siguiente plato sucio}

La condición del bucle es muy sencilla, y no corremos peligro de caer en un bucle infinito (a menos claro que haya algún capullo ensuciando los platos según los lavamos xD), de ser así, lavaríamos platos continuamente de por vida, y claro, eso no es muy recomendable...



Pero, al igual que en informática, hay muchas formas, muy peligrosas, de caer en un bucle infinito, y digo muy peligrosas porque las consecuencias no son tan insignificantes como que se cuelgue el ordenador, o que salga el relojito de Windows (o la pelotita de playa de la muerte para mis compañeros de Mac OS). El resultado en la vida real suele ser perder gran parte de la misma, o acabar atrapado en "algo", siendo ese "algo" un ente indefinido, que puede ser tan evidente como la propia rutina de trabajo o estudios, o repetir una y otra vez los mismos errores, hablar siempre de las mismas cosas con las mismas personas, o una secuencia más enrevesada que sea prácticamente inapreciable.

La gran pregunta es ¿cómo evitar esto?

Yo no sé la respuesta, pero las analogías suelen ser útiles para hacernos una idea de como resolver un problema, y en informática esto tiene varias soluciones.

Como por ejemplo, un contador de bucle, es decir, permitir que el bucle se ejecute un número limitado de veces, lo que al otro lado de la analogía podría ser replantearse cada cierto tiempo la situación personal de uno mismo (aunque aquí corremos el peligro de encontrarnos con un bucle más externo que consista en replantearse continuamente la situación pero, por no estar dispuestos a cambiar, esta sea siempre la misma)

También existe la posibilidad de que un agente externo interrumpa el bucle (donde "agente externo" puede ser que el mejor amigo de turno te de un toque de atención).

La otra opción, mucho menos recomendable, es "matar el proceso", y confiar en que alguien pulse el botón de "reportar fallo a microsoft", pero esto es algo mucho más dramático y poco deseable para nuestra integridad física, ¿verdad?

Da un poco de miedo ponerse a pensar en esto detenidamente, porque en nuestra vida hay ocultos muchos más bucles infinitos de los que pensamos...

0 comentarios:

Publicar un comentario