quinta-feira, 4 de abril de 2013

Linguagens de Programação

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.

Nenhum comentário:

Postar um comentário