El HTML no es un lenguaje de programación.
He escuchado esa frase muchas veces y es agotadora. Normalmente, va seguida de algo como “No tiene lógica” o “No es Turing completo“, así que… obviamente no es un lenguaje de programación. Como si fuera un caso cerrado y debiera ser el final de la conversación.
¿Pero, debería serlo?
A continuación, se examinará los argumentos típicos que oigo utilizar para menospreciar el HTML y ofrecer ciertas refutaciones para demostrar que esas afirmaciones no son del todo correctas.
El objetivo no es demostrar que HTML es o no es un lenguaje de programación, sino mostrar que los tres principales argumentos utilizados para afirmar que no lo es son defectuosos o incorrectos, lo que invalida la conclusión desde un punto de vista lógico.
“HTML es un lenguaje de marcado, no un lenguaje de programación”
Esta afirmación, por sí sola, suena muy bien… pero, es errónea: los lenguajes de marcado pueden ser lenguajes de programación. No todos lo son (la mayoría no lo son) pero, pueden serlo. Si dibujáramos un diagrama de Venn de los lenguajes de programación y los lenguajes de marcado, no serían dos círculos separados, sino dos círculos que se cruzan ligeramente:
Un lenguaje de marcado que opera con variables, tiene estructuras de control, bucles, etc., también sería un lenguaje de programación. No son conceptos mutuamente excluyentes.
TeX y LaTeX son ejemplos de lenguajes de marcado que también se consideran lenguajes de programación. Puede que no sea práctico desarrollar con ellos, pero es posible. Y podemos encontrar ejemplos en Internet, como un BASIC interpreter o un controlador para Mars Rover (que ganó el premio del jurado en el concurso de programación del ICFP 2008).
Aunque algunos lenguajes de marcado podrían considerarse lenguajes de programación, no estoy diciendo que HTML sea uno de ellos. La cuestión es que la afirmación original es errónea: los lenguajes de marcado pueden ser lenguajes de programación. Por lo tanto, decir que HTML no es un lenguaje de programación porque es un lenguaje de marcas se basa en una afirmación falsa, y cualquier conclusión a la que se llegue a partir de esa premisa será categóricamente errónea.
“El HTML no tiene lógica”
Esta afirmación exige que aclaremos qué significa “lógica”, porque la definición podría sorprenderte.
Al igual que ocurre con Turing completo (a la que sin duda llegaremos), los que ponen este argumento sobre la mesa parecen no entender qué es exactamente. He pedido a la gente que me diga qué quiere decir con “lógica” y he recibido respuestas interesantes como:
La lógica es una razón o forma de pensar sensata.
Eso está bien si lo que buscamos es una definición de lógica en un diccionario. Pero, estamos hablando de lógica de programación, no sólo de lógica como término general. También he recibido respuestas como:
Los lenguajes de programación tienen variables, condiciones, bucles, etc. El HTML no es un lenguaje de programación porque no puede utilizar variables ni condiciones. No tiene lógica.
Esto está muy bien (y definitivamente es mejor que meterse en el true/false/AND/OR/etc.), pero también es incorrecto. HTML tiene variables – en forma de atributos – y hay estructuras de control que pueden ser usadas junto con esas variables/atributos para determinar lo que se muestra.
¿Pero, cómo se controlan esas variables? Se necesita JavaScript.
Otra vez equivocado. Hay algunos elementos HTML que tienen una lógica de control interna y no requieren JavaScript o CSS para funcionar.
Y no estoy hablando de cosas como <link> o <noscript> – que son estructuras de control rudimentarias y han sido parte del estándar durante décadas. Me refiero a elementos que responderán a la entrada del usuario y realizarán acciones condicionales dependiendo del estado actual del elemento y del valor de una variable.
Tomemos como ejemplo la tupla <details>
/<summary>
o el elemento <dialog>
: cuando un usuario haga clic en ellos, se cerrarán si el atributo open
está presente, y se abrirán si no lo está. No se requiere JavaScript.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title></title>
</head>
<body>
<dialog id="dialog1" open>
<h2>Esto es un <code><dialog></code> HTML</h2>
<p>
Como elemento HTML, te vendría bien algo de <i>cariño</i>. Pero es un ejemplo de un elemento que tiene cierta lógica.
</p>
<p>Puedes cerrarlo (pero no abrirlo 😓) sólo con HTML, sin
necesidad de una sola línea de CSS o JS.
</p>
<form method="dialog" action="#dialog1">
<button>Cerrar diálogo</button>
</form>
</dialog>
<details open>
<summary>Otro ejemplo de estructuras HTML</summary>
<div>
<p>
<b>¡Adivinaste!</b> con <code><details></code>
y <code><summary></code> puedes definir alguna lógica
básica <strong>sólo con HTML</strong>. No hay necesidad de código
JavaScript o CSS hacks.
</p>
<p>
Haz clic en el título de esta sección para abrir/cerrar la estructura de
details/summary structure. Sencillo, ¿no?
</p>
</div>
</details>
</body>
</html>
Así que decir por sí solo que HTML no es un lenguaje de programación porque carece de lógica es engañoso. Sabemos que HTML es capaz de tomar decisiones basadas en las entradas del usuario. HTML tiene lógica, pero es inherentemente diferente de la lógica de otros lenguajes que están diseñados para manipular datos. Necesitaremos un argumento más sólido que ese para demostrar que HTML no es una forma de programación.
“El HTML no es ‘Turing completo'”
Bien, esta es la que vemos más a menudo en este debate. Es técnicamente correcto (el mejor tipo de corrección) decir que HTML no es Turing Completo, pero debería suscitar un debate más amplio que el de utilizarlo simplemente como una declaración para cerrar el caso.
No voy a entrar en la maleza de lo que significa ser Turing completo porque hay un montón de recursos sobre el tema. De hecho, Lara Schenck lo resume muy bien en un post donde argumenta que el CSS es Turing completo:
En términos sencillos, para que un lenguaje o una máquina sea Turing completo, significa que es capaz de hacer lo que podría hacer una máquina de Turing: realizar cualquier cálculo, es decir, un cálculo universal. Al fin y al cabo, la programación se inventó para hacer cálculos matemáticos, aunque ahora hacemos muchas más cosas con ella, por supuesto.
Como la mayoría de los lenguajes de programación modernos son completos de Turing, la gente utiliza eso como definición de un lenguaje de programación. Pero, el Turing completo no es eso. Es un criterio para identificar si un sistema (o su conjunto de reglas) puede simular una máquina de Turing. Puede utilizarse para clasificar los lenguajes de programación, pero no los define. Ni siquiera se aplica exclusivamente a los lenguajes de programación. Tomemos, por ejemplo, el juego Minecraft (que cumple ese criterio) o el juego Magic: El encuentro (que también cumple el criterio). Ambos son Turing completos, pero dudo que alguien los clasifique como lenguajes de programación.
La completitud de Turing está de moda en estos momentos, de la misma manera que en el pasado algunos consideraban que la diferencia entre los lenguajes compilados y los interpretados era un buen criterio. Sí. No tenemos que hacer un gran esfuerzo de memoria para recordar cuando los desarrolladores (principalmente de back-end) restaban importancia a la programación de front-end (incluyendo JavaScript y PHP) como si no fuera “programación real”. Todavía se oye a veces, aunque ahora desvanecido, entre dientes, y murmurado.
La definición de lo que es (o no es) la programación cambia con el tiempo. Apuesto a que alguien que clasifica tarjetas perforadas se queja de que escribir código en ensamblador no es verdadera programación. No hay nada universal ni escrito en piedra. No hay una definición real.
El Turing completo es un estándar justo, debo decir, pero uno que es sesgado y subjetivo – no en su forma sino en la manera en que se elige. ¿Por qué un lenguaje capaz de generar una Máquina Completa de Turing se remacha como “lenguaje de programación” mientras que otro capaz de generar una Máquina de Estado Finito no lo es? Es subjetivo. Es una excusa como otra cualquiera para diferenciar entre los “verdaderos desarrolladores” (los que hacen la reivindicación) y los inferiores a ellos.
Para colmo de males, es obvio que muchas de las personas que repiten como loros el mantra de que “el HTML no es Turing completo” ni siquiera saben o entienden lo que significa el Turing completo. No es un premio ni un sello de calidad. No es una insignia de honor. Es sólo una forma de categorizar los lenguajes de programación, de agruparlos, no de definirlos.
Un lenguaje de programación puede ser Turing completo o no, del mismo modo que puede ser interpretado o compilado, imperativo o declarativo, procedimental u orientado a objetos.
Entonces, ¿es HTML un lenguaje de programación?
Si podemos desvirtuar los principales argumentos que afirman que HTML no es un lenguaje de programación, ¿significa eso realmente que HTML es un lenguaje de programación? No, no lo es. Y así, el debate seguirá vivo hasta que el estándar HTML evolucione o la “definición actual” de lenguaje de programación cambie.
Pero, como desarrolladores, debemos desconfiar de esta pregunta, ya que, en muchos casos, no se utiliza para suscitar un debate serio, sino para suscitar la polémica ocultando segundas intenciones: desde conseguir reacciones fáciles en Internet, hasta disminuir peligrosamente la contribución de un grupo de personas al ecosistema del desarrollo.
Independientemente de la postura que adoptemos en la discusión “HTML es/no es un lenguaje de programación“, vamos a celebrarlo y a no negar su importancia: HTML es la columna vertebral de Internet. Es un hermoso lenguaje con una amplia documentación y una extensa sintaxis, pero tan sencillo que puede aprenderse en una tarde, y tan complejo que se necesitan años para dominarlo. Lenguaje de programación o no, lo que realmente importa es que tenemos HTML en primer lugar, y que puedes aprenderlo en HTMLDESDECERO.
[…] HTML es un lenguaje de marcado que permite anotar contenidos para su visualización en un navegador web. La mayoría de la gente no lo considera un lenguaje de programación porque no contiene realmente instrucciones y no admite funcionalidades básicas como las sentencias condicionales, como muchos lenguajes de programación de propósito general. […]
Hola… me llamó la atención tu declaración. Me hace preguntarme porque no considerarías o instrucciones… que no sean la típica instrucción en forma de una función o procedimiento es otro tema, a mi juicio… ¿que opinas amigo?
Hola, podrías explicarlo nuevamente?