Fonctionnalités de base pour une langue de base? Suggestions DSL?

9

J'ai enfin commencé à comprendre la complexité de la création d'un interprète et d'un compilateur. J'ai construit plusieurs versions de TinyBasic, 1964 (Dartmouth) Basic, et mes propres extensions sur ces langues avant d'arriver à ce point. Le projet le plus récent est celui que j'appelle Open Source Basic ... parce que je ne pouvais penser à aucune autre caractéristique du langage qui intéresserait les gens. Être capable d'ouvrir la source de la langue et comprendre comment certaines choses complexes se font (comment se font la numérisation, l'analyse, l'interprétation et la compilation)

Open Source Basic est d'abord interprété dans un langage basé sur la pile. Ce langage basé sur la pile est ensuite interprété et exécuté immédiatement ou transformé en un exécutable CLR.

Mes questions se résument toutes à ceci:

  • Quelles sont les fonctionnalités / constructions de base d'un langage basique? J'ai déjà ces constructions de base: Assignations, Expressions, Variables, certaines fonctions (Random, ToUpper, ToLower), Looping (for and do-while / until), If (block and single-line) Else decisions, console based input (Input ) et de sortie (Print), et des sous-routines (sans paramètres pour l'instant).
  • Quand j'ai fini d'ajouter les constructions de base à mon langage - comment devrais-je me diversifier? Dans quel (s) domaine (s)? En d'autres termes, quelle (s) direction (s) mon langage de base open source devrait-il prendre une fois que toutes les constructions génériques fonctionneront?

Merci pour votre temps,

Dominick

Dominick
la source
3
J'ai toujours voulu une langauge dotée d'une fonctionnalité AOP intégrée et prise en charge par la syntaxe.
FrustratedWithFormsDesigner
@Dominick: Et la fonctionnalité LINQ?
Predator
@Frustré ... AOP - Fonctionnalité de programmation orientée aspect? Pouvez-vous donner un exemple?
Dominick
5
Vous ne devez pas commencer à inventer un langage spécifique à un domaine à partir de fonctionnalités impératives de base. Formalisez d'abord votre domaine, transformez ces connaissances en langue, puis ajoutez des fonctionnalités de base, si elles sont nécessaires. Vous pourriez même vous retrouver avec une DSL parfaite qui n'est pas complète de Turing, et c'est l'une des meilleures propriétés des DSL.
SK-logic
1
Sûrement "goto" est une caractéristique obligatoire de tout BASIC?
Perry

Réponses:

1

Mon expérience avec les premiers BASIC sur le Commodore [Vic-20, C-64] m'a donné l'impression que les numéros de ligne étaient une «caractéristique» de base de BASIC. Il semble qu'ils ne soient plus utilisés dans les implémentations modernes, ce qui est pour moi quelque chose d'un détriment, car ma vision principale de BASIC est comme un langage d'apprentissage à partir duquel se jeter sur autre chose.

MarkHu
la source
1

Certainement une noble entreprise, mais je pense que vos priorités ont été inversées.

Votre première préoccupation devrait être les problèmes de "domaine" que votre langue est censée résoudre. C'est pourquoi on l'appelle en premier lieu un "langage spécifique au domaine". Une DSL n'est tolérable que lorsqu'elle est petite, simple et très étroitement ciblée pour résoudre un ensemble particulier de problèmes comme un couteau à travers du beurre.

Après avoir identifié le domaine et comment votre langue fonctionnera dans le domaine, vous pouvez définir des constructions ou des fonctionnalités spécifiques.

Enfin, il peut être utile de déterminer si vous souhaitez une DSL interne ou externe .

Angelo
la source
0

J'ai développé un langage de script pour une application CAE / FEA et certaines fonctionnalités que j'ai trouvées utiles pour les utilisateurs finaux sont les suivantes: Variables locales et globales Matrices avec allocation dynamique et expansion Fonctions avec arguments et par référence passant Structures (types définis par l'utilisateur) Avec les fonctionnalités que vous avez mentionnées vous-même devraient faire un langage assez puissant pour commencer. Ensuite, vous développerez selon la demande de l'utilisateur.

Gus
la source
C'est un langage intéressant et très spécifique au domaine (génie assisté par ordinateur / analyse par éléments finis). Je peux voir pourquoi vous devriez avoir besoin de matrices. Toutes vos suggestions sont plutôt bonnes et je les garderai à l'esprit. Merci.
Dominick
0

Il existe plusieurs fonctionnalités qui peuvent être ajoutées ou étendues si elles existent déjà, mais ...

... Les langages de programmation de base sont très similaires aux langages de script, et une fonctionnalité que beaucoup ont manquée ou incluse plus tard, était l'espace de noms ou les modules.

C, C ++, PHP, Visual Basic, ont commencé sans modules / espaces de noms et ont été ajoutés ultérieurement.

Les suivants peuvent être des sous-programmes (procédures ou fonctions qui ne renvoient pas de valeur) et des fonctions (sous-programmes qui renvoient une valeur spéciale).

umlcat
la source
0

comprendre comment certaines choses complexes sont exécutées (comment l'analyse, l'analyse, l'interprétation et la compilation sont effectuées)

Il y a une belle question sur le site Stack Overflow sur les ressources pour comprendre les compilateurs. Vous pouvez également consulter ma page de classe Compilers .

Quand j'ai fini d'ajouter les constructions de base à mon langage - comment devrais-je me diversifier?

Compte tenu des fonctionnalités que vous avez déjà construites, je suggère d'ajouter trois types de données: int, string, boolean. Vous devrez faire trois choses, chacune un peu plus difficile que la précédente:

  1. Modifiez la grammaire pour pouvoir analyser ces mots clés. Tester.
  2. Créez (ou ajoutez à votre table de symboles existante) de sorte que vous puissiez inclure le type de données avec le nom de la variable et d'autres propriétés. Ensuite, effectuez un débogage afin de pouvoir le tester et voir la table des symboles.
  3. Vérifiez les types compatibles avant la génération de code vers MsIL ou pendant l'interprétation. Testez les cas d'erreur et de non-erreur dans chaque mode d'exécution pour tous les types.

Si cela se passe bien, je suggère de travailler sur la portée (local dans les sous-routines vs global). Faites-moi savoir si vous souhaitez des conseils à ce sujet.

Bonne chance. Et apprécie!

Alan
la source