Linguagem-máquina
Para os humanos a interação não seria completamente nada sem o alfabeto e
os números não é mesmo? Mas com os computadores isso é um pouco
diferente. Chamada de "linguagem binaria", os famosos 1 e 0 é o que dão
origem a essa linguagem. Entenda um pouco sobre como ela funciona.
Para entender melhor como funciona essa TRADUÇÃO da linguagem humana
para a linguagem de máquina, como assim é chamada, é preciso saber o
alfabeto binário (não necessariamente decorá-lo).
Cada algarismo 1 ou 0, é chamado de bit (binary digit) e para que se forme um dígito são necessários oito bits e cada conjunto de oito bits é chamado de byte, normalmente.
Veja o alfabeto binário:
A
01000001
|
B
01000010
|
C
01000011
|
D
01000100
|
E
01000101
|
F
01000110
|
G
01000111
|
H
01001000
|
I
01001001
|
J
01001010
|
K
01001011
|
L
01001100
|
M
01001101
|
N
01001110
|
O
01001111
|
P
01010000
|
Q
01010001
|
R
01010010
|
S
01010011
|
T
01010100
|
U
01010101
|
V
01010110
|
W
01010111
|
X
01011000
|
Y
01011001
|
Z
01011010 | | |
Essa é a codificação ASCII (American Standard Code for
Information Interchange ou Código Padrão Americano para Intercâmbio de Informações) e é a mais usada.
Se você pedir um comando para que, por exemplo, seja encontrado
todos os números primos até um inteiro n, nossa estratégia tem de seguir
uma lógica como se fosse usada na aula de matemática, no caso.
Linguagem Assembly
O
Assembly foi provavelmente a primeira linguagem de programação da
história, surgida na década de 50, época em que os computadores ainda
usavam válvulas. A idéia do assembly é usar um comando em substituição a
cada instrução de máquina.
No
assembly, cada uma destas instruções, equivale a uma instrução do
processador. Ao invés de usar instruções como 10101011 você pode usar
outras bem mais fáceis de entender e de memorizar, como add, div, mul,
and, or, not, etc. Você também pode criar variáveis, que são pequenos
espaços na memória RAM reservados para guardar algum tipo de dado, que o
programa precisará mais tarde. Você pode usar aquelas instruções que
citei para lidar com elas. Por exemplo, a instrução "add" faz com que o
processador some duas variáveis; "add x, y" por exemplo, soma os valores
de x e y.
Apesar
de ser exaustivamente trabalhoso, você pode perfeitamente desenvolver
pequenos programas em assembly, para isso só vai precisar de um
compilador e bastante paciência para aprender.
O
compilador transforma o código escrito em assembly em linguagem de
máquina, que finalmente poderá ser entendida pelo processador.
Existem
também os decompiladores, que fazem o trabalho inverso, de transformar
um programa já compilado, em um código em linguagem assembly. Este
recurso é chamado de engenharia reversa. É assim que conseguem crackear
programas, quebrar códigos de proteção (como o do DVD), etc. Claro que
para isso, é preciso alguém que conheça muito de assembly e que tenha
disposição para ficar estudando o código até encontrar o que procura.
Por causa desta característica de permitir trabalhar diretamente com as instruções do processador, o assembly é chamado de linguagem de baixo nível.
Existem também linguagens de alto nível, como C++ ou Pascal, onde é
possível usar várias funções já prontas ou mesmo ferramentas visuais,
como o Kdeveloper ou o Kylix, que são ainda mais fácies.
Linguagem de Programação de Alto Nível
Antes de entrar nesse tema, é necessário entender o que é uma linguagem de programação. A gente ouve por aí: Java, SQL, C, C++,
Assembly, Basic e muitas outras palavras relacionadas às linguagens de
programação. Podemos dizer que a linguagem de programação é uma forma de
determinarmos como um dispositivo deve trabalhar. É como se déssemos
ordens para esses dispositivos que podem ser simples, como por exemplo,
um carregador de pilhas ou mais complexos como um computador.
Cada linguagem de programação foi criada com algum
objetivo, como por exemplo, facilidade de escrita, facilidade de
manutenção, melhora da performance do dispositivo, etc.
Quando falamos em níveis, podemos dizer que uma linguagem de alto nível
está muito mais próxima do programador do que do dispositivo, ou seja, é
uma linguagem muito mais intuitiva. Existem linguagens onde é feito um
diagrama e esse diagrama que nada mais é do que um desenho é convertido
para uma linguagem de programação pré-selecionada. Essa é uma linguagem
bem mais amigável ao programador devido à sua facilidade de
entendimento. Um exemplo de linguagem de alto nível é a linguagem SDL
(Specification Design Language).
Já numa linguagem de baixo nível, o programador vai sofrer, pois a linguagem é muito mais voltada ao dispositivo (processador,
microcontrolador, etc.). Normalmente envolve números e letras que nada
mais são que instruções diretas ao dispositivo. Por exemplo, a instrução
“MOV 1, R0” diz para mover o valor “1” para o registrador “0” de um
determinado processador. Como vemos, o programador tem que entender não
só da linguagem em si, mas de toda a arquitetura do dispositivo que ele
irá trabalhar. Um exemplo de linguagem de baixo nível é a linguagem
ASSEMBLY.
Então, por quê não se usa sempre a linguagem de alto nível, já que ela é bem mais fácil de programar e dar manutenção?
Às vezes, essa opção não está disponível, pois a performance do
dispositivo pode ser prejudicada se for usada uma linguagem de alto
nível. Isso também tem a ver com memória: uma linguagem de alto nível,
normalmente ocupa mais memória do que uma de baixo nível e aí o fator
custo pode ser um obstáculo.
Por quê uma linguagem de baixo nível tem normalmente uma melhor performance do que uma linguagem de alto nível?
Por ser uma linguagem mais próxima ao dispositivo, são necessárias
menos conversões dessa linguagem para a “linguagem de máquina” do
dispositivo. Quando se escreve uma linguagem de alto nível, muitas
conversões são necessárias para alcançar a “linguagem de máquina”, como
essa geração é feita de forma automática, o código resultante acaba
sendo maior do que se fosse escrito diretamente por um programador
usando a linguagem de baixo nível.