Como um computador compreende um ser humano?
Tags: computadores, ascii, unicode, portugues
Published: 2020-08-19 17:18:49

---
title: Como um computador compreende um ser humano?
published: true
description: Um pouquinho sobre computadores, linguagem de máquina e Tanenbaum
tags: computadores, ascii, unicode, portugues
cover_image: https://images.unsplash.com/photo-1518770660439-4636190af475?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=750&q=80
---
Um computador é uma __máquina que executa instruções para resolver problemas para o ser humano__, que é quem lhe passa essas instruções. Entretanto, humano e computador falam linguagens diferentes: o segundo só consegue interpretar instruções simples reconhecidas por seus circuitos eletrônicos, a nível físico. Essa linguagem que conseguem interpretar é chamada de __linguagem de máquina__.

Obviamente, por ser algo aquém de nossa natureza, a linguagem de máquina é de difícil compreensão. Veja um quadro comparativo, onde à esquerda temos a instrução de máquina e à direita o que ela significa: 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ixm48uao1dgvwjzrp04f.png)

Encare esses 0 e 1 como combinações que representam estados físicos do computador, que é onde ele consegue te entender, no hardware, nos componentes. Para entender um pouco de elétrica e eletrônica, lembre-se que __eletricidade é sobre o movimento de elétrons__ e __eletrônica é o que usamos para controlar o movimento dos elétrons__. 

Se você for um entusiasta de computação desde o hardware, pode ler também sobre esses tópicos para ter uma compreensão maior:
1. [Álgebra booleana](https://pt.wikipedia.org/wiki/%C3%81lgebra_booliana): são estruturas que nos ajudam a lidar com afirmações usando operadores lógicos e de conjuntos, e essas estruturas podem ser verdadeiras ou falsas (podemos falar também em 1 ou 0).
2. [Portas lógicas](https://pt.wikipedia.org/wiki/Porta_l%C3%B3gica): são dispositivos que utilizam um ou mais sinais lógicos, geralmente usados em circuitos lógicos por causa das situações “1 ou 0” que podem apresentar. 

Para poder “conversar” com o computador precisamos criar uma abstração que nos leve do hardware para algum tipo de língua que possamos entender e interagir. Isso pode ser resolvido de duas formas: 

* Tradução
* Interpretação 

Se não quisermos utilizar a linguagem da máquina, em ambas as formas nós precisaremos desenvolver uma nova linguagem, intermediária entre a nossa (português, inglês, etc) e a linguagem de máquina. A isso no geral damos o nome de __linguagem de programação__. 

## Tradução 
Vamos dizer que o computador fale a linguagem de máquina LM, e nós estamos utilizando a linguagem de programação LP1. Para que a máquina nos entenda podemos __traduzir__ LP1 para LM, ou seja, podemos traduzir pedaço por pedaço de LP1 para uma instrução LM que o computador entenda, gerando uma nova instrução completa em LM que então será executada pelo computador.

## Interpretação
Na interpretação cada pedaço de LP1 é __interpretado__ como o seu equivalente na LM, e é diretamente executado. A diferença da tradução para a interpretação é que na primeira o programa LP1 é desconsiderado em função do LM gerado a partir da tradução.

Porém, para que essas traduções ou interpretações sejam práticas, a LP1 não pode ser tão diferente da LM. Aqui você pode pensar, por exemplo, em Assembly, linguagem chamada de __baixo nível__ justamente por estar mais próxima da linguagem de máquina. Por esse motivo, também é chamada de __linguagem de montagem__. Veja um exemplo:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/jadfsgjw5omxrf98lisd.png)

Ainda não tão elegante, certo? Para tornar a linguagem ainda mais inteligível e prática para nós, podemos abstrair a linguagem LP1 em outra ainda mais compreensível, que chamaremos de LP2, e assim por diante. Veja um exemplo de Python:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/5v061ry6087wfcv7hsob.png)

Cada nível acima representa uma abstração do nível anterior, e é assim que um computador é arquitetado, desde o hardware, a __nível dispositivo__ (domínio de engenharia elétrica, onde lidamos com transistores e componentes), até camadas mais abstratas, como o sistema operacional.

Nos dizeres de [Tanenbaum](https://en.wikipedia.org/wiki/Andrew_S._Tanenbaum):

> Cada linguagem usa sua antecessora como base, portanto, podemos considerar um computador que use essa técnica como uma série de camadas ou níveis, um sobre o outro(...). A linguagem ou nível mais embaixo é a mais simples, e a linguagem ou nível mais em cima é a mais sofisticada.

Você pode estar se perguntando como o computador compreende os símbolos que utilizamos, como “C”, “&”, “;”, etc. Bom, é para isso que existe a tabela __[ASCII](https://en.wikipedia.org/wiki/ASCII)__, o __[Unicode](https://en.wikipedia.org/wiki/Unicode)__ e __[UTF-8](https://en.wikipedia.org/wiki/UTF-8)__. São padronizações que correlacionam nossos símbolos com um correspondente que a máquina possa entender. Dê uma olhada nessa tabela:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/jwqu92nieoadx1g3f6kt.png)

Então, sempre que pensar em como um computador compreende um ser humano de uma perspectiva mais abstrata que hardware e eletricidade, pense que existem processos intermediários que traduzem e interpretam o que nós “falamos” para o computador, tanto as instruções que falamos como os símbolos que utilizamos (caracteres).

---
_Fontes_:
Photo by [Alexandre Debiève](https://unsplash.com/@alexkixa?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/s/photos/hardware?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)
TANENBAUM, Andrew S; AUSTIN, Todd. __Organização estruturada de computadores__. Tradução Daniel Vieira; revisão técnica Wagner Luiz Zucchi. São Paulo: Pearson Prentice Hall, 2013.
[Imagem do Introduction to Computer Science using Java - Central Connecticut State University](https://chortle.ccsu.edu/java5/notes/chap04/ch04_4.html)
[Imagem do Wikipedia para Assembly](https://en.wikipedia.org/wiki/Assembly_language#/media/File:Motorola_6800_Assembly_Language.png) 
[Imagem do Wikipedia para Python](https://pt.wikipedia.org/wiki/Python)
[Imagem de Sticks and Stones](http://sticksandstones.kstrom.com/appen.html)

---
_Esse texto não tem intenção de esgotar o tema. Acrescente nos comentários, e também aponte erros quando os identificar._