Skip to content

Remover mensagem de boas-vindas: “Sim, HTML é uma linguagem de programação, ok?” - #84

Open
diomonogatari wants to merge 1 commit into
devpt-org:mainfrom
diomonogatari:feat/html-n-eh-lingaguem-de-programacao
Open

Remover mensagem de boas-vindas: “Sim, HTML é uma linguagem de programação, ok?”#84
diomonogatari wants to merge 1 commit into
devpt-org:mainfrom
diomonogatari:feat/html-n-eh-lingaguem-de-programacao

Conversation

@diomonogatari

Copy link
Copy Markdown
Contributor

Este PR remove a seguinte mensagem de boas-vindas:

Sim, HTML é uma linguagem de programação, ok?

A mensagem oposta — Não, HTML não é uma linguagem de programação, ok? — permanece.

Motivação

A mensagem foi adicionada pelo [PR #61](#61), que apresenta uma interpretação suficientemente abrangente de “linguagem de programação” para incluir HTML, XML, YAML, formatos de ficheiro e, potencialmente, qualquer sequência de dados processada por um computador.

Essa definição é possível, mas pouco útil: se qualquer conjunto de símbolos que provoque a execução de rotinas num interpretador for uma linguagem de programação, então JSON, imagens JPEG, ficheiros de configuração e pedidos HTTP também passam a ser linguagens de programação.

A distinção convencional é mais específica:

  • uma linguagem de marcação descreve a estrutura, o significado ou a apresentação de informação;
  • uma linguagem de programação permite ao autor expressar computações, transformações ou processos através das operações definidas pela própria linguagem.

Sob esta distinção, HTML é uma linguagem formal e uma linguagem de marcação, mas não uma linguagem de programação.

O que dizem as especificações do HTML

A classificação de HTML como linguagem de marcação não é apenas coloquial.

A [documentação original do HTML, arquivada pelo W3C em 1992](https://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/MarkUp.html), descreve o sistema como texto marcado utilizado para representar documentos de hipertexto.

Mais tarde, o [RFC 1866, escrito por Tim Berners-Lee e Daniel Connolly](https://datatracker.ietf.org/doc/rfc1866/), formalizou HTML 2.0 como uma linguagem de marcação e um formato de dados para criar documentos de hipertexto. O RFC define markup como caracteres adicionados aos dados de um documento para representar a sua estrutura.

A [especificação atual do WHATWG](https://html.spec.whatwg.org/dev/introduction.html) mantém a mesma classificação:

HTML is the World Wide Web’s core markup language.

A especificação explica ainda que HTML foi originalmente concebido para descrever semanticamente documentos e define o seu âmbito como uma linguagem de marcação semântica acompanhada por APIs de scripting.

Isto é importante: a especificação distingue explicitamente a marcação HTML das linguagens de scripting utilizadas com ela.

Descrever um documento não é expressar uma computação

Considere o seguinte documento:

<article>
  <h1>HTML não é uma linguagem de programação</h1>
  <p>É uma linguagem de marcação.</p>
</article>

Este texto declara que existe um artigo composto por um título e um parágrafo. O browser analisa a marcação, constrói uma árvore DOM e apresenta o documento.

O fluxo é, simplificadamente:

HTML ──parser HTML──> árvore DOM ──browser──> documento apresentado

O algoritmo que tokeniza o documento, constrói a árvore, calcula a acessibilidade e apresenta os elementos foi implementado no browser. O documento HTML é a entrada desse algoritmo; não é a sua implementação.

Isto é análogo a outros formatos:

JSON ──parser JSON──> valores
JPEG ──decoder JPEG──> imagem
HTML ──parser HTML──> documento

O facto de um formato determinar o comportamento do programa que o interpreta não transforma automaticamente esse formato numa linguagem de programação. Um ficheiro JPEG faz um decoder executar operações extremamente específicas, mas o JPEG não contém um programa escrito pelo autor da imagem.

Da mesma forma, <details>, <form>, <video> e outros elementos HTML ativam comportamentos definidos previamente pelo browser. O autor seleciona e configura esses comportamentos; não define os algoritmos que os implementam.

O argumento dos records

O principal fundamento académico do PR original é o artigo de Peter Van Roy, [Programming Paradigms for Dummies: What Every Programmer Should Know](https://www.info.ucl.ac.be/~pvr/VanRoyChapter.pdf).

O diagrama do artigo coloca XML e S-expressions numa categoria chamada descriptive declarative programming, construída sobre o conceito de record. A partir daí, o PR conclui que possuir ou representar records seria suficiente para transformar uma notação numa linguagem de programação.

No entanto, essa não é uma condição necessária e suficiente apresentada pelo artigo.

Primeiro, o próprio autor informa na introdução que não fornece definições formais. O diagrama é uma taxonomia de paradigmas e conceitos, não um algoritmo para decidir se qualquer formato é ou não uma linguagem de programação.

Segundo, na secção 4.1, Van Roy não define programação simbólica como a mera capacidade de armazenar records. Ele diz que uma linguagem de programação simbólica deve conseguir calcular com eles: criá-los, decompô-los e examiná-los.

Esta diferença é fundamental.

HTML consegue representar uma estrutura hierárquica que, depois de analisada, existe como objetos DOM. Contudo, HTML puro não fornece ao autor operações gerais para:

  • decompor essa estrutura;
  • consultar arbitrariamente os seus elementos;
  • transformar valores;
  • criar novos elementos em resposta a valores calculados;
  • definir procedimentos que executem essas operações.

Quem realiza essas operações é o browser ou uma linguagem de programação associada, normalmente JavaScript.

Se a simples representação de records fosse suficiente, então JSON, YAML, CSV, Protocol Buffers e praticamente todos os formatos de serialização seriam linguagens de programação. Essa definição deixaria de distinguir programas dos dados consumidos pelos programas.

Mas HTML é declarativo

Ser declarativa não impede uma linguagem de ser uma linguagem de programação. Prolog, SQL e linguagens funcionais demonstram que programação não exige uma sequência imperativa de comandos.

Portanto, o argumento não deve ser “HTML não é programação porque não tem if, ciclos ou variáveis”. Essas características não são universais entre linguagens de programação.

A diferença está naquilo que a linguagem permite expressar.

Uma linguagem de programação declarativa permite descrever uma relação, consulta ou transformação que será computada pelo respetivo sistema. HTML declara a estrutura e a semântica de um documento, juntamente com instâncias de comportamentos predefinidos pelo user agent.

Por exemplo:

<input type="email" required>

declara um campo que deve conter um endereço de email. A sintaxe não define o algoritmo de validação, não permite substituir os seus passos e não permite reutilizar essa validação para calcular arbitrariamente outro resultado. O comportamento já pertence à plataforma; a marcação apenas o configura.

E o JavaScript dentro de HTML?

A existência de JavaScript num documento HTML não transforma HTML numa linguagem de programação, tal como um bloco SQL dentro de um ficheiro Java não transforma Java em SQL.

A [especificação de scripting do HTML](https://html.spec.whatwg.org/multipage/scripting.html) diz que scripts permitem adicionar interatividade aos documentos. Também determina que o conteúdo de um <script> clássico seja interpretado através da gramática do JavaScript.

<script>
  const result = 40 + 2;
  document.querySelector("output").textContent = result;
</script>

Neste exemplo:

  • <script> é marcação HTML;
  • o conteúdo do elemento é um programa JavaScript;
  • o cálculo e a alteração do DOM são realizados por JavaScript.

A distinção também aparece na própria especificação da linguagem. A [ECMA-262](https://262.ecma-international.org/) classifica ECMAScript como uma linguagem de programação para realizar computações e manipular objetos computacionais.

O mesmo se aplica a event handlers:

<button onclick="alert('Olá')">Clicar</button>

O atributo onclick faz parte da marcação, mas o seu valor é código JavaScript interpretado segundo outra linguagem. Embutir uma linguagem dentro de outra não torna ambas a mesma linguagem.

JSX, templates, Web Components e frameworks também não alteram esta conclusão. Podem utilizar linguagens de programação para produzir ou manipular HTML, mas o resultado continua a ser marcação.

Turing completeness também não resolve a questão

O PR original está correto ao rejeitar Turing completeness como requisito obrigatório.

David Turner descreve, em [Total Functional Programming](https://www.jucs.org/jucs_10_7/total_functional_programming.html), uma disciplina de programação funcional que exclui intencionalmente a não terminação. Uma linguagem pode, portanto, ser útil para programação sem ser Turing-completa.

Mas daqui não resulta que qualquer linguagem não Turing-completa seja uma linguagem de programação.

A afirmação:

“Nem todas as linguagens de programação são Turing-completas”

não implica:

“Todas as linguagens não Turing-completas são linguagens de programação”

Turing completeness mede poder computacional. Não determina, isoladamente, a finalidade ou a classificação de uma linguagem.

Por isso, esta alteração não se baseia em HTML não ter ciclos, variáveis ou poder computacional universal. Baseia-se na semântica que HTML oferece aos seus autores: descrição de documentos, não definição de computações.

A presença de algoritmos na especificação

A especificação do HTML contém centenas de algoritmos detalhados. Isto pode dar a impressão de que um documento HTML é um programa.

Porém, esses algoritmos são instruções para quem implementa browsers, parsers e user agents. Não são operações que um autor possa combinar livremente através da sintaxe HTML.

Existe uma diferença entre:

o algoritmo especificado para interpretar um formato

e:

um algoritmo escrito nesse formato

O HTML especifica o primeiro. JavaScript, C, Rust e outras linguagens de programação permitem escrever o segundo.

Conclusão

Não existe uma autoridade matemática universal que impeça alguém de adotar uma definição extremamente ampla de “linguagem de programação”. Sob uma taxonomia suficientemente inclusiva, HTML, XML, YAML e muitos formatos de dados podem ser descritos como casos mínimos de programação declarativa.

No entanto, essa classificação perde utilidade ao deixar de distinguir:

  • programas dos seus dados;
  • algoritmos das suas configurações;
  • linguagens de scripting das linguagens que os incorporam;
  • computação da descrição de documentos.

Historicamente, normativamente e na terminologia técnica convencional, HTML é definido como uma linguagem de marcação. O facto de browsers processarem HTML e disponibilizarem comportamentos para os seus elementos não transforma a marcação num programa.

Assim, seguindo a distinção mais útil e adotada pelas próprias especificações:

HTML é uma linguagem. HTML não é uma linguagem de programação.

Finalmente, isto não é um juízo sobre quem trabalha com HTML. Construir interfaces acessíveis e semanticamente corretas exige conhecimento técnico real, e uma pessoa não deixa de ser programadora por trabalhar principalmente com tecnologias declarativas. A classificação da ferramenta não classifica a pessoa.


Este PR altera apenas a mensagem de boas-vindas e não afeta qualquer outro comportamento do bot.


@jmsbs jmsbs left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Obrigado por este ensaio, Dio.

@diomonogatari

Copy link
Copy Markdown
Contributor Author

Obrigado por este ensaio, Dio.

não é quarta feira mas mandar bujas é giro

@jmsbs

jmsbs commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Obrigado por este ensaio, Dio.

não é quarta feira mas mandar bujas é giro

Devias fazê-lo mais frequentemente.

@Pedrocasss

Copy link
Copy Markdown

HTML não é uma linguagem de programação.

@hugopeixoto hugopeixoto left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A ideia é manter as duas versões

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants