Há alguns dias surgiu uma pergunta muito interessante no Stack Overflow em Português sobre o que faz uma linguagem ser considerada de alto ou baixo nível.

Abaixo estão algumas de minhas reflexões sobre o tema.

Uma imagem vale mais do que mil palavras

baixo-alto-nível

Abstração computacional

Pensando numa abordagem para diferenciar linguagens de alto e baixo nível do ponto de vista de quem está programando, o nível da linguagem é proporcional ao quanto você gasta pensando em resolver o seu problema (alto nível) ou em resolver problemas relacionados aos cálculos computacionais (baixo nível).

Por exemplo, considere os “comandos” a seguir:

  1. Mova o texto “ABC” para a posição de memória 123, copie todos os caracteres para o fluxo aberto que aponta para a posição 456 do disco.
  2. Gravar o texto “ABC” no arquivo “doc.txt”
  3. Atualize o nome do cliente com o valor “João”

O item #1 é certamente o que possui mais baixo nível. Em relação a ele, o item #2 é de mais alto nível.

Porém, temos o item #3, que é de mais alto nível que todos. Em relação a ele, o item #2 é de mais baixo nível.

Quantidade de camadas de abstração

Desde que os computadores surgiram há um esforço para tornar a sua programação mais fácil. Isso foi feito criando-se novas linguagens e compiladores mais avançados, assim como através de macros, métodos ou objetos que abstraem e automatizam certas tarefas.

Porém, cada vez que adicionamos uma dessas “facilidades”, aumentamos a quantidade de camadas de abstração ou indireção em relação à computação binária.

Por exemplo:

  1. Assembly é uma linguagem que se mapeia praticamente direto para código de máquina, mas ainda assim o programa é escrito em texto antes de ser convertido em binário. Em geral, cada comando assembly consiste em uma instrução ao processador.
  2. C é uma linguagem de mais alto nível, onde cada comando é traduzido pelo compilador geralmente em várias instruções Assembly (ainda que em memória) antes de realmente gerar código binário.
  3. Java e .NET são linguagens ainda de mais alto nível porque cada comando gera uma ou mais instruções de máquinas virtuais, que não é o mesmo que linguagem de máquina. Cada instrução dessas máquinas virtuais precisa ser traduzida, em tempo de execução, para um conjunto de instruções de máquina correspondente à arquitetura da CPU onde o programa está rodando.
  4. No PHP, enquanto linguagem interpretada, cada comando é processado por código previamente compilado em C, geralmente levando à execução de vários trechos de código equivalentes a várias funções C que são mapeadas para inúmeras instruções de máquina.

Vale notar que, em geral, a quantidade de níveis de abstração é proporcional ao quanto o programador fica “longe” do hardware, mas nem sempre isso é diretamente proporcional.

Suba o nível

Independente da linguagem, programadores devem programar em alto nível sempre que possível.

Mesmo que sua plataforma de desenvolvimento permita conversar diretamente com o hardware, a fim de manter a sanidade, um bom programador irá abstrair toda essa complexidade em rotinas de mais alto nível conforme as capacidades da linguagem (funções, método, objetos, módulos, etc.).

Imagine o seguinte código:

notaFiscal = ler_arquivo_nota_fiscal(caminho);
validar_nota_fiscal(notaFiscal);
salvar_nova_fiscal(notaFiscal);

Exceto pelo estilo de codificação, seja Java ou JavaScript, C ou C#, ShellScript ou PHP, qualquer um pode entender o que o código acima faz e implementar os detalhes nas respectivas rotinas.

No fim das contas, não é porque alguém programa em C que necessariamente precisa estar sempre codificando em baixo nível.

Considerações

Não é possível afirmar absolutamente que uma data linguagem é de alto ou baixo nível.

O que poderíamos dizer é que todas as linguagens de programação são de mais alto nível em relação ao código binário (desde que seja humanamente possível ler o código, obviamente).

Além disso, poderíamos ainda afirmar que uma linguagem X é de mais alto ou mais baixo nível em relação à alguma outra linguagem Y considerando o aspecto Z.

Por fim, dentro de uma mesma linguagem, é possível programar em diferentes níveis de abstração. Bons programadores irão subir o nível sempre que possível tanto para aumentar a produtividade quanto para uma melhor qualidade do código.