En StackOverflow se preguntan por qué los programadores se ponen tan 'pedantes' con ese tema
La clave de la solución la tiene... ¿Alan Turing?
En el mundo de la programación lleva mucho tiempo vigente un debate acerca de si los lenguajes HTML y CSS, que son la base del desarrollo web, son o no 'lenguajes de programación'. Sea en discusiones online o no, no es infrecuente encontrarnos con programadores de lenguajes de programación 'de verdad' siendo cortantes cuando oyen a alguien sugerir que sabe programar sólo porque ha aprendido HTML.
En StackOverflow, de hecho, se preguntan por qué tienden a ser "tan pendantes" con este tema, mientras que algunos diseñadores web consideran que los programadores con 'pedigree' son demasiado dogmáticos en su definición de lenguajes.
Pero no se trata de un debate baladí: a nivel técnico, es importante tener claro qué constituye un lenguaje de programación y qué no lo hace. Y también tener claro qué son realmente capaces de hacer HTML y CSS, para despejar cualquier duda sobre la etiqueta más correcta a aplicarles.
Lo primero que hay que tener claro es qué criterio utilizar para decidir qué es un lenguaje de programación y qué no. Y el más habitual y tradicional para ello es la capacidad de un lenguaje para ser 'Turing-completo'. Pero, ¿qué demonios es eso?
¿Turing-Qué?
Un lenguaje de programación se considera Turing-completo cuando tiene la capacidad de realizar cualquier cálculo que una Máquina de Turing pueda llevar a cabo. La pregunta es obvia, entonces, es "¿Qué es una Máquina de Turing?".
Como habrás supuesto ya, el Turing al que no dejamos de hacer referencia es Alan Turing, el padre de la computación moderna, popularizado por su trabajo con las computadoras Enigma durante la Segunda Guerra Mundial.
Pero esas no son las máquinas a las que nos referimos, sino a un dispositivo abstracto que Turing teorizó en 1936, que contaba con las siguientes características:
- Consta de una cinta infinita dividida en celdas, una cabeza de lectura/escritura que se mueve a lo largo de la cinta y un conjunto finito de estados y reglas de transición.
- Puede leer y escribir símbolos en la cinta, cambiar de estado según las reglas y moverse hacia la izquierda o la derecha.
Esta descripción puede parecer simple, pero es una abstracción utilísima con la que Turing demostró que -si bien hay problemas que, efectivamente, una computadora nunca podrá resolver- si un problema puede resolverse mediante un algoritmo, puede resolverse con una máquina de Turing.
Por lo tanto, ser 'Turing-completo' significa que el lenguaje en cuestión debe ser capaz de simular cualquier algoritmo de computación, realizando para ello tres tareas fundamentales:
- Leer y escribir sobre un medio de almacenamiento.
- Controlar el flujo de ejecución mediante instrucciones condicionales (como if/else) y bucles (como for o while).
- Modificar su propio código o estado durante la ejecución.
Tres ejemplos rápidos de lenguajes Turing-completos serían Python, Java y C++.
HTML y CSS, sin embargo, no cumplen con estos criterios: HTML es un lenguaje de marcado utilizado para estructurar contenido en la web, mientras que CSS es un lenguaje de estilo usado para describir la presentación visual de un documento HTML.
HTML y CSS, más de lo que parecen (¿pero no lo suficiente?)
HTML: El HTML ha sido la columna vertebral de la web desde sus inicios. A primera vista, HTML puede parecer un lenguaje simple que se limita a definir encabezados, párrafos y enlaces, pero en realidad, ha evolucionado para incorporar elementos más avanzados, como multimedia, formularios interactivos con elementos de entrada y validación, almacenamiento local...
CSS: Por otro lado, el CSS se encarga de dar estilo y formato a los elementos HTML. Más allá de ser simplemente un conjunto de instrucciones de presentación estática, CSS también involucra el uso de conceptos lógicos: los 'media queries', son reglas condicionales que permiten que las páginas web se adapten a diferentes tamaños de pantalla y dispositivos. Han existido incluso exploits para vulnerabilidades de Mozilla Firefox basados únicamente en CSS.
Pero nada de esto basta para convertirlos en lenguajes Turing-completos. Así que, ¿hay más que argumentar o terminamos aquí la discusión sobre si son o no lenguajes de programación?
¡Tenemos un último testigo, señoría!
Un desarrollador web llamado Eli Fox-Epstein presentó una forma de simular la Regla 110 utilizando CSS y HTML en un evento llamado Hack && Tell en 2011. Dicha 'Regla' es un modelo de autómata celular (un patrón unidimensional compuesto por varios unos y ceros, que van evolucionando de acuerdo a ciertos patrones) creado por Stephen Wolfram que, pese a su extraordinaria simplicidad, en 2004 se demostró que es Turing-completo.
La simulación de Rule 110 en CSS se basa en la idea de que el código CSS puede representar el estado de las células en un autómata celular, y las interacciones de los elementos HTML pueden simular las reglas de transición de Rule 110. Cada paso del autómata celular se ejecuta mediante cambios en el DOM (Modelo de Objetos del Documento) y se aplican reglas de estilo condicionales en CSS para representar los cambios de estado.
En este enlace tienes todos los detalles necesarios (fragmentos de código incluidos) para comprender este peculiar experimento.
Lo que nos interesa es que si un modelo de autómata celular Turing-completo puede ser simulado con CSS3 y HTML5, eso significa que, si no ambos lenguajes, la suma de ambos sí puede considerarse Turing-completo... y, por tanto, un lenguaje de programación con todas las de la ley.
Imagen | Marcos Merino mediante IA + Foto de Alan Turing (dominio público)
En Genbeta | Escribe en once lenguajes de programación sabiendo sólo uno de ellos con esta herramienta web
Ver todos los comentarios en https://www.genbeta.com
VER 5 Comentarios