Você quer se tornar um programador (ou desenvolvedor, ou ainda engenheiro de software)? – Entenda sobre as linguagens de programação!
No meu post Plano de estudos para um novo desenvolvedor – Tio Aguiar falei que o primeiro passo é escolher uma linguagem de programação, mas para quem está entrando no universo do desenvolvimento de software precisa entender o que é (1)linguagem de programação, (2) compiladores, (3) linguagem de alto e baixo nível, (4) linguagem de programação compilada e interpretada, (5) linguagem tipada e não tipada, por isso vamos dar uma passo atrás para aprimorar nosso entendimento.
Vamos falar sobre cada um destes itens:
1. Linguagem de programação
Para entender o que é a linguagem de programação precisamos saber como os computadores se comunicam computadores. Eles não se comunicam como nós humanos, eles entendem apenas “0”(zero) ou “1”(um) ou seja uma linguagem binária ou de máquina.
Para que os computadores pudessem entender as instruções que nós humanos passamos para eles era necessário uma linguagem de programação, que é um arquivo texto que nós humanos conseguimos ler e que é traduzido em uma linguagem binária ou linguagem de máquina.
Mas como essas instruções humanas são transformadas em linguagem de máquina? Para entender isso vamos entrar no segundo assunto – Compiladores.
2. Compiladores
A tarefa de traduzir o arquivo texto com as instruções em linguagem de máquina ou binária é realizada pelo compilador. Cada linguagem possui o seu próprio compilador, ou seja cada um trabalha de formas diferentes para fazer esta tradução.
Alguns compiladores permitem que seja gerado linguagem binária ou de máquina para cada vez mais uma variedade de sistemas operacionais como Windows, Linux, Mac e etc..
3. Linguagem de baixo e alto nível
Uma linguagem de programação pode ter uma ou mais características, podemos agrupar as linguagens segundo essas categorias que são linguagens de baixo e alto nível, compilada e interpretada, tipada e não tipada. Vamos começar a entender essas categorias falando sobre linguagens de baixo e alto nível.
Quando uma linguagem tem instruções mais detalhadas e para realizar as operações simples ela é chamada de linguagem de baixo nível isso significa que para tarefas simples o programador tem um esforço maior para gerar o código ou estas instruções, por que essa linguagem se aproxima mais da linguagem de máquina.
Exemplo de linguagem de baixo nível: Assembly
C..ctor()
L0000: push ebp
L0001: mov ebp, esp
L0003: push eax
L0004: mov [ebp-4], ecx
L0007: cmp dword ptr [0x1233c1a8], 0
L000e: je short L0015
L0010: call 0x0fc50140
L0015: mov ecx, [ebp-4]
L0018: call System.Object..ctor()
L001d: nop
L001e: nop
L001f: mov esp, ebp
L0021: pop ebp
L0022: ret
C.M()
L0000: push ebp
L0001: mov ebp, esp
L0003: push eax
L0004: mov [ebp-4], ecx
L0007: cmp dword ptr [0x1233c1a8], 0
L000e: je short L0015
L0010: call 0x0fc50140
L0015: nop
L0016: mov ecx, [0x5567618]
L001c: call System.Console.WriteLine(System.String)
L0021: nop
L0022: nop
L0023: mov esp, ebp
L0025: pop ebp
L0026: ret
Exemplo de um código em baixo nível em Assembly apenas para exibir na tela “Olá Mundo”
Linguagem de alto nível é aquela que favorece mais o entendimento do desenvolvedor, ou humano, ela está mais próxima a nossa maneira de nos comunicar.
Exemplos de linguagens de programação de alto nível: C#, Java, Kotlin, Pascal e outros.
using System;
public class C
{
public void M()
{
Console.WriteLine("Olá Mundo");
}
}
Exemplo de um código em alto nível em C# para exibir na tela “Olá Mundo”, agora bem mais simples e fácil de entender.
Se você já domina um pouco mais o C# você pode se divertir vendo as diferenças usado o sharplab.io no lado esquerdo temos um código em C# e no lado direito em Results selecione o JIT Asm
Sendo assim aqui podemos ter um insight, se você quer começar a aprender desenvolvimento de software com o pé direito, escolha uma linguagem de alto nível, por que está mais próximo do seu entendimento.
4. Linguagem compilada e interpretada
Quando nos comunicamos com pessoas que tem um idioma diferente do nosso precisamos que alguém faça a tradução para nós. Imagine o seguinte: você recebe um documento com instruções vinda de outro país no idioma que não é o seu, alguém que conhece ambos os idiomas faz uma tradução para você. Essa tradução pode ser realizada com duas abordagens:
- Uma nova versão deste documento é escrito em seu idioma.
- O documento pode ser lido em tempo real no seu idioma por um interprete ou tradutor.
Ambas abordagens geram o mesmo resultado – a tradução, mas cada uma delas tem prós e contras.
Na abordagem 1 quando o documento necessita de atualização, é necessário traduzir todo o documento e gerar uma nova versão(contra – a tradução vai levar um pouco mais de tempo para chegar a você). A nova versão pode ser lida diretamente por você sempre que precisar (pró – você não vai precisar da ajuda permanente de um interprete ou tradutor, o entendimento será mais rápido).
Na abordagem 2 quando o documento necessita de atualização, o trecho alterado será traduzido (pró – a versão traduzida é lida pelo interprete imediatamente), mas SEMPRE será necessário a intermediação do interprete ou tradutor(contra).
Acredito que essa analogia tenha ajudado você começar a perceber as diferenças entre a linguagem compilada e interpretada.
- Linguagem compilada – O compilador converte (traduz) o código fonte com as instruções gerado pelo programador para linguagem de máquina, o computador passa ter a versão destas instruções em binário.
- Linguagem interpretada – As instruções contidas no código fonte gerada pelo programador é traduzida simultaneamente por um interpretador para a linguagem de máquina. Cada vez que necessitamos destas instruções precisa que o interpretador traduza estas instruções.
Assim sendo temos prós e contras tanto para linguagem compilada como para linguagem interpretada.
Na linguagem compilada toda vez que o código fonte com as instruções escritas pelo programador é atualizado é necessário gerar o código binário na linguagem da máquina (geralmente um arquivo .exe ou .dll), este é o contra. Porém o pró é que como o computador não depende de um interpretador a execução do programa é mais rápida.
Na linguagem interpretada toda vez que o código fonte com as instruções escritas pelo programador é atualizado NÃO é necessário gerar o código binário na linguagem da máquina, basta apenas atualizar este código, ao fazer a leitura do arquivo o interpretador já faz a tradução atualizada para o computador – este é o pró. Mas o contra é a dependência do computador do interpretador, o que torna a execução do programa um pouco mais lenta.
Entender estes prós e contras das linguagens interpretadas e compiladas é um insight importante, pois como desenvolvedores usaremos em algum momento tanto a linguagem interpretada quanto a compilada, portanto podemos e usar este conhecimento em nosso favor.
5. Linguagem tipada e não tipada
Antes mesmo de entender a definição de linguagem tipada e não tipada precisamos entender o que é o tipo de dado.
Tipo de dado é a definição do formato daquele dado ou informação, pode ser um texto, número, data e etc.
A linguagem tipada ou linguagem fortemente tipada obriga o desenvolvedor definir o tipo de dado, no caso da linguagem não tipada o desenvolvedor não define o tipo de dado.
Sendo assim podemos concluir que com a linguagem não tipada o desenvolvedor tem maior liberdade para trabalhar com as variáveis, por que não preciso definir um tipo de dado para atribuir um valor. Veja o exemplo de um código em PHP que é uma linguagem não tipada.
$idade = 25; // OK
$idade = 25.75; // OK
$idade = "25 anos"; // OK
$idade = 'i'; // OK
Com linguagens tipadas ou fortemente tipadas o desenvolvedor é obrigado a definir o tipo da informação que a variável deve armazenar. Embora o desenvolvedor tenha a obrigação de definir o tipo da variável, nas linguagens fortemente tipadas temos uma maior otimização de memória, por que quando o tipo é definido o computador sabe onde e o tamanho da alocação de memória para este dado. Esse tipo de otimização de memória não ocorre em linguagens não tipadas, isso significa que o computador pode alocar mais ou menos memória para uma variável sem um tipo. Veja o exemplo abaixo em C# uma linguagem fortemente tipada:
int idade = 25; // OK Funciona
int idade = 25.75; // ERRO Não Funciona
int idade = "25 anos"; // ERRO Não Funciona
int idade = 'i'; // ERRO Não Funciona
Veja abaixo que no C# cada tipo já tem seu tamanho definido:
int => 32-bits
float => 32-bits
double => 64-bits
decimal => 128-bits
O insight aqui é ao optar por uma linguagem não tipada ganhamos em flexibilidade ao escrever nosso código e perdemos em otimização de memória. E se optarmos por uma linguagem fortemente tipada ganhamos em otimização de memória, mas para isso é obrigatório definir os tipos de variáveis.
Conclusão
Aprendemos que a linguagem de programação é o conjunto de instruções para o computador que foi escrito em um arquivo texto que nós conseguimos ler. Mas que para transformar este conjunto de instruções em linguagem de máquina ou binária precisamos de um compilador que fará esta tradução.
Entendemos que as linguagens de programação tem múltiplas características: linguagem de alto e baixo nível, compilada e interpretada, fortemente tipada e não tipada. Cada característica tem suas limitações e vantagens, o insight é que quando você entende bem isso você vai conseguir lidar com todo tipo de linguagem de programação.
[…] conhece sobre linguagens de programação e suas características recomendo a leitura do meu post Linguagens de Programação – Tio Aguiar […]