Creación de mundos en lenguaje C# orientado a objetos / elucubraciones

programacion lenguaje c mundo

En mi rosicler infancia tenía en el armario una caja con unas mil piezas de Tente, una especie de alternativa de los 90 a Lego. Con ellas pasaba tardes enteras dedicadas a la construcción de edificios y, sobre todo, de vehículos que sistemáticamente hacía chocar entre sí. El problema: cada navidad y cada cumpleaños desde 1990 hasta por lo menos 1995 pedí en vano nuevas piezas de construcción Tente. Mi padre me lo explicó claramente cuando tenía 6 años: “Tente ha quebrado y ya no fabrican piezas”. Pero no por ello dejé de pedirlas. Por lo tanto, esas 1000 piezas que de que disponía fueron el total absoluto de piezas de mi infancia a disposición para construir. El límite. En mis sueños nocturnos imaginaba edificaciones monumentales, pero en la vigilia debía claudicar ante la insalvable frontera que representaban esas 1000 piezas y la imposibilidad, según padre, de adquirir nuevas.

En conclusión, debido a la escasez infantil nunca pudo realizarse plenamente la fantasía constructora. De hecho, quizá por esa propia escasez material surgió la voluntad inmaterial de la escritura: imaginación a cambio de sustancia, quid pro quo. Pero la fantasía constructora perdura y como anhelo es también fuente de impulso. Durante mucho tiempo me entregué precisamente a videojuegos del tipo “simulador de construcción” (de ciudades, de edificios, de coches, de trenes, etc). En ellos edifiqué mucho. Pero el anhelo tampoco fue colmado. La última parada en este sinuoso recorrido en busca del objeto perdido (la pieza de Tente nunca obtenida) ha sido el lenguaje de programación C#.

Tal y como una vez me ocurrió con los libros: un día estaba delante del ordenador jugando a un simulador de construcción de ciudades cuando percibí un hastío existencial notorio. El simple hecho de jugar, como el simple hecho de leer, de pronto no me bastaba. Mientras jugaba, empecé a preguntarme cuáles serían los engranajes del videojuego que tenía en pantalla, y si esos engranajes constituían un lenguaje creativo. Me figuré qué posibilidades ofrecía aquello y empecé a investigar.

Los primeros pasos fueron fraudulentos. Descubrí que el lenguaje de programación más popular en entornos de videojuegos y Windows es C#. Me apunté a un curso especializado en “crear videojuegos” con Unity -programa para crearlos-, y me lancé al estudio de la sintaxis y gramática de C#.

A las dos semanas lo había abandonado. Primero, porque no entendía nada. Lo que tenía delante era una lógica distinta. Comprenderla y manejarla implicaba adoptar posiciones nuevas en la mente. Segundo, porque había una presencia importante de matemáticas: movido por el prejuicio me vi incapaz a priori de afrontar el reto. Además, en mi entorno había escepticismo: tengo 32 años y cuestiones como la programación se imaginan vocacionales, no tardías.

Sin embargo, el abandono fue temporal. Tan sólo una retirada. Pues regresé con fuerza hace unas semanas al estudio habiendo aniquilado todo prejuicio, toda imposibilidad y todo bloqueo tras un verano de riguroso vampirismo, y me inicié finalmente en el mundo del lenguaje C#. El objetivo: capturar el anhelo antañón: la creación de mundos a través de piezas, esta vez infinitas por imposibilidad de quiebra.

El lenguaje C# es un lenguaje orientado a objetos. Con él, podemos representar cualquier cosa que imaginemos. Pongamos un ejemplo que yo mismo he seguido, y que desarrollaremos poco a poco. La posición inicial es la del programador sentado ante un proyecto vacío de Unity. Este programador quiere hacer algo en apariencia ambicioso: crear un mundo. ¿Qué es lo que hace? En primer lugar, imagina cuál será ese mundo y cuáles serán sus variables. Nuestro mundo será una rejilla de 100×100 cuadrados (cada cuadrado de 32×32 píxeles), es decir, un mundo 2D (x e y). Este mundo sólo tendrá dos tipos de terrenos: hierba y vacío. En principio, no contendrá nada más.

De acuerdo con estos datos, el programador crea diversos objetos. El primero, es el objeto Mundo. Este objeto contendrá a su vez un conjunto de dos objetos reunidos en la clase Baldosas: hierba y vacío. Estos objetos, una vez diseñados, se ponen en juego a través de un controlador que los formaliza (hace visibles). Este controlador conoce la definición que hemos hecho de mundo, y lo renderiza utilizando las baldosas. En nuestro caso, el controlador utiliza un método procedural (la disposición de las baldosas es aleatoria). Este es el mundo primero, simple y esencial, pero otro mundo en todo caso dentro de la simulación:

unity programacion lengua

Los cuadrados verdes son baldosas de hierba, y los cuadrados vacíos son baldosas de espacio Vacío. Es un mundo simple y sin duda bastante tonto, pues en él no hay nada más que él mismo, de momento. Los objetos interactúan entre sí de manera orgánicas: unos invocan partes de otros en la ejecución. En caso de errores, el lenguaje ofrece salidas al programa, es decir, toda anomalía puede ser prevenida y el programa puede contener métodos que solucionen problemas sobre la marcha.

En principio, si nos fijamos en lo esencial, tenemos una concepción del mundo claramente dualista, pues el fundamento es el 0 y el 1. Sin embargo, el estudio del lenguaje me mostró algunas virtudes específicas que encuentro extrañas y de valor inestimable. En C# se puede tener un estilo. Quien domina el lenguaje es capaz de expresar las instrucciones y definir los objetos con un rango mayor de creatividad, por un lado, y de efectividad técnica por el otro. Puesto que todo programa lo ejecuta un procesador con una capacidad limitada, la eficiencia técnica es un valor, así como la capacidad de expresar más con menos. Al mismo tiempo, mientras se da una conceptualización por completo abstracta y se escribe el código que define un mundo acotado (una versión de realidad), se compone el apartado visual que es el resultado material -en la simulación- del mundo. En la expresión simbólica, en el programador se materializa la insalvable transición de la idea a la cosa, aunque sólo sea la cosa proyectada en pantalla.

Un pasaje de código:

lenguaje c programación

Este pedazo de código corresponde al controlador que ejecuta el mundo y lo renderiza (nos lo muestra: transforma el concepto en cosa). Con // se pueden escribir en medio del código comentarios que el programa no lee: si os fijáis en los // veréis paso a paso qué hace cada parte. Lo primero, se invoca el objeto Mundo. A continuación, se le indica cómo va a generarse (con un sistema procedural), y finalmente se invocan las baldosas, por un lado, y sus correspondientes imágenes por otro (la hierba), y la idea toma sustancia. Nuestra idea en particular, es tosca, pero permite comprender el gran rango de posibilidades del lenguaje. El poder contemplar, aunque fuera en un espacio ficcional, cómo una idea tomaba sustancia, ha sido una de las experiencias más relevantes de los últimos tiempos, hasta el punto de llegar a considerarlo incluso un procedimiento curativo de la disposición neurótica -principalmente la mía: no soy doctor.

¿Cómo distinguimos aquí el estilo? Pongamos un ejemplo. Si en nuestro programa permitimos que, de vez en cuando, una baldosa cambie (por ejemplo, que pase de ser hierba a vacío), tendremos que programar un código que enseñe al programa a revisar cada X tiempo todos los objetos de tipo Baldosa del programa para ver si se han dado cambios en ellos y para, en consecuencia, renderizar dichos cambios. Un programador torpe plantearía un método que cada X tiempo rastreara los 10.000 objetos que componen nuestro mundo y, uno por uno, les preguntara: “Oye, ¿has cambiado?”. El programador hábil lo enfocaría de otra manera: en lugar de un rastreo desde fuera, programaría una aviso desde dentro. El programador hábil diría: cada vez que un objeto cambie, será el propio objeto el que lo anuncie. De esta manera, el programa se ahorra 10.000 preguntas de golpe y obtiene una función equivalente mucho más fluida. Se podrían tomar otros caminos, pues la sintaxis y la gramática de C# lo permiten, y cada uno de ellos diría mucho de su creador, desde el nivel del código hasta el nivel final de la renderización. Lo que se observa en todo caso es esencial, en mi opinión: cuando uno penetra en los entresijos del código se desvanece la imagen binaria, abrupta, que uno tenía en la fantasía de la programación. Aparece un mundo orgánico de cuerpos que se invocan y se manosean entre sí de forma orgánica. Los objetos no son diamantes internos incrustados en la cochambre accidental de todas sus relaciones. Las relaciones son también el objeto, tal y como lo verían filósofos como Latour o Whitehead (Cuando fuimos modernos o Proceso y realidad, dos libros de estos hombres donde se habla del tema). Sería cometido de un filósofo con mayores competencias que yo el realizar un estudio ontológico del lenguaje C#, sin dejar de notificar que existen lenguajes cuyos planteamientos y definiciones conceptuales de lo que es un objeto, se amoldan a una u otra visión filosófica del tema, la Ontología orientada a Objetos, un tema de debate enconado y posiciones opuestas e irreconciliables en el campo de la filosofía.

Hará falta todavía algo más de pericia para sentir, efectivamente, que algo ha sido creado de la nada en este contexto (ahora mismo, gran parte del código es copiado). Y habrá que ver también qué papel juega en todo esto mi interés principal y mi competencia destacada, la escritura. El texto se renderiza en la cabeza, por lo que entiendo que la posición del acto imaginativo es distinta en escritura y en programación. Y por eso mismo complementaria. Y también habrá que ver si el recuerdo lejano de ese límite impuesto de piezas de Tente, se quiebra.

 

1 comentario
  1. Rafa
    Rafa Dice:

    Hola,

    Me ha encantado tu entrada. Es muy interesante ver cómo alguien del mundo de la literatura se adentra en el mundo de la de programación.

    Sin duda los conocimientos de filosofía y lógica del lenguaje son de ayuda para comprender estos nuevos lenguajes 🙂

    Mucha suerte con tu Tente virtual!

    Responder

Dejar un comentario

¿Quieres unirte a la conversación?
Siéntete libre de contribuir

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *