Esse é um daqueles assuntos que se perguntar pra 10 pessoas, vai ter 11 respostas diferentes.
Isso porque não existe uma única definição “oficial”, canônica, universalmente aceita e livre de controvérsias sobre o que é uma linguagem de programação.
Mesmo nos círculos acadêmicos (mais teóricos e formais), não há consenso. O melhor que podemos ter é um critério mínimo no qual a maioria parece concordar: que tal linguagem deve ter sintaxe e semântica bem definidas. A sintaxe define uma gramática formal que diz quais construções são válidas, e a semântica dá significado aos elementos da sintaxe. Bem, se fosse só isso, então HTML e CSS poderiam ser consideradas “linguagens de programação”.
Mas há pessoas que não se contentam com esta definição, e incluem como obrigatório o fato de ser Turing Complete. Ou seja, precisa ter outras características, dentre elas (mas não apenas estas): a capacidade de computar (realizar cálculos), ter loops e condicionais, funções (nativas ou criadas pelo programador), ler e escrever dados - seja em variáveis ou em outra forma de armazenagem (arquivos, por exemplo), etc.
Neste caso, HTML e CSS não seriam linguagens de programação. Não sei de onde vc tirou que HTML e CSS fazem I/O. Como vc consegue ler algo que o usuário digitou (ou o conteúdo de um arquivo) com HTML e CSS? No HTML até tem <input>
, mas isso é apenas uma interface para que o browser envie os dados ao backend (e quem fará a leitura e depois a saída é a linguagem que está rodando no servidor). Não é o HTML e nem o CSS que fez o I/O.
Quanto a “variáveis”, o CSS até tem uma forma limitada, mas está bem longe do conceito de variáveis das linguagens de programação “tradicionais”: vc não pode usá-las em qualquer expressão ou cálculo, no CSS o uso é bem restrito a contextos específicos (são basicamente valores que podem ser reusados, não mais que isso). E não sei o que vc quis dizer com “trabalham com variáveis locais usando div e id”, isso não faz o menor sentido.
E claro, o que vc mais vai ver por aí é a discussão não-acadêmica e mais, digamos, informal. E aí é terra de ninguém, com cada um dando sua opinião e nunca chegando a conclusão nenhuma. Os argumentos mais comuns que lembro de cabeça:
- HTML significa “HyperText Markup Language” (Linguagem de Marcação de Hipertexto), ou seja, é uma linguagem de marcação, não de programação. Só serve pra definir a estrutura de uma página, mas não pra fazer programas da forma “tradicional”
- Mas quando estamos programando um site, usamos HTML também, então ele faz parte do processo de programação. Portanto, é uma linguagem de programação.
- Aí tem a resposta: Se levar essa definição ao extremo, então Excel, Word e até o Notepad também seriam linguagens de programação (afinal, eu usei o Word pra escrever a especificação do sistema e o Notepad para escrever o código, e isso faz parte do “processo de programação”, certo?)
- e a discussão segue ad infinitum (ou até começarem os xingamentos)
- HTML só define a estrutura, e CSS só define a estilização. O browser só interpreta isso e monta a página
- Vc disse “interpretar”? Então eles são linguagens de programação interpretadas, possuem instruções que são executadas como qualquer outra linguagem.
- Mas não tem loops, condicionais, funções, classes/structs, não dá pra fazer cálculos, etc.
- …
Leitura complementar: