La pereza puede ser una virtud (en los lenguajes de programaci¨®n)
La pereza en las personas no es precisamente una virtud. Nos han dicho a menudo que la pereza es la madre de todos los vicios y que es algo a evitar. Las personas perezosas suelen tener mala fama. Sin embargo, las cosas son distintas en los lenguajes de programaci¨®n. Como voy a mostrar aqu¨ª, la pereza a la hora de realizar c¨®mputos puede llegar a ser algo beneficioso, e incluso deseable.
En los lenguajes, lo contrario de la pereza es la impaciencia. Para ilustrar la diferencia, imagine que usted quiere organizar en su casa una fiesta para sus amigos y que no conoce bien sus gustos. Si es usted una persona impaciente, comprar¨¢ comidas y bebidas de diversos tipos para asegurarse de que todos quedar¨¢n satisfechos. Este comportamiento tiene las ventajas de que el invitado encontrar¨¢ inmediatamente el plato que le gusta, y que podr¨¢ empezar a comer (si su buena educaci¨®n se lo permite) desde el minuto uno. El inconveniente es que muy probablemente sobrar¨¢ la comida y la bebida que no responda a los gustos de los comensales. Es decir, usted habr¨¢ invertido recursos para nada. Eso es justo lo que sucede en un programa de ordenador escrito en un lenguaje impaciente: que realizar¨¢ c¨¢lculos cuyos resultados no siempre ser¨¢n necesarios.
Lo que har¨ªa un anfitri¨®n perezoso en esta situaci¨®n ser¨ªa esperar a que llegasen los invitados. A medida que van llegando, les preguntar¨ªa qu¨¦ es exactamente lo que desean para comer y beber, y lo encargar¨ªa a una tienda especializada. Mientras llega la comida, podr¨ªa entretenerles por ejemplo con las fotos del verano. Los lenguajes perezosos se comportan exactamente de ese modo: esperan a que exista demanda para un resultado y empiezan a calcularlo a partir del momento en que es demandado. La ventaja evidente es que nunca realizan c¨®mputos in¨²tiles, ni necesitan memoria para almacenar resultados que no se van a usar. A cambio, la parte del programa que demanda el resultado ha de esperar a que este sea calculado.
Imaginemos que un programa necesita la secuencia de los primeros n¨²meros primos, pero no conoce exactamente cu¨¢ntos va a necesitar, porque esa cantidad puede ser diferente en diferentes contextos. Un programa impaciente calcular¨ªa suficientes n¨²meros primos para atender a la demanda m¨¢s exigente, con lo que muy probablemente calcular¨ªa primos de m¨¢s. Un programa perezoso puede permitirse el lujo de ¡°calcular¡± todos los primos, es decir infinitos, aunque de hecho solo calcular¨¢ los que sean demandados. Veamos c¨®mo lo hace.
Escribir¨¦ [2, 3, 4] para referirme a la lista formada por los n¨²meros 2, 3 y 4. Igualmente, usar¨¦ la notaci¨®n x : lista para referirme a la inclusi¨®n de x al principio de la variable lista. Por ejemplo, la expresi¨®n 1 : [2,3,4] produce la lista [1,2,3,4]. La lista de todos los n¨²meros naturales empezando a partir de uno cualquiera se puede definir de esta manera:
naturalesEmpezandoEn i = i : naturalesEmpezandoEn (i+1)
?Es decir, la lista de los n¨²meros naturales que empiezan en i tiene a i como primer elemento, y le sigue la lista de los naturales que empiezan en i+1. Por ejemplo, naturalesEmpezandoEn 7 es el 7, seguido de naturalesEmpezandoEn 8; es decir, 7 : naturalesEmpezandoEn 8, que es [7, 8, 9¡]. No cabe duda de que esta igualdad es correcta, aunque vista como programa sugiere un c¨®mputo infinito. La lista completa de los n¨²meros naturales se obtendr¨ªa mediante la expresi¨®n naturalesEmpezandoEn 0.
Para calcular todos los n¨²meros primos emplear¨¦ el algoritmo conocido como la Criba de Erat¨®stenes, por ser este sabio griego quien lo propuso. Comienza con la lista de los naturales a partir de 2 y realiza repetidamente la siguiente operaci¨®n: considera el primer n¨²mero p de la lista como un n¨²mero primo y a continuaci¨®n elimina a p de la lista y a todos sus m¨²ltiplos, es decir, a 2p, 3p, 4p, etc. A la lista que resulte le aplica el mismo procedimiento, y as¨ª hasta el infinito. De este modo, el primer n¨²mero primo ser¨¢ el 2, tachar¨¢ el 4, el 6, el 8¡ Tomar¨¢ a continuaci¨®n el 3 y tachar¨¢ el 6 (que ya estaba tachado), el 9, el 12¡ La Criba toma el primer n¨²mero de la lista sin tachar (el 5) y tachar¨¢ sus m¨²ltiplos. Usando la notaci¨®n anterior, el programa que expresa esta idea es el siguiente:
primos = cribar (naturalesEmpezandoEn 2)
cribar (p : resto) = p : cribar (tacharMultiplosDe p resto)
Todas las listas que aparecen en este programa (la de los naturales, la que resulta de tachar los m¨²ltiplos de p y la de los primos) son potencialmente infinitas, pero al lenguaje perezoso no se le ocurrir¨¢ ponerse a calcularlas hasta que exista un demanda concreta. Supongamos que tenemos una funci¨®n tomar que, dado un natural n, toma los primeros n elementos de una lista. La instrucci¨®n
imprime (tomar 100 primos)
genera una demanda para calcular los primeros 100 primos de la lista primos. En ese momento, el programa anterior se ejecutar¨¢ para realizar el c¨¢lculo de la parte demandada de la lista. Al llegar al primo que corresponde al lugar 100, suspender¨¢ el c¨¢lculo.
En la programaci¨®n, la pereza permite separar la parte de la generaci¨®n de resultados de la parte de su consumo, lo cual redunda en programas mas sencillos y modulares. La mayor¨ªa de los lenguajes de programaci¨®n son impacientes. El primer lenguaje perezoso de amplio uso se dise?¨® a finales de la d¨¦cada de 1980, y fue llamado Haskell en honor al matem¨¢tico estadounidense Haskell B. Curry (1900-1982). Los programas aqu¨ª mostrados est¨¢n escritos en Haskell. Este lenguaje pertenece a la categor¨ªa de los llamados lenguajes funcionales y muchas empresas lo usan, en particular gran parte de la banca inglesa y alemana. Ya ven ustedes que paradoja: una instituci¨®n como la banca, a la que nadie tachar¨ªa de perezosa, realiza los c¨¢lculos de las cuentas de sus clientes mediante un lenguaje perezoso. ?Vivir para ver!
Ricardo Pe?a Mar¨ª. Catedr¨¢tico de Lenguajes y Sistemas Inform¨¢ticos. Universidad Complutense de Madrid.
Cr¨®nicas del Intangible es un espacio de divulgaci¨®n sobre las ciencias de la computaci¨®n, coordinado por la sociedad acad¨¦mica SISTEDES (Sociedad de Ingenier¨ªa de Software y de Tecnolog¨ªas de Desarrollo de Software). El intangible es la parte no material de los sistemas inform¨¢ticos (es decir, el software), y aqu¨ª se relatan su historia y su devenir. Los autores son profesores de las universidades espa?olas, coordinados por Ricardo Pe?a Mar¨ª (catedr¨¢tico de la Universidad Complutense de Madrid) y Macario Polo Usaola (profesor titular de la Universidad de Castilla-La Mancha).
Tu suscripci¨®n se est¨¢ usando en otro dispositivo
?Quieres a?adir otro usuario a tu suscripci¨®n?
Si contin¨²as leyendo en este dispositivo, no se podr¨¢ leer en el otro.
FlechaTu suscripci¨®n se est¨¢ usando en otro dispositivo y solo puedes acceder a EL PA?S desde un dispositivo a la vez.
Si quieres compartir tu cuenta, cambia tu suscripci¨®n a la modalidad Premium, as¨ª podr¨¢s a?adir otro usuario. Cada uno acceder¨¢ con su propia cuenta de email, lo que os permitir¨¢ personalizar vuestra experiencia en EL PA?S.
En el caso de no saber qui¨¦n est¨¢ usando tu cuenta, te recomendamos cambiar tu contrase?a aqu¨ª.
Si decides continuar compartiendo tu cuenta, este mensaje se mostrar¨¢ en tu dispositivo y en el de la otra persona que est¨¢ usando tu cuenta de forma indefinida, afectando a tu experiencia de lectura. Puedes consultar aqu¨ª los t¨¦rminos y condiciones de la suscripci¨®n digital.