Skip to content

Dialetos

Leonel Sanches da Silva edited this page Nov 12, 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, o 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 aos desenvolvedores não apenas desenvolver seus próprios dialetos, como também reutilizar 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 da qual foi derivada, Égua, quanto ao comportamento de interpretação e, parcialmente, de lexação e análise sintática. Sua documentação pode ser lida aqui e sua implementação, aqui.

Definimos a seguir, 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 */. São suportados apenas comentários de uma linha só. 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;
  • Égua não possui o comando leia(), implementado em Delégua, EguaP e dialetos de Portugol.

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, o resolvedor faz parte da instância da linguagem, e não do interpretador. O interpretador conhece a instância do resolvedor e chama-a antes de iniciar o processo de interpretação.
    • A implementação do dialeto Égua Clássico em Delégua usa o Resolvedor dentro do interpretador, e não como etapa em separado;
    • Em Delégua, EguaP e dialetos de Portugol não existe um Resolvedor (removido na versão 0.6.0). O time de desenvolvimento de Delégua optou por implementar uma pilha de execução de escopos, que busca variáveis usando um algoritmo que executa em O(n) no pior caso. Como a pesquisa de variável, mesmo com uma implementação de Resolver, é O(n) também no pior caso, entendemos que o Resolvedor pode ser completamente descartado.

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 só deixa o código mais elegante e estruturado, como também é 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, são utilizadas chaves para abertura e fechamento de escopo. Em EguaP, a abertura de escopo é feita pelo sinal de dois-pontos e não há um símbolo de fechamento de escopo: ele é 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)

VisuAlg

Portugol VisuAlg, ou simplesmente VisuAlg, é uma implementação feita pelo Professor Antonio Carlos Nicolodi de um dialeto de português estruturado. A estrutura se parece com a linguagem Pascal.

Delégua implementa parcialmente o dialeto VisuAlg, e este esforço ainda está em andamento. A ideia é ter o mesmo suporte de depuração que o editor de VisuAlg tem, mas para qualquer sistema operacional e capacidade de execução em ambiente remoto.