Sobre la temporalidad del código

8 de octubre de 2021 • fjbalon

Recientemente, he leído el post Why I Write Games in C (yes, C). Me ha llamado poderosamente la atención, y me he visto identificado con su argumentación. Soy un amante de la programación en C, y por ello quería destacar algunos aspectos del post.

Tal y como indica el autor, hay cosas que no son negociables; y una de ellas es la temporalidad, o vida útil del programa. Flash es un ejemplo de una tecnología muerta, y todo lo escrito en ella, debió haberse portado a otros lenguajes y tecnologías. Tanto en el caso del autor como en el mío, eso no es una característica deseable. Cuando se escribe un programa, éste debe tener una proyección de vida larga y útil. Requerimos un lenguaje que perdure en el tiempo.

Unido a lo anterior, el software no puede estar atado a un sistema operativo concreto. Los sistemas podrían cambiar (aunque defiendo el mismo aspecto de temporalidad para ellos), necesitamos un lenguaje portable que permita ser ejecutado en múltiples sistemas y arquitecturas.

Pero para que se dé este aspecto de temporalidad, es necesario que se cumplan algunos requisitos, como fiabilidad, simplicidad, estabilidad -que no cambie sus características fundamentales continuamente-, robustez, eficiencia en cuanto a rendimiento, buena velocidad de compilación.

Por otro lado, no soy un converso de la OOP. Y eso que he pasado la mayor parte de mi vida profesional y académica trabajando con clases y objetos, pero cuanto más tiempo paso, menos entiendo por qué. La programación orientada a objetos es el paradigma más usado en la actualidad, basándose en técnicas de herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento. Se hace innecesariamente complicado y complejo. Por lo que la programación estructurada será mi amiga.

Me gusta distinguir entre viejo software y software viejo. En castellano, colocar el adjetivo delante del sustantivo suele denotar una actitud poética, circunstancial del ser. Sin embargo, colocarlo detrás suele marcar un atributo que tiene. El software viejo es un software que, como atributo tiene una larga edad, y eso le pesa, es una cualidad de éste. Un viejo software es un programa que ha perdurado en el tiempo, inmutable, inmanente, como una roca. Lo viejo está hecho para permanecer, como aquel viejo castillo medieval que soporta el paso del tiempo; sin embargo una casa de 1980 se ve vieja -en el mal sentido-, deteriorada y pronto será derribada.

El viejo software, como el viejo hombre, no requiere de añadidos, de adornos innecesarios, de evolutivos constantes, de adaptaciones. El viejo software es un constante en sí, una robusta fortaleza, un acorazado del mundo abstracto.

Eric Roth, guionista de Dune (la de Denis Villeneuve) o Forrest Gump, utiliza para escribir sus guiones Movie Master de MS-DOS (un software con más de 30 años). Para el guionista el viejo software tiene una cierta mitología; el programa da la posibilidad de escribir sólo hasta 40 páginas -lo que le ayuda a estructurar sus guiones, "Me doy cuenta de que si no he expresado lo que tenía en mente en 40 páginas empiezo a tener problemas"-, el hecho de que su viejo ordenador no esté conectado a Internet le elimina de distracciones, como él mismo asegura, y añado yo, le da una cierta capa de aislamiento y seguridad. George R. R. Martin, padre de Juego de Tronos, también utiliza viejo software, en su caso WordStar 4.0, para DOS. Disfruta de su simplicidad y no le gustan los autocorrectores y correctores ortográficos modernos. "Si quisiera una mayúscula, habría escrito una mayúscula. Sé cómo funciona la tecla de mayúsculas".

MOCAS es el nombre dado al software de Mecanización de los Servicios de Administración de Contratos, un programa escrito nada menos que en 1958, y que sigue en servicio para el Departamento de Defensa de los Estados Unidos, escrito en COBOL sobre una base de tarjetas perforadas. También el software de las naves Voyager, de 1977 (las naves espaciales Voyager 1 y 2 fueron lanzadas rumbo al exterior del Sistema Solar). El software de a bordo de las naves Voyager más modernas, encargado entre otras cosas de enviar a la Tierra los datos recogidos en su viaje, ha seguido funcionando, y aunque mejorado, nunca ha sido sustituido por otro. Sparker Filters, compañía dedicada a la filtración química y una de las más reputadas del sector, utiliza un IBM 402, un modelo que data de 1948 y que probablemente sea el último en activo en todo el planeta.

Unix y su filosofía es también parte de lo que considero viejo software, así como sus hijos y nietos: FreeBSD, GNU/Linux, Solaris... Desde finales de 2009, GNU/Linux domina de forma absoluta el listado de los 500 superordenadores más potentes del mundo. El resto corresponden a variantes de Unix. En la actualidad la familia de Unix es el claro líder de la supercomputación. Además la simplicidad de estos sistemas permiten usarlos también en viejos equipos, obsoletos y deteriorados. Yo mismo utilizo un GNU/Linux Slackware en un Toshiba Satellite de hace 20 años, que abandera mi pensamiento y mi planteamiento. La tecnología debe buscar perdurar, no desecharse para alimentar más al mercado.

C es la viva imagen de la filosofía Unix. De hecho, crecieron juntos en simbiosis. Es un pura sangre, veloz y eficiente, con él se puede hacer prácticamente todo lo que el hardware permite realizar. Fue desarrollado por Dennis Ritchie, que tiene además la importante paternidad, junto a Ken Thompson, de Unix. También fue coautor junto a Brian Kernighan del manual El lenguaje de programación C, que durante años fue el estándar de facto del lenguaje (K\&R C), hasta la aparición del ANSI C (para el que apareció la segunda edición de El lenguaje de Programación C) a principios de la década de los 70 en Bell Labs. C nace como evolución natural del lenguaje B (de ahí su nombre).

Uno de los objetivos de diseño del lenguaje C es que solo sean necesarias unas pocas instrucciones en lenguaje máquina para traducir cada elemento del lenguaje, sin que haga falta un soporte intenso en tiempo de ejecución. Es muy posible escribir C a bajo nivel de abstracción; de hecho, C se usa como intermediario entre diferentes lenguajes.

En parte, a causa de ser de relativamente bajo nivel y de tener un modesto conjunto de características, se pueden desarrollar compiladores de C fácilmente. En consecuencia, el lenguaje C está disponible en un amplio abanico de plataformas (más que cualquier otro lenguaje). Además, a pesar de su naturaleza de bajo nivel, el lenguaje se desarrolló para incentivar la programación independiente de la máquina. Un programa escrito cumpliendo los estándares e intentando que sea portátil puede compilarse en prácticamente cualquier computador.

En palabras del autor del artículo que fundamenta este texto, «C es peligroso, pero es fiable. Un afilado cuchillo que puede cortarte los dedos como verduras, pero tan simple que no es demasiado difícil aprender a usarlo con cuidado».