Skip to content

Dialetos

Leonel Sanches da Silva edited this page Sep 2, 2022 · 27 revisions

Delégua possui um dialeto próprio, um pouco diferente de Égua, e implementa mais um dialeto que era parte de Égua, mas foi removido: EguaP. Por isso, temos suporte a vários dialetos.

Ao executar o pacote sem parâmetros, o dialeto padrão é iniciado:

delegua
delegua ./meu-arquivo.egua

Podemos especificar um dialeto na inicialização. Por exemplo:

delegua --dialeto egua

Especifica o dialeto original de Égua (também chamado de Égua Clássico). Podemos também especificar o uso de dialetos ao executar um arquivo.

delegua --dialeto egua ./meu-arquivo.egua

Para EguaP:

delegua --dialeto eguap

A extensão do arquivo também define automaticamente o dialeto:

delegua ./meu-arquivo.eguap

A arquitetura de dialetos de Delégua

Delégua foi estruturada para ter seus componentes trabalhando de maneira independente. Isso possibilita a desenvolvedores não apenas desenvolver seus próprios dialetos, como também reusar estruturas que não requerem uma implementação própria para o dialeto. Por exemplo, o dialeto EguaP utiliza o mesmo interpretador do dialeto padrão de Delégua.

Égua Clássico

Esse dialeto segue a implementação da linguagem original, Égua, quanto ao comportamento de interpretação e, parcialmente, de lexação e análise sintática. Sua especificação pode ser lida aqui e sua implementação, aqui.

Mais do que isso, abaixo definimos, grosso modo, as principais diferenças entre este dialeto e Delégua:

  • Em Égua, ponto-e-vírgula é obrigatório ao final de cada expressão. Em Delégua, o ponto-e-vírgula é opcional;
  • Em Égua, a partir da sua versão 1.3.1, expressões e declarações devem ser obrigatoriamente acentuadas. Por exemplo, Égua não aceita funcao ou senao. Precisa ser, respectivamente, função e senão. Delégua suporta as duas formas;
  • Operadores += (adição + atribuição), -= (subtração + atribuição), *= (multiplicação + atribuição) e /= (divisão + atribuição) não são suportados em Égua: apenas em Delégua e EguaP;
  • Égua não suporta comentários multilinha, ou seja, começados por /* e finalizados por */. Apenas comentários de uma linha só são suportados. Delégua suporta comentários tanto de uma linha, começados por //, quanto multilinhas;
  • Em Égua, a interrupção de um laço de repetição é feita pela palavra reservada pausa que, no entendimento dos desenvolvedores de Delégua, não passa a ideia correta do que o comando faz. "Pausa" em português possui como definição em dicionários da língua portuguesa: "1. Breve interrupção; 2. Descanso, intervalo; 3. Tardança, lentidão, vagar.". Delégua aceita pausa por questões de retrocompatibilidade, mas a palavra reservada oficial em Delégua é sustar, que possui como definição: "verbo transitivo, intransitivo e pronominal: Fazer parar ou parar";
  • Em Égua, escreva() aceita apenas um argumento. Em Delégua e EguaP, escreva() aceita N argumentos.

Arquiteturalmente falando, as diferenças entre Égua Clássico e outros dialetos são:

  • Égua Clássico não possui um importador. Com isso, o procedimento de importação de outros arquivos fonte pós arquivo principal fica a cargo do interpretador de Égua Clássico + uma instância em separado da linguagem, o que consome mais recursos de máquina (ciclos de processamento, memória, etc.). O resultado da execução do procedimento de importação pelo interpretador, quando feito com sucesso, tem como sequência o interpretador chamador importando todas as declarações dessa instância em separado. O procedimento se repete para cada arquivo importado;
    • Em Delégua e EguaP, como todo arquivo aberto na execução da linguagem passa pelo importador, o interpretador não precisa instanciar o núcleo da linguagem inteira para cada arquivo importado: apenas um interpretador é utilizado para toda a execução;
  • Em Égua Clássico, o resolvedor faz parte da instância da linguagem, e não do interpretador. O interpretador conhece a instância do resolvedor, e a chama antes de iniciar o processo de interpretação.
    • Em Delégua e EguaP, o resolvedor vive apenas dentro do interpretador, já que a etapa de resolução de variáveis é entendida também como parte da interpretação.

EguaP

Originalmente um dialeto de Égua, mas aparentemente abandonado pelo projeto original e reimplementado em Delégua, EguaP é um dialeto que tenta juntar qualidades das linguagens Égua e Python.

Python, assim como Égua, é uma linguagem de tipagem dinâmica (Duck Typing), orientada a objetos e de propósito geral. Uma das características é o que chamamos de indentação significativa: a indentação não apenas deixa o código mais elegante e estruturado, como é algo que a linguagem força por design para funcionar corretamente. O resultado é uma melhor legibilidade e organização do código.

As diferenças fundamentais entre Delégua e EguaP são:

  • Abertura de escopo: em Delégua, usa-se chaves para abertura e fechamento de escopo. Em EguaP, a abertura de escopo é feita pelo sinal de dois-pontos, e não possui um símbolo de fechamento de escopo: o escopo é finalizado quando a indentação muda. Por exemplo:
var a = 1
se (a > 0):
    escreva('variável `a` é maior que zero. Incrementando...')
    a = 10
escreva(a)

Em Delégua, o mesmo código pode ser escrito da seguinte forma:

var a = 1
se (a > 0) {
    escreva('variável `a` é maior que zero. Incrementando...')
    a = 10
}
escreva(a)