HTML é uma linguagem de programação - ou pelo menos está mais perto disso do que você imagina

O HTML é alvo de muita chacota on-line, quem nunca riu do famoso "programador de HTML" ou, pelo menos, pensou que era óbvio que ele estava errado, que atire a primeira pedra. Não é exatamente incomum nos depararmos com a afirmação de que "HTML é uma linguagem de programação" e ver diversos comentários dizendo o contrário (afinal é verdade), apesar disso, muitos desses comentários tem como intenção zombar como se a pessoa fosse estúpida por pensar daquela forma, como se essa fosse uma discussão rasa e banal. O problema é que geralmente os argumentos demonstrando que ele não é uma linguagem de programação, não são bem os mais inteligentes do mundo também, o que gera uma situação do sujo falando do mal lavado, ou seja, a famosa hipocrisia. Entretanto esse rabbit role pode ser bem mais profundo e interessante do que se imagina, existe de fato uma área cinza considerável quanto à o que seria uma linguagem de programação. Por isso hoje vamos estudar como aquele seu amigo iniciante que "programa" em HTML talvez possa ter mais razão do que você imagina. Caso 1: é uma linguagem de marcação Para muitos, o fato de HTML ser uma sigla para hypertext markup language é o suficiente para desconsiderar ele como linguagem de programação, afinal ele não seria uma linguagem de programação, mas sim uma de marcação, porém não tem nada que impede uma linguagem de marcação de ser uma linguagem de programação também, alguns exemplos disso seriam: XSLT (Extensible Stylesheet Language Transformation); SGML (Standart Generalized Markup Language); LaTeX. XSLT por exemplo é uma linguagem Turing Complete (o que como vamos ver mais para frente também não é requisito, apesar de ser um bom indicativo), além de possuir construtos como condicionais, e estruturas de repetição, sendo possível até escrever algoritmos nele, como por exemplo a sequência de fibonacci: Caso 02: não está no nome Continuando num outro argumento que vem acompanhado quando se faz o anterior é a ideia de que como o HTML tem markup language no nome, ele claramente é uma linguagem de marcação e como não tem programação escrito no nome, não poderia ser uma linguagem de programação, o que é um argumento no mínimo pedante. Várias outras linguagens de programação bem populares também carregam nomes ambíguos como por exemplo JavaScript, que indica que ele seria uma linguagem script e não uma de programação de verdade, ou PHP (PHP Hypertext Processor) que inclusive possui o hypertext no nome, o que demonstra que o nome pode até ser um indicativo, mas ele não deveria ser um critério decisivo para decidir isso. Outro grande exemplo seria o próprio XSLT que vimos anteriormente que mesmo sendo uma linguagem de marcação, com markup language no nome, ainda assim é uma linguagem de programação. Caso 03: HTML é estrutura, CSS é estilização, e JS é interatividade Uma variação do ponto anterior é que se argumenta que como o HTML tem uma responsabilidade muito clara de definir a estrutura semântica de uma página web, enquanto CSS serve para estiliza-lá, e o JS para adicionar interatividade. Dessa forma, apenas o JS poderia ser considerado uma linguagem de programação afinal ele que adiciona o elemento do dinamismo e da interatividade nos documentos. O problema disso é que tanto o HTML quanto CSS possuem capacidades de tornar coisas dinâmicas atualmente, mesmo que de forma limitada. O HTML, por exemplo, possui a Popover API, os novos atributos command e commandfor (que possibilitam habilitar uma tag dialog sem JS, e muito mais), ou tags interativas como as summary e details. Caso 04: Falta de controle de fluxo Para muitos, uma linguagem só pode ser de programação se incluir coisas como variáveis, estruturas condicionais como if ou switch, e estruturas de repetição como for loops por exemplo. Sendo um dos argumentos mais hipócritas de todos, visto que demonstra que elas entendem tanto do tema quanto o iniciante ao qual elas estão fazendo chacota. Afinal você não precisa de variáveis, ifs ou loops para programar, programação funcional nos mostra que é possível programar de forma imutável (sem variáveis), podemos simplesmente usar recursão ao invés de loops, e ifs não precisam ser estruturas que controlam o fluxo do código, uma vez que booleans podem ser expressos como objetos ou funções, resultando em branching ou pelo type system ou simplesmente pela invocação de funções. Considerar apenas essas estruturas mais comuns deixa de fora inumeras linguagens como as que compõe o paradigma lógico e funcional, e até mesmo algumas puramente orientadas a objeto como Smalltalk (não existem estruturas de controle de fluxo aqui, apenas objetos).

Apr 1, 2025 - 22:19
 0
HTML é uma linguagem de programação - ou pelo menos está mais perto disso do que você imagina

O HTML é alvo de muita chacota on-line, quem nunca riu do famoso "programador de HTML" ou, pelo menos, pensou que era óbvio que ele estava errado, que atire a primeira pedra.

Não é exatamente incomum nos depararmos com a afirmação de que "HTML é uma linguagem de programação" e ver diversos comentários dizendo o contrário (afinal é verdade), apesar disso, muitos desses comentários tem como intenção zombar como se a pessoa fosse estúpida por pensar daquela forma, como se essa fosse uma discussão rasa e banal.

O problema é que geralmente os argumentos demonstrando que ele não é uma linguagem de programação, não são bem os mais inteligentes do mundo também, o que gera uma situação do sujo falando do mal lavado, ou seja, a famosa hipocrisia.

Entretanto esse rabbit role pode ser bem mais profundo e interessante do que se imagina, existe de fato uma área cinza considerável quanto à o que seria uma linguagem de programação.

Por isso hoje vamos estudar como aquele seu amigo iniciante que "programa" em HTML talvez possa ter mais razão do que você imagina.

Caso 1: é uma linguagem de marcação

Para muitos, o fato de HTML ser uma sigla para hypertext markup language é o suficiente para desconsiderar ele como linguagem de programação, afinal ele não seria uma linguagem de programação, mas sim uma de marcação, porém não tem nada que impede uma linguagem de marcação de ser uma linguagem de programação também, alguns exemplos disso seriam:

  • XSLT (Extensible Stylesheet Language Transformation);
  • SGML (Standart Generalized Markup Language);
  • LaTeX.

XSLT por exemplo é uma linguagem Turing Complete (o que como vamos ver mais para frente também não é requisito, apesar de ser um bom indicativo), além de possuir construtos como condicionais, e estruturas de repetição, sendo possível até escrever algoritmos nele, como por exemplo a sequência de fibonacci:


 version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     match="/">
        
             name="fibonacci">
                 name="n" select="10"/>
                 name="a" select="0"/>
                 name="b" select="1"/>
            
        
    

     name="fibonacci">
         name="n"/>
         name="a"/>
         name="b"/>

        
        
             select="$a"/>
        

        
         test="$n > 1">
             name="fibonacci">
                 name="n" select="$n - 1"/>
                 name="a" select="$b"/>
                 name="b" select="$a + $b"/>
            
        
    

Caso 02: não está no nome

Continuando num outro argumento que vem acompanhado quando se faz o anterior é a ideia de que como o HTML tem markup language no nome, ele claramente é uma linguagem de marcação e como não tem programação escrito no nome, não poderia ser uma linguagem de programação, o que é um argumento no mínimo pedante.

Várias outras linguagens de programação bem populares também carregam nomes ambíguos como por exemplo JavaScript, que indica que ele seria uma linguagem script e não uma de programação de verdade, ou PHP (PHP Hypertext Processor) que inclusive possui o hypertext no nome, o que demonstra que o nome pode até ser um indicativo, mas ele não deveria ser um critério decisivo para decidir isso.

Outro grande exemplo seria o próprio XSLT que vimos anteriormente que mesmo sendo uma linguagem de marcação, com markup language no nome, ainda assim é uma linguagem de programação.

Caso 03: HTML é estrutura, CSS é estilização, e JS é interatividade

Uma variação do ponto anterior é que se argumenta que como o HTML tem uma responsabilidade muito clara de definir a estrutura semântica de uma página web, enquanto CSS serve para estiliza-lá, e o JS para adicionar interatividade.

Dessa forma, apenas o JS poderia ser considerado uma linguagem de programação afinal ele que adiciona o elemento do dinamismo e da interatividade nos documentos.

O problema disso é que tanto o HTML quanto CSS possuem capacidades de tornar coisas dinâmicas atualmente, mesmo que de forma limitada.

O HTML, por exemplo, possui a Popover API, os novos atributos command e commandfor (que possibilitam habilitar uma tag dialog sem JS, e muito mais), ou tags interativas como as summary e details.

Caso 04: Falta de controle de fluxo

Para muitos, uma linguagem só pode ser de programação se incluir coisas como variáveis, estruturas condicionais como if ou switch, e estruturas de repetição como for loops por exemplo.

Sendo um dos argumentos mais hipócritas de todos, visto que demonstra que elas entendem tanto do tema quanto o iniciante ao qual elas estão fazendo chacota.

Afinal você não precisa de variáveis, ifs ou loops para programar, programação funcional nos mostra que é possível programar de forma imutável (sem variáveis), podemos simplesmente usar recursão ao invés de loops, e ifs não precisam ser estruturas que controlam o fluxo do código, uma vez que booleans podem ser expressos como objetos ou funções, resultando em branching ou pelo type system ou simplesmente pela invocação de funções.

Considerar apenas essas estruturas mais comuns deixa de fora inumeras linguagens como as que compõe o paradigma lógico e funcional, e até mesmo algumas puramente orientadas a objeto como Smalltalk (não existem estruturas de controle de fluxo aqui, apenas objetos).

Caso 05: Não é Turing Complete

Este talvez seja o melhor ponto para se ressaltar se algo é uma linguagem de programação ou não, visto que é uma métrica bem confiável para maioria dos casos, afinal se passa pelo teste de Turing, possui uma sintaxe formal com semântica definida, e pode ser usado para escrever programas de computador, então é uma linguagem de programação.

O problema aqui é que só ser Turing Complete não garante que é uma linguagem de programação visto que existem coisas que são Turing Complete, mas não são linguagens de programação por exemplo o a redstone do jogo Minecraft.

Por outro lado, não ser Turing Complete também não desqualifica automaticamente uma linguagem, afinal existem alguns domínios que exigem que as linguagens proibam certas coisas como loops infinitos de acontecerem, por exemplo em linguagens usadas para projetar chips de computador (como os produzidos pela Intel ou AMD), como essas linguagens produzem especificações que refletem as limitações que o hardware vai ter na vida real, elas acabam tendo limitações que as impedem de ser consideradas Turing Complete.

Mas então o que caracterizaria uma linguagem de programação?

Isso é uma questão complexa, visto que mesmo critérios já estabelecidos como a completude de Turing não parecem ser suficiente para isso, mas se formos para uma linha abstrata demais, quase que filosófica, e dizer que seria qualquer coisa que possibilite a criação de instruções que façam um computador fazer alguma coisa, talvez até mesmo prompt numa IA possa ser considerado programação, o que também não é muito útil como critério.

O que fez mais sentido para mim até hoje seria a ideia de que precisa ser uma linguagem com sintaxe e semântica formais, um grau de expressividade suficiente para computação geral (Turing completa ou próximo disso) e que permite o raciocínio sobre seus programas.

Expressividade significa o grau de liberdade que uma linguagem oferece, por exemplo numa linguagem de tipagem estática, a liberdade é menor, pois o sistema de tipos te impede de usar um valor de um tipo quando outro é requerido.

O raciocínio se refere a capacidade de programas poderem ser análisados por humanos ou computadores baseado na sua sintaxe e semânticas formais, por exemplo poder olhar que x = 1 + 1, e dizer que x é 2 se baseando no modelo formal da matemática.

Essa definição se baseia na descrição de Peter Van Roy sobre o que seria programação:

  • First, a computation model, which is a formal system that defines a language and how sentences of the language (e.g., expressions and statements) are executed by an abstract machine.For this book, we are interested in computation models that are useful and intuitive for programmers.This will become clearer when we define the first one later in this chapter.
  • Second, a set of programming techniques and design principles used to write programs in the language of the computation model.We will sometimes call this a programming model.A programming model is always built on top of a computation model.
  • Third, a set of reasoning techniques to let you reason about programs, to increase confidence that they behave correctly, and to calculate their efficiency.

~ Peter Van Roy, Concepts, Techiniques, and Models of Computer Programming, p. 29

Já que ela nos dá os critérios necessários para entender os casos "fora da curva" que eu citei nas seções anteriores, ao mesmo tempo que oferece uma justificativa para o HTML chegar perto, mas não ser uma linguagem de programação.

No caso, ele possui sintaxe e semântica muito bem definidas, você consegue raciocinar sobre o resultado de um "programa" HTML, tem um certo grau de expressividade (inclusive ele ganhou mais expressividade nos últimos anos), mas ainda não chega a ser suficiente para ser algo próximo de uma máquina de Turing, ele ainda é uma linguagem cujo a expressividade é limitada à apenas declarar estruturas de dados e nada mais.

Dito isso, ele é compatível com várias das coisas que caracterizam uma linguagem de programação, e é por isso que num critério menos rigoroso, ele poderia sim ser considerado uma linguagem de programação, mesmo que técnicamente isso fosse errado, o que explica o motivo de muitos iniciantes, ou pessoas em geral falando de forma informal, se referirem a ele assim.

Explorando as áreas cinzas

Apesar disso tudo que nós abordamos, se a gente considerar a existência de web components, e fizermos algumas concessões, o HTML poderia sim ser considerado uma linguagem de programação dentro das regras que nós decidimos na seção anterior.

Tudo o que falta para o HTML é uma expressividade maior, de modo que ele possa realizar computações além de simplesmente declarar estruturas de dados.

Tanto que isso se verifica na prática pois template engines, ou frameworks JS que adicionam DSLs por cima do HTML (tipo o Vue ou Svelte) basicamente tornam possível a escrita de programas com ele.

O problema é que template engines não contam pois são uma nova linguagem implementada por cima do HTML, então ele em si continua não contando.

E no caso dos frameworks de JS, apesar deles melhorarem o HTML, essencialmente o código que você escreve é o em JS, a parte HTML continua sendo só puramente declarativa mesmo.

O interessante seria se o HTML em si ganhasse novas tags que permitissem expressar computações mesmo que de forma declarativa (semelhante ao XLST citado anteriormente), e é ai que entram os web components.

Eles são uma spec oficial da web cujo o propósito é justamente estender o HTML permitindo que você registre novos elementos válidos ao DOM da página. Sendo assim, poderíamos definir um conjunto de web components que simbolizam computações formais, virando HTML válido dentro da página que registrar eles.

O único problema dessa abordagem seria que web components dependem de JS para funcionar, então para esse ponto funcionar deveríamos fazer a concessão de considerar o JS apenas como o runtime do HTML, tal como o bytecode é para o Java.

Essa concessão faz sentido aqui e não para os frameworks de JS, pois os web components não adicionam nada na sintaxe formal do HTML, então essencialmente um novo web component seria uma nova tag do HTML, e o JS não é exposto em nenhum ponto aqui, ele age apenas como um detalhe de implementação, se a gente escrevesse um interpretador de HTML em python e que entendesse esses web components também, e projetasse uma saída num console, a parte de raciocínio do programa continuaria igual, ao passo que num interpretador de Vue por exemplo, seria necessário adicionar toda a semântica e raciocínio para um programa JS também.

Conclusão

No artigo de hoje vimos que a ideia de HTML ser uma linguagem de programação vai bem além de só uma piada, e que a definição de o que seria uma é um assunto bem mais profundo do que parece, por isso se você achou o conteúdo interessante, comenta aqui para gente o que você achou da nossa proposta de interpretação com web components, o HTML deveria ser considerado uma linguagem de programação nesse caso ou não?