Eu comecei a escrever um artigo que, até então, achava ser simples sobre os Sistemas de Tipos no C#, mas acabei caindo em um buraco negro. Se você não é um estudante avançado de ciência da computação ou um curioso nato, talvez não conheça isso ou não se importe muito. Talvez, inclusive, saber disso não faça diferença no dia a dia, na hora de codificar algum produto (o que você acha sobre isso? Deixe nos comentários).
Dentro da ciência da computação, existe um campo que estuda a teoria das linguagens de programação. Vale a pena dar uma lida sobre isso. Dentro dessa teoria, há uma parte que trata dos sistemas de tipagem em linguagens de programação. Parece confuso, mas vamos com calma. Se eu consegui entender, você também consegue. Na realidade, é mais simples do que parece.
Tempo de compilação x Tempo de execução
A distinção entre uma linguagem ser fortemente tipada ou fracamente tipada está relacionada à rigidez das regras de tipo, não ao momento da verificação de tipo.
Vamos começar, então, falando sobre tempo de execução e tempo de compilação, conceitos importantes para entender o resto do artigo.
Tempo de compilação
É o período em que o código-fonte (o código que você escreveu) é traduzido para código de máquina pelo compilador. Durante o tempo de compilação, o compilador consegue verificar a sintaxe e a semântica do programa e gera o código para que o programa possa ser executado. Durante esse processo, são realizadas algumas etapas como a análise léxica e sintática, a geração de um código intermediário que facilita a otimização do código para que ele seja mais eficiente e livre de erros.
Tempo de execução
É simplesmente o período no qual um programa está sendo executado. Isso significa que o código gerado a partir do código-fonte é carregado na memória e as instruções são executadas pelo processador. Apesar da explicação ser "simples", várias atividades cruciais estão acontecendo nos bastidores, como a alocação de memória para as variáveis e estruturas de dados, a interação com o sistema operacional e a liberação desses recursos quando o programa é encerrado.
Temos, então, linguagens estaticamente e dinamicamente tipadas. Oh, Deus!
Linguagem Estaticamente Tipada
Em uma linguagem estaticamente tipada, os tipos das variáveis são verificados em tempo de compilação. Isso significa que você precisa especificar o tipo de cada variável, e o compilador verifica se as operações realizadas com essas variáveis são válidas para o tipo especificado.
Linguagem Dinamicamente Tipada
Em uma linguagem dinamicamente tipada, os tipos das variáveis são verificados em tempo de execução. Isso significa que você não precisa especificar o tipo de cada variável e pode atribuir valores de diferentes tipos a uma variável ao longo do tempo.
Acima, vimos sobre o momento de verificação de tipo e agora vamos falar sobre a rigidez das regras de tipo, ou seja, o que uma linguagem permite ou não:
Linguagem Fortemente Tipada
É uma linguagem em que os tipos das variáveis (ou seja, se é int
ou string
, por exemplo) são rigidamente definidos, e a verificação de tipo é feita em tempo de compilação. Isso significa que ao escrever o código, você precisa definir o tipo de cada variável e não pode atribuir valores de outros tipos a essa variável. Por exemplo, você não pode realizar uma operação matemática com um número e uma string sem primeiro converter explicitamente o tipo do dado.
O C# é uma dessas linguagens. Você não pode fazer como na primeira linha do exemplo abaixo, onde eu atribuo uma string "dez" a uma variável do tipo inteiro. Você receberá um erro de compilação "Cannot implicitly convert type 'string' to 'int'". Para esse tipo de linguagem, geralmente você precisará fazer uma conversão explícita, como na segunda linha do exemplo.
int numero = "dez";
int numero = int.Parse("10");
Outras linguagens fortemente tipadas: Java, Kotlin, C++, Rust e Typescript
Linguagem Fracamente Tipada
Em uma linguagem fracamente tipada, as variáveis podem assumir diferentes tipos de dados ao longo do tempo sem a necessidade de conversões explícitas. A verificação de tipo é feita em tempo de execução, o que permite que as operações sejam realizadas entre diferentes tipos de dados sem gerar erros de tipo em tempo de compilação. Isso permite uma maior flexibilidade, mas também pode levar a erros difíceis de detectar.
O JavaScript é uma dessas linguagens. Pyhton e PHP também!
let numero = 10;
let texto = "20";
let resultado = numero + texto;
console.log(resultado); //1020
No exemplo acima, o resultado exibido no console é a concatenação da string com o número inteiro. Para realizar a soma dos dois valores, é necessário então uma conversão de tipo:
let numero = 10;
let texto = "20";
let resultado = numero + parseInt(texto);
console.log(resultado); // 30
Quando me deparo com algum problema de código, entender o tipo da linguagem e quando esse erro foi gerado me ajuda a resolver de forma mais rápida e eficiente. Por isso, gosto de estudar essas partes um pouco mais teóricas da computação. Pesquisar e fazer esse resumo me ajudou a relembrar conceitos importantes. Espero que tenha ajudado você também.
Top comments (0)