Existe-t-il un langage de programmation dans lequel vous pouvez définir vos propres configurations de syntaxe et il convertirait le code dans un langage que vous choisissez?
Par exemple, vous choisiriez des configurations spécifiques comme "les blocs indexés de Python", [a,b,c]
initialiseraient des tableaux, ^
pour l'exponentiation et autres. Un script le convertirait en l'équivalent de la langue de votre choix.
programming-languages
syntax
Dokkat
la source
la source
Réponses:
Oui, mais probablement pas dans votre façon de penser.
Lisp et ses proches ont de puissants systèmes de macros qui vous permettent d'effectuer des transformations arbitraires sur votre source, vous pouvez donc en principe utiliser des macros (et des macros de lecture, au niveau des caractères) pour créer à peu près toutes les extensions que vous aimez. Les langues concaténatives (et les langues des auteurs dans des domaines connexes) ont le potentiel d'une puissance de métaprogrammation similaire . Un bon exemple de ceci est Forth , dans lequel de nombreuses constructions syntaxiques (telles que des commentaires) peuvent être définies par l'utilisateur. Pour un exemple contemporain, non ésotérique, il y a un effort pour donner à Perl 6 une prise en charge améliorée par rapport à Perl 5 pour la syntaxe définie par l' utilisateur .
la source
operator[]
pour plusieurs arguments, ou introduire de nouveaux opérateurs comme dans Haskell; mais je doute que le comité voie au-delà des problèmes d'analyse.Cela ressemble à la programmation conceptuelle .
Je ne le connais pas, mais XL est un langage spécialement conçu pour lui.
Lisp et Forth prennent également en charge la programmation de concepts, bien que moins que XL. Je suggère Lisp car il est très pratique et efficace. La chose la plus importante est une syntaxe claire et flexible, et non une notation, fournie par Lisp.
Vous pourriez être intéressé par un langage comme Haskell qui a une syntaxe très flexible mais uniforme.
la source
Pas à ma connaissance.
Je ne pense pas que ce serait une bonne idée non plus - l'un des principaux avantages d'une syntaxe de langage standard est que beaucoup de gens peuvent la lire, et si tout le monde a inventé sa propre syntaxe, personne ne pourrait comprendre le code de quelqu'un d'autre. .... donc cette langue peut être amusante pour un amateur mais pas très utile pour quelque chose de pratique.
La chose la plus proche qui existe serait probablement Lisp, où le système de macro vous permet d'écrire vos propres nouvelles constructions de langage d'une manière très flexible. Normalement, vous resteriez avec la syntaxe Lisp, mais vous pouvez tout redéfinir efficacement si vous le souhaitez vraiment.
En conséquence, Lisps a tendance à être particulièrement populaire pour la mise en œuvre des DSL. Un bel exemple est ce DSL d'accès aux données à Clojure (Korma) qui prend en charge tout le code standard requis pour l'accès à la base de données.
la source
Scala est souvent utilisé de cette manière pour créer des DSL, des langages spécifiques au domaine.
Cela est principalement dû au fait que Scala n'a pas d'opérateurs et que la syntaxe d'appel de la méthode Scala peut être abrégée. Par exemple:
5 est un objet Entier. Pour calculer 5 plus 7, vous pouvez écrire
val ans = 5.add (7) sauf que la méthode d'addition est en fait nommée "+" donc vous écririez:
val ans = 5. + (7) mais dans Scala, vous n'avez pas besoin d'inclure le "." dans les appels de méthode ou les parenthèses "()" autour des arguments donc pour appeler la méthode + sur l'objet 5, vous écririez
val ans = 5 + 7, ce qui fonctionne parfaitement car Scala n'a aucun opérateur pour interférer avec votre schéma de nommage de méthode intelligent. Maintenant, étendez cette idée à vos propres classes et objets, y compris le fait que vous pouvez "remplacer" des méthodes comme + ainsi que créer vos propres méthodes nommées >>> ou ::! ou @ * @ ou simplement des noms en texte brut comme fancify.
la source
Cela ne veut pas dire que vous devriez l'utiliser car il est encore principalement expérimental, mais un paradigme de programmation récent intéressant est la programmation orientée langage (LOP).
Sergey Dmitriev l'explique plus en détail .
C'est l'idéologie de celui-ci, mais cela se résume pratiquement à soutenir le comportement que vous demandez. Vous pouvez:
L' environnement de programmation le plus actif que je connaisse pour suivre ce paradigme est le Meta Programming System (MPS) gratuit de JetBrains.
En fait, il commence également à être utilisé dans les logiciels commerciaux, alors peut-être qu'il commence à sortir de sa phase `` expérimentale '':
la source
Les langages spécifiques au domaine sont assez couramment utilisés dans la communauté Tcl. Par exemple, il n'est pas du tout rare de voir un programme Tcl qui contient à la fois C et SQL en tant que DSL intégrés (via les packages Critcl et Sqlite). À propos de la seule restriction sur un DSL intégré, il est préférable que le langage intégré équilibre ses accolades, et cela s'avère être une exigence vraiment non onéreuse dans la pratique!
Un autre langage qui facilite les DSL est Standard ML, qui vous permet d'avoir accès à des jetons bruts à partir du tokenizer système générique (avant le point où les identifiants sont convertis en mots clés). Cela facilite la réalisation d'une large classe de DSL - à condition qu'elles obéissent à certaines règles de syntaxe de base de SML, en particulier en ce qui concerne les commentaires, les chaînes et les limites des jetons - et est en fait largement utilisée dans un certain nombre d'applications de conduite clés pour la langue. (prouveurs de théorèmes, etc.)
Toutes les langues ne facilitent pas la tâche. En particulier, les langues qui analysent automatiquement le contenu des termes contreventés (beaucoup d'entre eux!) Ne peuvent pas le faire, ils nécessitent donc que la DSL soit construite par des opérateurs de substitution, en plaçant le sous-langage dans une chaîne, ou par l'utilisation d'un pré-processeur qui réécrit la DSL en quelque chose qui peut être manipulé à l'intérieur du langage hôte.
la source
AFAIU vous cherchez des langues qui peuvent vous aider à écrire votre propre DSL (Domain Specific Language). Il y a beaucoup de bons candidats. Personnellement, je recommanderais Ruby ou Io, car ils offrent 1) une surcharge d'opérateur facile, 2) une méta-programmation et 3) des mécanismes de secours comme ceux
method_missing
que vous pouvez utiliser pour créer votre propre API. Par exemple, jetez un œil à sqldsl , un DSL écrit en Ruby qui génère du SQL en lisant le code Ruby.la source
Je ne l'ai pas réellement utilisé en soi, mais si je me souviens bien, TXL est spécialement conçu pour traduire le code source. En tant que tel, vous devriez pouvoir l'utiliser pour spécifier comment traduire à partir de votre langue et / ou des extensions de langue vers n'importe quelle langue réelle cible.
Il semble avoir une grammaire disponible pour Javascript. Mais, ne l'ayant pas utilisé auparavant, je ne sais pas exactement comment cela pourrait vous aider.
la source
Il existe un joli préprocesseur appelé PPWizard, assez puissant. Une fois que vous avez appris sa syntaxe, vous pouvez créer des définitions de macro pour cibler différents langages - pas que ce soit à toute épreuve ou amusant, mais c'est un outil utile.
la source
Peut-être que ce que vous recherchez est en tant que compilateur compilateur. Un compilateur compilateur prend une définition de langage écrite dans un langage formel et crée un compilateur pour ce langage.
Jetez un œil à http://en.wikipedia.org/wiki/Compiler-compiler
la source
Une façon courante de personnaliser partiellement un langage de programmation consiste à utiliser un pré-processeur macro. Par exemple, vous pouvez exécuter "dokkat-lang" via le préprocesseur C avant de placer le résultat là où un environnement javascript le téléchargerait.
Ce que vous pouvez faire dépend de la sophistication de votre préprocesseur. Notez que les premières versions de C ++, d'Objective C et de divers langages expérimentaux ont été effectuées en prétraitant le code source avant de les alimenter dans une chaîne d'outils de compilation C standard.
la source