¿HTML no es un lenguaje de programación? | Programar Plus

HTML no es un lenguaje de programación.

He escuchado esa frase tantas veces y es agotador. Normalmente, va seguido de algo como, No tiene lógica, o, No es Turing completo,. Entonces… obviamente no es un lenguaje de programación. Como si estuviera cerrado y debería ser el final de la conversación.

Sin embargo, ¿debería serlo?

Quiero ver los argumentos típicos que escucho que se usan para menospreciar el HTML y ofrecer mis propias refutaciones para mostrar cómo esas afirmaciones no son completamente correctas.

Mi El objetivo no es demostrar que HTML es o no un lenguaje de programación., pero para mostrar que los tres argumentos principales utilizados para afirmar que no lo es son defectuosos o incorrectos, invalidando así 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 genial … pero está mal: 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 lenguajes de programación y 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 online, como un intérprete BASIC o un controlador Mars Rover (que ganó el premio de los jueces en el concurso de programación ICFP 2008).

Si bien algunos lenguajes de marcado pueden considerarse lenguajes de programación, no estoy diciendo que HTML sea uno de ellos. El punto es que la declaración original es incorrecta: lenguajes de marcado poder ser lenguajes de programación. Por lo tanto, decir que HTML no es un lenguaje de programación porque es un lenguaje de marcado se basa en una declaración falsa, y cualquier conclusión a la que llegue a partir de esa premisa será categóricamente incorrecta.

“HTML no tiene lógica”

Esta afirmación exige que aclaremos lo que significa “lógica” porque la definición podría simplemente sorprenderlo.

Al igual que con la completitud de Turing (a la que definitivamente llegaremos), aquellos que traen este argumento a la mesa parecen malinterpretar qué es exactamente. Le pedí a la gente que me dijera qué quieren decir con “lógica” y obtuve respuestas interesantes como:

La lógica es una razón o forma de pensar sensata.

Eso es bueno si lo que estamos buscando es una definición de diccionario de lógica. Pero estamos hablando de lógica de programación, no solo de lógica como término general. También he recibido respuestas como:

Los lenguajes de programación tienen variables, condiciones, bucles, etc. HTML no es un lenguaje de programación porque no puede usar variables o condiciones. No tiene lógica.

Esto está bien (y definitivamente mejor que entrar en true/false/AND/OR/ etc.), pero también incorrecto. HTML tiene variables, en forma de atributos, y hay estructuras de control que se pueden usar junto con esas variables / atributos para determinar qué se muestra.

Pero, ¿cómo controlas esas variables? ¡Necesitas JavaScript!

Nuevamente incorrecto. Existen algunos elementos HTML que tienen lógica de control interno 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 según el estado actual del elemento y el valor de una variable. Toma el <details>/<summary> tupla o la <dialog> elemento como ejemplos: cuando un usuario hace clic en ellos, se cerrarán si el open El atributo está presente y se abrirán si no lo está. No se requiere JavaScript.

Así que decir solo que HTML no es un lenguaje de programación porque carece de lógica es engañoso. Sabemos que HTML es realmente capaz de tomar decisiones basadas en la entrada 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 fuerte que ese para demostrar que HTML no es una forma de programación.

“HTML no es ‘Turing completo'”

Bien, este es el que vemos con más frecuencia en este debate. Es técnicamente correcto (el mejor tipo de correcto) decir que HTML no es Turing completo, pero debería generar un debate más grande que simplemente usarlo como una declaración de cierre de caso.

No voy a meterme en la maleza sobre lo que significa ser Turing completo porque hay muchos recursos sobre el tema. De hecho, Lara Schenck lo resume muy bien en una publicación donde argumenta que CSS es Turing completo:

En los términos más simples, para que un lenguaje o 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, también conocido como computación universal. Después de todo, la programación se inventó para hacer matemáticas, aunque ahora hacemos mucho más con ella, ¡por supuesto!

Debido a que la mayoría de los lenguajes de programación modernos son Turing completos, la gente lo usa como la definición de un lenguaje de programación. Pero la completitud de Turing no es eso. Es un criterio para identificar si un sistema (o su conjunto de reglas) puede simular una máquina de Turing. Puede usarse para clasificar lenguajes de programación; no los define. Ni siquiera se aplica exclusivamente a los lenguajes de programación. Tomemos, por ejemplo, el juego Minecraft (que cumple con ese criterio) o el juego de cartas Magic: The Gathering (que también cumple con 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 este momento de la misma manera que algunos en el pasado consideraban que la diferencia entre lenguajes compilados e interpretados era un buen criterio. Si. No tenemos que hacer un gran esfuerzo de memoria para recordar cuándo los desarrolladores (principalmente back-end) minimizan la programación de front-end (incluidos JavaScript y PHP) como no “programación real”. Todavía lo escuchas a veces, aunque ahora se desvanece, murmura y murmura.

La definición de lo que es (o no es) la programación cambia con el tiempo. Apuesto a que alguien que revisaba tarjetas perforadas se quejó de que escribir código en ensamblador no era una programación real. No hay nada universal ni escrito en piedra. No hay una definición real.

La completitud de Turing es un estándar justo, debo decir, pero que es sesgado y subjetivo, no en su forma sino en la forma en que se elige. ¿Por qué un lenguaje capaz de generar una máquina completa de Turing queda remachado como un “lenguaje de programación” mientras que otro que puede generar una máquina de estados finitos no? Es subjetivo. Es una excusa como cualquier otra para diferenciar entre “desarrolladores reales” (los que hacen el reclamo) y los inferiores.

Para colmo de males, es obvio que muchas de las personas que repiten como loros el mantra “HTML no es Turing completo” ni siquiera saben o entienden lo que significa Turing completo. No es un premio ni un sello de calidad. No es una insignia de honor. Es solo una forma de categorizar los lenguajes de programación – agruparlos, no definirlos. Un lenguaje de programación podría ser Turing completo o no de la misma manera que podría ser interpretado o compilado, imperativo o declarativo, procedimental u orientado a objetos.

Entonces, ¿HTML es un lenguaje de programación?

Si podemos degradar los argumentos principales que afirman que HTML no es un lenguaje de programación, ¿eso realmente significa que HTML es un lenguaje de programación? No, no es así. Y así, el debate vivirá hasta que evolucione el estándar HTML o cambie la “definición actual” del lenguaje de programación.

Pero como desarrolladores, debemos ser cautelosos con esta pregunta ya que, en muchos casos, no se utiliza para provocar un debate serio, sino para generar controversia mientras se esconden motivos ocultos: desde obtener reacciones fáciles en Internet hasta disminuir peligrosamente la contribución de un grupo de personas al ecosistema de desarrollo.

O, como Ashley Kolodziej lo resume maravillosamente en su oda al HTML:

Dicen que no eres un lenguaje de programación real como los demás, que solo estás marcado y, técnicamente hablando, supongo que es correcto. Técnicamente hablando, JavaScript y PHP son lenguajes de programación. Recuerdo cuando no era bueno saber JavaScript, cuando tampoco era un lenguaje “real”. A veces, siento que estas distinciones no tienen sentido, como si construyéramos un vocabulario para retenerlos (y por extensión, a nosotros mismos como desarrolladores). Usted, como lenguaje de marcado, tiene sus propios valores y fortalezas. Saber cómo trabajar mejor con usted es una verdadera experiencia, una que con demasiada frecuencia se pasa por alto.

Independientemente de la postura que adoptemos en la discusión sobre “HTML es / no es un lenguaje de programación”, celebremos y no neguemos su importancia: HTML es la columna vertebral de Internet. Es un hermoso lenguaje con vasta documentación y extensa sintaxis, pero tan simple que se puede aprender en una tarde, y tan complejo que lleva años dominarlo. Lenguaje de programación o no, lo que realmente importa es que tenemos HTML en primer lugar.