Linguagem de programação
Uma linguagem de programação é uma linguagem utilizada para escrever programas de computador. As linguagens de programação são em geral descritas lexicalmente por expressões regulares e sintaticamente por gramáticas, e.g., através da notação BNF (Backus Normal Form ou Backus–Naur Form).
A sintaxe de uma linguagem é o conjunto de regras que definem as relações válidas entre os constituintes da linguagem, e.g., palavras e frases. Nota-se que a sintaxe não atribui significado às frases.
Gramática
Uma linguagem pode ser descrita formalmente por uma gramática composta por:
- Símbolos não terminais, que não aparecem nas frases mas que servem para definir os componentes e a estrutura das frases. Cada um destes símbolos está associado a conjunto de identidades da linguagem.
- Símbolo inicial, um símbolo não terminal especial que denota o elemento principal da linguagem.
- Símbolos terminais que aparecem nas frases da linguagem.
- Regras de produção que descrevem a estrutura dos vários componentes da linguagem. Estas regras definem todas as frases da linguagem a partir do símbolo inicial.
Para descrever a sintaxe do Python vamos utilizar a notação BNF (Backus Normal Form ou Backus–Naur Form). Regras:
- Os símbolos não terminais escrevem-se entre
<
e>
. - Os símbolos terminais escrevem-se sem qualquer denotação especial.
- As regras de produção escrevem-se segundo a seguinte convenção:
- o símbolo
::=
define componentes da linguagem, i.e., símbolos não terminais, e lê-se "definido como"; - o símbolo
|
denota possíveis alternativas e lê-se "ou"; - a utilização do carácter
+
imediatamente após um símbolo não terminal denota que o mesmo pode ser repetido uma ou mais vezes; - a utilização do carácter
*
imediatamente após um símbolo não terminal denota que o mesmo pode ser repetido zero ou mais vezes; - a utilização de chavetas,
{
e}
, englobando símbolos terminais ou não terminais, significa que esses símbolos são opcionais.
- o símbolo
Exemplo de gramática em notação BNF
Número binários:
<número binário> ::= <digito binário> | <digito binário> <número binário> <digito binário> ::= 0 | 1
Note-se a natureza recursiva da primeira regra.
Exercício: Proponha uma alternativa de gramática para definir números binários.
Semântica
A semântica de uma linguagem atribui significado a cada frase da linguagem. Note-se a diferença entre a semântica e a sintaxe, a primeira nada diz a respeito da geração das frases da linguagem e a segunda nada diz a respeito do significado dessas frases. A descrição semântica de uma linguagem é bem mais complicada e é feita em geral utilizando linguagem natural, sendo muitas vezes informal e levando a problemas de ambiguidade, mas dando uma perspetiva intuitiva da linguagem. É também possível definir e estudar a semântica segundo uma abordagem formal e tendo por base a lógica matemática, no entanto leva-nos a uma descrição por vezes menos intuitiva e bastante mais complexa do ponto de vista dos programadores.
Nesta disciplina estudaremos portanto, de forma incremental, a semântica da linguagem Python, descrevendo a mesma utilizando língua natural.
Erros
Neste âmbito os programas podem conter erros que podem ser de natureza sintática ou semântica.
Os erros de natureza sintática resultam de o programa não corresponder a frases válidas da linguagem. O programador pode por exemplo não ter utilizado a sintaxe definida pela gramática quando escreveu o programa. Este tipo de erros é detetado pelo processador da linguagem. Caso existam erros sintáticos num programa, o processador da linguagem indica que existem erros e dá em geral um diagnóstico de possíveis causas dos mesmos. O programador pode basear-se nesse diagnóstico para corrigir o programa. Nota-se que os erros sintáticos têm de ser todos corrigidos antes de ser possível executar as instruções no programa.
Os erros de natureza semântica ou erros lógicos são em geral bastante mais difíceis de detetar. Estes erros surgem quando o programador não expressa corretamente as ações a executar pelo programa segundo a semântica da linguagem. Estes erros podem manifestar-se em mensagens de erro na execução do programa, na produção de resultados errados, ou em programas que não terminam.
Ao processo de deteção de erros sintáticos e semânticos dá-se o nome de depuração ou debugging. O processo será mais rápido ou mais lento dependendo da experiência do programador.
Gramática para Python
A gramática oficial do Python 3 está disponível em https://docs.python.org/3/reference/grammar.html. Ainda que anotação seja um pouco diferente daquela que vamos utilizar nesta disciplina, servirá para nossa referência.