Conversando com um cérebro de silício

Para instruir ao computador o que ele deve fazer você tem que escolher uma linguagem de programação, e essa linguagem pode ser de baixo ou alto nível. A linguagem de baixo nível mais comum é conhecida como assembly (ou linguagem de montagem). A linguagem assembly possui relação de um para um com o conjunto de instruções da máquina. Isso significa que cada comando escrito em assembly tem tradução direta para uma única instrução em linguagem de máquina. Para facilitar ao programador humano, cada opcode recebe um mnemônico equivalente. O mnemônico é um pequeno nome a fim de facilitar a memorização da instrução. Por exemplo, o opcode 28 que definimos anteriormente como representando a soma pode receber o mnemônico ADD em assembly e também poderíamos atribuir o mnemônico SUB para o opcode de subtração, seja ele qual for. Vejamos um exemplo de linhas de comando em assembly para um processador intel x86:

inc ax              ;adiciona um ao conteúdo do registrador ax
dec bx             ;subtrai um do conteúdo do registrador bx
add ax,bx       ;soma os valores dos regs ax e bx a armazena o resultado em ax
sub bx,1          ;subtrai 1 do conteúdo de bx

Observe que os mnemônicos estão logo no início de cada linha e o que vem depois do ponto e vírgula são os comentários explicando o que cada comando está fazendo. Os registradores são pequenos espaços de memória no núcleo do processador que costumam ter nomes como AX, ACC, BX etc. Programar em assembly é uma tarefa para espartanos já que é necessário um conhecimento elevado da arquitetura do computador em que se pretende trabalhar, além de muita paciência. A conversão de código assembly para código de máquina é realizado através de um programa chamado assembler (ou montador). Muitos confundem os dois termos, mas para deixar claro o assembly é uma linguagem e o assembler é um programa de montagem. Dessa forma o termo “programar em linguagem assembler” está incorreto.

Outra forma de se programar um computador é através de linguagens de alto nível. Essas linguagens possuem uma relação de um para n com o conjunto de instruções. Isso significa que um único comando nesse tipo de linguagem pode ser traduzido em várias instruções em linguagem de máquina. Como exemplos dessa classe de linguagens temos o C, Pascal, Java, C++, C#, Python além de várias outras, assim como o Portugol que vimos a pouco. Linguagens de alto nível são mais distantes da máquina e mais próximas dos seres humanos. Logo abaixo temos um exemplo de um trecho de programa escrito em linguagem C padrão:

for (i=1;i<=10;i++) //laço que executa o conteudo das {} dez vezes

{

k = k+1; //variável k recebe o seu conteudo + 2

printf(“k = %i”,k); //imprime na tela o valor de k

}

Nesse caso pode haver o mapeamento de mais de uma instrução de máquina para um único comando da linguagem. No código existem basicamente 4 comandos: um laço (for), uma atribuição (=), uma soma (k+1) e uma chamada de função para impressão na tela (printf). Quando esse código for traduzido para a linguagem de máquina terão de ser usadas várias de suas instruções para executar o código acima. Nesse caso então teremos n > 4, sendo n o número de instruções de máquina. O programa responsável por traduzir uma linguagem de alto nível para instruções de máquina é chamado de compilador.

Uma grande vantagem das linguagens de alto nível como C em relação ao assembly é a possibilidade de portar o código para outras arquiteturas, desde que essas possuam um compilador C próprio (o que é muito comum). Não é possível portar código assembly entre arquiteturas distintas pois o conjunto de instruções é diferente e consequentemente os mnemônicos também serão. Não posso, por exemplo, usar código assembly do processador ARM num Core i3 e nem o contrário, mas isso é possível usando código em C, já que o compilador conhece o conjunto de instruções da maquina para o qual está compilando o código e fará a tradução correta.

proglanguages

Uma grande vantagem do código assembly frente às linguagens de alto nível é a proximidade com o hardware e a possibilidade de otimização do código, deixando-o mais rápido e de menor tamanho. Isso não é possível em uma linguagem como o C, já que o compilador é quem executa a tradução para a linguagem de máquina e usa muitas vezes um número maior de instruções e de forma diferente a de um programador experiente em assembly.

Sobre o Autor

Avatar de Luciano Lourenço
Redes Sociais:

Deixe seu comentário

X