Reflexiones en torno a un bucle for

Publicado: 12 febrero 2021 en Sin categoría
Etiquetas:, ,

Aprender a programar ha sido siempre para mí una actividad casi mística. El primer contacto con la programación fue a partir de mi Zx Spectrum 48k. Un día descubrí que con él no solo se podía jugar, sino que tenía implementado el lenguaje Sinclair BASIC. Y empecé a curiosear para qué valían esas instrucciones dibujadas en el, tan incómodo como simpático, teclado de caucho del Spectrum, descubriendo, poco a poco, la increíble maravilla tecnológica que es un lenguaje de programación. Habitualmente tendemos a ver como prodigios los productos de los lenguajes, pero no los lenguajes mismos. Flipamos con lo que hace AlphaZero o GPT-3 pero no caemos en la cuenta de que han sido desarrollados con unas herramientas alucinantes.

Recuerdo que la sentencia IF se me antojó muy divertida. Me parecía muy lógico ir mandando al programa de un lado para otro en función de si pasaba o no tal cosa, de si se daba o no una condición. BASIC incorporaba la sentencia GOTO que te permitía mandar el flujo del programa a la línea que quisieras, generando enseguida un lioso y complicado código espagueti. Pero lo que más me fascinó fueron los bucles FOR. A priori, parecían algo muy simplón. Si tienes que repetir algo muchas veces, en vez de tener que escribirlo una y otra vez, la sentencia FOR te ahorraba hacerlo. Pero luego fui descubriendo sus posibilidades. Podías crear contadores. Con la famosa “LET a = a + 1” (que luego se simplificaría por “a += 1” o “a++”, que da nombre al lenguaje C++) podías hacer secuencias de números. Es decir, el bucle FOR servía para generar cualquier secuencia, para ir almacenando una cantidad (como un acumulador) o como una alerta para cuando se llegue a un cierto valor (como un indicador). Pero es que además, y con esto lo flipé en colores, puedes anidar bucles FOR dentro de otros bucles FOR. Recuerdo que me pareció alucinante poder leer todos los valores de una matriz corriéndolos mediante dos bucles anidados, uno para las líneas y otro para las columnas ¡Había descubierto la recursividad! Pero es que, para más INRI, se podían combinar todos esos elementos. Podías meter IF dentro de los bucles; jugar con cadenas de texto; BASIC permitía funciones (de una línea eso sí); preguntas por pantalla con INPUT; tenías ese simpático sistema de guardar datos utilizando DATA y READ que no he vuelto a ver en otros lenguajes; podías también pintar y hacer música (fantástico el zumbador BEEP del Spectrum)… ¡Las posibilidades solo estaban limitadas por tu imaginación! Tengamos en cuenta que BASIC, a pesar de su simplicidad, es Turing completo, es decir, puede hacer todo lo que hace el supercomputador más potente que podáis imaginar. Mi pequeño Sinclair ZX Spectrum de 48 k de RAM y procesador Zilog Z80 a 3,5 Mhz era capaz de hacer lo mismo que la Fugaku de Fujitsu, con la única, si bien no trivial, diferencia de tiempo: lo que la Fugaku hace en milisegundos, el Spectrum lo haría en siglos…

El ser humano, ya lo hemos hablado muchas veces, se define por lo artificial. Su modo de sobrevivir más característico es la herramienta, el utensilio, el artificio, la máquina. Así, las manos son su adaptación por antonomasia: no son especialmente buenas para hacer nada, como lo serían las garras del tigre o las alas del pájaro, pero sin embargo, valen para hacer muchísimas cosas: son herramientas para hacer herramientas. Así, si el percutor y el bifaz fueron los instrumentos de los incipientes sapiens, los lenguajes de programación son los del hombre del XXI.

Los programas de Spectrum se guardaban en cintas de casete, y cuando querías cargarlos tenías que conectar un radiocasete al ordenador, darle al play y esperar un buen rato, a veces, más de media hora. En esas esperas tuve mi primer contacto con la aleatoriedad. Descubrí el comando RND que generaba un número pseudoaleatorio de ocho cifras entre 0 y 1. Me encantaba, sencillamente, diseñar generadores de frases que se articulaban aleatoriamente, lanzamientos de monedas, tiradas de dados… Recuerdo que tenía la ingenua idea de que todo funcionaba esencialmente así: el ser humano, el mundo… ¿Cómo tomamos decisiones los seres humanos? Mediante un mecanismo de toma de decisiones que, a veces, es determinista y, otras veces, ejecuta un RND. De alguna forma, y quién sabe si un poquito sea así, el lenguaje BASIC había atrapado la estructura de la realidad. Y, fíjate tú por dónde, estaba ante la clásica distinción entre apariencias y realidad que ha atravesado toda la historia de la filosofía occidental. Lo que observaba con mis sentidos es una capa postiza que envolvía la auténtica verdad: el código. Si Galileo decía que Dios había escrito el mundo en lenguaje matemático, yo pensaba que lo había hecho en BASIC.

Y luego ya cuando abandoné BASIC (todavía, por nostalgia, escribo de vez en cuando algunas líneas usando un emulador) y pasé a lenguajes de programación más serios (aprendí un poquito de C y de Java, pero al final me pasé a Python) mi fascinación ante el inabarcable abanico de posibilidades que proporcionaban no dejó de crecer. Me encantó la programación funcional, los módulos, las librerías. La idea es fantástica: haces un programita y lo dejas guardado para poder invocarlo cuando lo necesites. Además todo muy generoso y democrático: desarrolladores crean librerías llenas de esos programitas para que todo el mundo pueda utilizarlos gratuitamente. Hoy en día todo el que tenga un ordenador y una conexión a internet (entiendo que esto excluye, tristemente, a una buena parte de la población mundial) puede aprender programación y utilizar la inabarcable cantidad de recursos que pone la comunidad a su disposición ¿No me digáis que no es un logro sobresaliente en la democratización del conocimiento? Aprender a programar solo es cuestión de querer.

Me parecía muy sorprendente estar tratando con algo un tanto inexistente… ¿Dónde estaban esas líneas de código? No solo estaban en la pantalla como una imagen, pues podían hacer cosas, tenían poderes causales. Pero tampoco podía tocarlas, no eran netamente materiales. Era como estar en un mundo de entes abstractos, puros, el mundo inteligible de Platón, aún más cuando aprendí programación orientada a objetos: ¿Qué concepto hay que se parezca más a una idea platónica que el concepto de clase? (Podría ser muy interesante diseñar una programación orientada a objetos diferente, basada en otra ontología distinta ¿Qué tal en la ontología de procesos de Whitehead o, en general, en cualquier ontología en la que no existan los objetos en cuanto a tales? ¿No sería un buen tema para una tesis doctoral el diseño de un paradigma de programación basado en la teoría de sistemas de Bertalanffy o en la teoría de autómatas de Wolfram?). Termino esta entrada con unas bellas palabras del gran Frederick Brooks:

El programador, como el poeta, trabaja a poca distancia de las ideas puras. Levanta sus castillos en el aire, a partir de aire, creando a partir del ejercicio de la imaginación. Hay pocos medios de creación que sean tan flexibles, tan fáciles de pulir y reelaborar, tan capaces de hacer realidad al instante grandes estructuras conceptuales […] Y sin embargo, el concepto del programa, a diferencia de las palabras del poeta, es real en el sentido de que se mueve y funciona, produciendo resultados visibles separados del concepto mismo. Imprime resultados, dibuja imágenes, produce sonidos, mueve brazos. La magia del mito y la leyenda se ha vuelto realidad en nuestro tiempo.

Frederick Brooks citado por Marti Hearst en “Por qué los programas tienen virus”

Post scriptum: He descubierto que hay gente tan maravillosamente friki que da cursos de Sinclair Basic de forma completamente gratuita y desinteresada en Youtube. Es absolutamente genial. Y aquí encontré una serie de lenguajes de programación absurdos pero totalmente funcionales.

comentarios
  1. Josep Pradas dice:

    Yo me inicié con el ZX Sinclair, conectado a la televisión (UHF).

  2. Germanicus dice:

    Como bien sabes, Santiago, yo estoy, muy lenta y tímidamente introduciéndome en la informática, más que nada para aprender a manejar el bifaz de nuestros tiempos, que genera un interfaz con una nueva realidad propia de una caverna platónica (tu ya has expuesto muy bien la relación con Platón en la entrada). Cómo unas líneas de códigos generan esas “imágenes” en la pared de la caverna me maravilla. No aspiro a crear una inteligencia artificial, pero sí al menos a entender lo básico (BASIC!), ya sabes que mi mente del pleistoceno sigue rumiando más sobre sus propios fundamentos evolucionados (hardware y software de serie) que sobre lo que estos pueden proyectar fuera y “crear”. Pero las explicaciones que das sobre tus primeros contactos con la programación me animan aún más a querer saber sobre el tema. Instrucciones como IF o FOR, a+=1, me resultan familiares. Lógica, recursividad…un verdadero lenguaje.

  3. Fantástico artículo, muchas gracias por compartirlo. La filosofía del lenguaje y la poesía de la matemática. Verdaderamente, lo natural en el hombre es el artificio. Felicidades por esta entrada.

  4. Félix dice:

    Tal cual, Santiago. Yo me sentí así cuando descubrí el BASIC para programar en mi MSX II. Alucinante como reproducía la realidad. Estaba, en aquel momento, para mí, la realidad a punto de poder ser descrita… Me equivocaba. Me gané la vida con Pascal y con Clipper. Enseñé con Logo y he acabado con Python haciendo cosas para entretenerme. En Clipper algunos Hackers implementaron los Objetos, recuerdos una noche de sábado investigando y consiguiendo objetos y clases en Clipper. Alucinante, veía la Filosofía y la Programación como primas hermanas. En los seminarios de Filosofía de la Mente, a los ordenadores como laboratorios. Cuanto optimismo !! Ahora programas una App con App Inventor pero ya no es artesanía… Snif…

  5. Asier dice:

    Otro más que se siente completamente identificado con tus palabras, Santiago. Yo también empecé con el BASIC pero el que traía el MS-DOS en mi primer PC que fue un 386-SX a 33Mhz.
    Fui autodidacta y llegué a hacer aplicaciones de las que me sentí muy orgulloso: simples videojuegos, una base de datos, un programa para representar funciones gráficamente, etc. Todo muy artesanal y a mi manera, pero menuda satisfacción cuando consigues que funcione el programa y haga lo que quieres!

  6. derobpe dice:

    Muy interesante reflexión gracias por compartir. Enhorabuena.

  7. jajugon dice:

    Simpática mezcla de programación y filosofía. Comparto contigo esa inevitable mirada con la que he filtrado y reinterpretado tantas experiencias en mi vida.

    Me has hecho, además, recordar con los bucles FOR aquella conocida y fantástica definición de la recursividad: “Para entender lo que es la recursividad primero debes entender lo que es la recursividad”. 🙂

    ¡Enhorabena!

  8. jose luis herador collado dice:


    para entender la recursividad requieres de la retroactividad…

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s