Recursos básicos para um idioma básico? Sugestões DSL?

9

Finalmente comecei a entender a complexidade por trás da criação de um intérprete e um compilador. Criei várias versões do TinyBasic, 1964 (Dartmouth) Basic, e minhas próprias expansões nesses idiomas antes de chegar a esse ponto. O projeto mais recente é o que chamo de Open Source Basic ... porque não conseguia pensar em outros recursos do idioma que interessariam às pessoas. Ser capaz de abrir a fonte do idioma e entender como são feitas algumas coisas complexas (como são feitas a varredura, a análise, a interpretação e a compilação)

O Open Source Basic é interpretado primeiro em um idioma baseado em pilha. Essa linguagem baseada em pilha é então interpretada e executada imediatamente ou transformada em um executável CLR.

Todas as minhas perguntas se resumem a isso:

  • Quais são os recursos / construções básicos de uma linguagem baseada em Basic? Eu já tenho essas construções básicas: Atribuições, Expressões, Variáveis, algumas funções (Aleatória, ToUpper, ToLower), Looping (por e fazer enquanto / até), If (bloco e linha única) Decisões Else, entrada baseada em console (Entrada) ) e saída (Imprimir) e sub-rotinas (sem parâmetros ainda).
  • Quando termino de adicionar as construções básicas no meu idioma - como devo ramificar? Em que domínio (s)? Em outras palavras, que direção minha linguagem básica de código aberto deve seguir depois que todas as construções genéricas funcionarem?

Obrigado pelo seu tempo,

Dominick

Dominick
fonte
3
Eu sempre quis um idioma que tivesse funcionalidade AOP integrada, suportada por sintaxe.
FrustratedWithFormsDesigner
@ Dominick: Que tal a funcionalidade LINQ?
Predator
@Frustrated ... AOP - Funcionalidade de programação orientada a aspectos? Você poderia dar um exemplo?
Dominick
5
Você não deve começar a inventar uma linguagem específica de domínio a partir de recursos imperativos básicos. Formalize seu domínio primeiro, transforme esse conhecimento em um idioma e, em seguida, adicione recursos básicos, se necessário. É provável que você acabe com um DSL perfeito que não seja completo para Turing, e é uma das melhores propriedades dos DSLs.
SK-logic
11
Certamente "ir" é uma característica obrigatória de qualquer BASIC?
11117 Perry

Respostas:

1

Minha experiência com o início do BASIC no Commodore [Vic-20, C-64] me deu a impressão de que os números de linha eram um "recurso" essencial do BASIC. Parece que eles não são mais usados ​​em implementações modernas, o que para mim é uma desvantagem, pois minha visão principal do BASIC é como uma linguagem de aprendizado a partir da qual trampolim para outra coisa.

MarkHu
fonte
1

Definitivamente, um empreendimento nobre, mas acho que suas prioridades foram revertidas.

Sua primeira preocupação deve ser os problemas de "domínio" que seu idioma é direcionado. É por isso que é chamado de "linguagem específica de domínio" em primeiro lugar. Uma DSL é tolerável apenas quando é pequena, simples e muito focada para resolver um conjunto específico de problemas, como uma faca na manteiga.

Depois de identificar o domínio e como seu idioma funcionará no domínio, você pode definir construções ou recursos específicos.

Por fim, pode ser útil considerar se você deseja uma DSL interna ou externa .

Angelo
fonte
0

Desenvolvi uma linguagem de script para um aplicativo CAE / FEA e alguns recursos que achei úteis para os usuários finais são: Variáveis ​​locais e globais Matrizes com alocação e expansão dinâmicas Funções com argumentos e passagem de referência Estruturas (tipos definidos pelo usuário) os recursos que você mencionou devem criar uma linguagem bastante poderosa para começar. Então você desenvolverá de acordo com a solicitação do usuário.

Gus
fonte
Essa é uma linguagem interessante e muito específica do domínio (Engenharia Assistida por Computador / Análise de Elementos Finitos). Eu posso ver por que você precisa de matrizes. Todas as suas sugestões são muito boas e eu vou lembrá-las. Obrigado.
Dominick
0

Existem vários recursos que podem ser adicionados ou estendidos se já existir, mas ...

... As linguagens de programação básicas, são muito semelhantes às linguagens de script, e um recurso que muitos perderam ou foram incluídas posteriormente, era o namespace ou módulos.

C, C ++, PHP, Visual Basic, foram iniciados sem módulos / namespaces e adicionados posteriormente.

O próximo pode ser sub-rotinas (procedimentos ou funções que não retornam um valor) e funções (sub-rotinas que retornam um valor especial).

umlcat
fonte
0

entender como algumas coisas complexas são feitas (como a digitalização, análise, interpretação e compilação são feitas)

Há uma boa pergunta no site Stack Overflow sobre recursos para entender os compiladores. Você também pode dar uma olhada na minha página da classe Compiladores .

Quando termino de adicionar as construções básicas no meu idioma - como devo ramificar?

Dado os recursos que você já construiu, sugiro adicionar três tipos de dados: int, string, booleano. Você precisará fazer três coisas, cada uma mais difícil que a anterior:

  1. Modifique a gramática para poder analisar essas palavras-chave. Teste.
  2. Crie (ou adicione à sua existente) tabela de símbolos para poder incluir o tipo de dados junto com o nome da variável e outras propriedades. Em seguida, faça uma opção de depuração para que você possa testar isso e ver a tabela de símbolos.
  3. Verifique tipos compatíveis antes da geração do código para MsIL ou durante a interpretação. Teste casos de erro e não erro em cada modo de execução para todos os tipos.

Se isso der certo, sugiro trabalhar no escopo (local nas sub-rotinas versus global). Deixe-me saber se você gostaria de alguns conselhos sobre isso.

Boa sorte. E aproveitar!

Alan
fonte