Para escrever algoritmos é preciso aprender os elementos de linguagens de programação e as regras de como combiná-los. Leia a nossa série Poliglota com 24 capítulos (posts) para se tornar um especialista no assunto. Este é o terceiro. O primeiro, que explica a série, está aqui.
1. Elementos de linguagens de programação
No último post, vimos que as linguagens de programação servem para comunicar ao equipamento, por meio de um software, tudo o que deve ser feito quando executá-lo.
Falamos também que existem diversas linguagens de programação e que é preciso aprender uma para desenvolver um software, porém só aprender uma não é o suficiente. É preciso aprender a programar também. Por enquanto, vamos entender quais os elementos de linguagens de programação são comuns entre elas.
Cada linguagem de programação possui um dicionário, um conjunto de regras, estruturas de controle e tipos de dados.
2. Dicionário
Dicionário de uma linguagem de programação é tudo que ela aceita. É a coleção de todas as palavras que podem ser usadas na linguagem, como em uma língua falada, mas em vez de existirem milhares de palavras, uma linguagem de programação possui em torno de 50. Por outro lado, o dicionário de uma linguagem de programação possui elementos que uma falada não possui, como operadores matemáticos e lógicos, valores, símbolos e outros. Vamos ver do que ele é formado.
2.1. Palavras reservadas
As palavras do dicionário que são definidas pela linguagem (como se viessem de fábrica contidas nela) são conhecidas como palavras reservadas ou palavras-chave. A maioria das linguagens possui palavras reservadas escritas em inglês e que expressam estruturas de controle e tipos de dados. Por exemplo, int (abreviação de integer) é um palavra reservada de muitas linguagens usada para definir o tipo numérico inteiro. Outra muito usada é a palavra reservada if, que significa “se” em português. Ela é uma estrutura de controle para falar ao computador: “se acontecer tal coisa, faça isso”. Também pode ser chamada de comando condicional ou estrutura de seleção (por selecionar o caminho que os dados são processados).
Caso um editor de texto apropriado para manipular códigos (como Sublime Text, Notepad++ e outros) seja usado, as palavras reservadas da linguagem serão reconhecidas e coloridas, o que ajuda na hora de ler e escrever o código. É normal durante o processo de escrita de código que o programador releia o que já programou várias vezes. Você faz o mesmo quando escreve uma redação, por exemplo.
2.2. Valores
O termo valor, na linguagem corrente, sugere um número. No mundo da programação, assim como aconteceu com o dicionário, valor quer dizer mais. Valores podem ser números, mas também podem ser textos e valores lógicos (que representem apenas um par de opções, como verdadeiro ou falso, 0 e 1, ligado e desligado, sim ou não).
Os valores representam os elementos de linguagens de programação que também são conhecidos como literais ou valores literais, encarados como valores finais, que não mudam de valor. O valor 12 em um código vai sempre ser 12, por exemplo. Normalmente, valores literais numéricos, como 12, 23,45 e -12, são escritos nos códigos dessa forma mesmo. Um texto, ou de forma mais precisa, um valor literal textual, como “Ryze SKT”, é escrito assim, entre aspas duplas. Conforme for a linguagem, pode ser aspas simples também. Já um literal lógico pode ser true ou false, verdadeiro e falso em inglês, respectivamente.
2.3. Operadores
Os operadores são um dos principais elementos de linguagens de programação e também entram no dicionário.
Os mais óbvios são os usados para realizar operações matemáticas. Uma soma, subtração, divisão, de forma que a linguagem de programação pode funcionar como uma calculadora.
É possível escrever uma linha de código como a abaixo sem problemas.
3+5
Como também qualquer outra expressão matemática que o programa deverá calcular na hora de sua execução.
Os operadores matemáticos básicos são representados pelos símbolos conforme abaixo: + (adição), – (subtração), * (multiplicação) e / (divisão). Outro operador presente na maioria das linguagens é operador chamado de módulo ou resto da divisão. Ele informa o resto da divisão do primeiro operando pelo segundo e é representado pelo símbolo % em várias linguagens. Exemplo:
4 % 3 = 1
Lê-se: “4 resto da divisão por 3 dá 1“. O resultado é 1 porque a divisão não é exata, sobra um resto que é igual a 1. Se fosse exata, não sobraria. Exemplo:
6 % 2 = 0
Existem também operadores de atribuição (que usam o sinal de =), de lógica (como os de comparação, inversão) e os que atuam sobre dados que não necessariamente precisam ser números.
Vamos supor que você queira saber quais são os operadores da linguagem de programação JavaScript. Basta digitar em um buscador “operadores linguagem JavaScript” para encontrar várias listagens com o que procura. Aliás, um bom link é esse aqui. Para a linguagem Java, tem esse aqui.
2.4. Identificadores
Identificadores são nomes que o programador tem que inventar para criar variáveis e outros elementos de linguagens de programação e que também entram no dicionário.
Durante o processo de escrita do código será preciso criar nomes para guardar valores. Esses nomes podem ser chamado de variáveis, propriedades, atributos, objetos, funções, enfim, seja qual for, servem para armazenar valores e o nome precisa ser criado pelo programador. Pense no conceito como um container digital para armazenar valores, um volume como um balde ou uma caixa que guarda algo dentro. É um recurso muito útil na programação e o conceito está sempre presente como um dos elementos de linguagens de programação. Você precisa disso para fazer a maioria dos programas funcionar.
Só para usar um termo, vou chamar por enquanto de variável. Lembra da memória RAM? Quando você cria uma variável em uma linguagem de programação, um espaço na memória RAM é reservado para guardar o valor e associá-lo ao nome criado para ela.
É permitido criar qualquer tipo de nome para um identificador, desde que ele atenda algumas restrições.
Por exemplo, o nome batata é um nome válido para um identificador. Agora, qualquer um que comece com um número não é, porque o programa que lê o código e transforma ele em programa precisa diferenciar o que é valor literal de identificador. Ao tentar criar uma variável com nome 2batata não vai funcionar e vai dar pau (o programa mostrará uma imagem de erro).
Não é possível também criar um identificador com o nome de uma palavra reservada pelo mesmo motivo. O programa que lê o código precisa conseguir diferenciar o que é palavra reservada de identificador.
3. Regras
Uma linguagem também possui regras, que estabelecem as restrições e as possíveis combinações entre as palavras do dicionário. As regras são divididas em sintaxe (como se escreve) e semântica (o que se escreve, significado). Vamos ver um exemplo de regra sintática.
Olhando todos os elementos que compõe o dicionário, tente escrever o código de uma linha que represente a seguinte instrução: “crie uma variável chamada batata e atribua a ela o valor 12”. E aí, acha que consegue codificar essa linha?
Clique aqui para ver o código
batata = 12
Simples, não é mesmo? Uma variável é um identificador e, dessa forma, um nome pode ser criado, além de batata ser um identificador válido. Essa linha, conceitualmente está certa e vai rodar em algumas linguagens (não em todas por questões que ainda explicarei).
E se invertemos? Assim:
12 = batata
Se escrevermos a linha da forma acima, não vai funcionar. Vai dar um erro sintático, porque o lado esquerdo do sinal de igual (usado para atribuição de valores a variáveis ou outros elementos que recebam valores) possui um valor e o lado direito um identificador. A regra sintática de uma atribuição diz que tem que ser o contrário.
Se um código for escrito em linguagem de programação e não seguir suas regras, o programa que transforma o código em programa mostrará uma mensagem de erro e a geração do software não terá êxito. Se ele contiver uma palavra não reconhecida, também resultará em erro.
3. Estruturas de controle
A ordem de execução de um código é sempre de cima para baixo, como na figura abaixo. Essa ordem estabelece uma sequência de instruções pela qual os dados irão passar quando o programa rodar.
Esse fluxo do programa, de executar os comandos linha a linha, pode ser alterado por estruturas de controle. Existem diferentes estruturas. Uma das principais é a estrutura de seleção (com o if que vimos em palavras reservadas), que faz um teste para decidir se o programa deve executar um trecho de código ou outro.
Por exemplo, imagine que a linha 7 da figura acima faz um teste, como verificar se o dano causado a um jogador é maior que sua vida atual e, se for, executa a linha 8, que contém o comando que chama uma animação de derrota; se não for, executa a linha 13 e dali para frente (14, 15, …). Ou seja, o fluxo de execução é sempre de cima para baixo, mas uma linha pode conter um comando ou uma estrutura de controle que leve a execução do programa para outro ponto que não seja a próxima linha.
Uma linguagem de programação conta com os seguintes tipos de estruturas:
- Estrutura de dados: estruturas lógicas para armazenar dados em arrays (vetores), listas ligadas, árvores, heaps e outras.
- Estruturas de seleção: estruturas condicionais para selecionar um fluxo de dados a seguir no código.
- Estruturas de repetição: estruturas para realizar a iteração de um trecho de código, conhecidas como loops.
4. Tipos de dados
Tipo de dados é um conceito muito importante e intuitivo, sendo mais um dos elementos de linguagens de programação. Quando falamos em valores na seção 2.4, vimos um pouco do assunto. Por exemplo, imagine um cadastro composto da entrada de dois valores, um campo para nome e outro para idade. Os dados do nosso sistema são: nome e idade. O tipo de dado do campo nome é um texto e o da idade é um número. Simples!
Para otimizar os recursos do computador, como memória, além de deixar as especificações do sistema mais precisas, é normal detalharmos mais tanto o tipo numérico quanto o tipo textual. O numérico pode ser, por exemplo, um número inteiro positivo pequeno, um número inteiro positivo ou negativo, um número real pequeno ou um número real muito grande. Já o textual pode ser uma única letra, uma sigla, um campo misto de números, letras e símbolos (como um e-mail) ou um grande texto, com parágrafos e formatação. Vamos entender porque isso faz diferença.
4.1 Declaração de variáveis
No exemplo de cadastro anterior, quando o botão cadastrar da interface for apertado, o valor que está contido em cada campo de cadastro passará a ser o valor de uma variável criada do software. Cada variável criada reserva (o termo técnico usado é aloca) memória suficiente para guardar o valor que ela pode receber. O tamanho de memória alocada é diretamente ligado ao tipo de dado. Imagine sua memória RAM como várias caixas pequenas prontas para guardar valores. Se o valor a ser guardado for maior do que uma caixa, ele precisará ser dividido em mais caixas. Um número pequeno, como 20.000, pode ser guardado em uma caixa só, mas um número como 10 bilhões não. Ele precisa de várias. A mesma diferença aconteça entre números inteiros e reais. Um número real, com casas decimais, requer mais de uma caixa para sua armazenagem.
Por isso, na hora de criar variáveis, muitas linguagens obrigam o programador a declarar seu tipo. Declarar, nesse contexto, é equivalente a avisar ao programa que vai transformar o código em arquivo executável qual será o tipo da variável. Vamos entender o conceito de declaração de variáveis em uma nova missão: “declare uma variável do tipo inteira de nome repolho”.
Veja a resposta clicando aqui
repolho: inteiro
A notação formal de usar primeiro o nome da variável, depois o símbolo : e, por fim, o tipo, é apenas uma convenção de pseudocódigo. Cada linguagem possui a sua forma de declarar uma variável, inclusive algumas não obrigam a declaração e outras não implementam esse conceito, que é um dos principais elementos de linguagens de programação.
4.2 Classificação quanto ao tipo
Tipo de dados é tão importante para as linguagens que elas podem ser classificadas em relação a como tratam o conceito. Veja algumas possibilidades:
- Linguagens fortemente tipadas (ou tipificadas): são linguagens em que todos os valores de variáveis e funções precisam ter o tipo de dados explicitamente declarado. Se você não declarar, dá pau e não roda.
- Linguagens fracamente tipadas: consideram e implementam conceito, mas não existe obrigatoriedade de declarar o tipo antes de usar uma variável e, mesmo após receber um tipo, uma variável pode receber um outro sem gerar nenhum tipo de erro. Exemplo: PHP e JavaScript.
- Linguagens não tipadas: não consideram o conceito de tipo de dados. Exemplos: Perl e Assembly.
Entendeu tudo? Sabe dizer quais são os principais elementos de linguagens de programação?
O próximo passo é entender o que é um implementador de linguagens de programação.
Obrigado e até o próximo post!