Existe-t-il un langage de programmation personnalisable que vous pouvez utiliser pour vous convertir à d'autres?

13

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.

Dokkat
la source
1
J'espère bien que non. TIMTOWTDI est sans doute mauvais, mais "inventer autant de façons incompatibles que vous le souhaitez" aurait certainement les mêmes inconvénients des centaines de fois, et serait encore moins utile. Les DSL en valent parfois la peine, mais redéfinir la moitié de la syntaxe (ou pire - échanger deux opérateurs, donnant une compatibilité apparente mais une sémantique différente) juste pour le
Je pose cette question car je programme en particulier sur javascript et j'aimerais vraiment, vraiment pouvoir mettre en place quelques sucres de syntaxe sur mon code mais le langage ne le permet tout simplement pas. Même une surcharge de l'opérateur n'est pas possible.
Dokkat
2
Dans une certaine mesure, ce que vous décrivez ressemble à des macros de préprocesseur . Maintenant, si seulement nous pouvions avoir une fonctionnalité similaire pour Perl ...
Yannis
5
@Dokkat: Veuillez mettre à jour la question pour indiquer spécifiquement qu'il s'agit de JavaScript. La question - comme on l'a demandé - est un cauchemar de maintenance et d'assistance. Ajouter une nouvelle syntaxe à une langue existante (ou utiliser un pré-processeur pour changer votre langue privée en langue publique) est vraiment horrible. Pourtant. Si vous répertoriez des problèmes spécifiques de sucre de syntaxe JavaScript, vous pouvez obtenir une aide spécifique .
S.Lott
3
Ces «langages de programmation personnalisés» sont normalement appelés «langages spécifiques au domaine» ou DSL.
Michael Dillon

Réponses:

14

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 .

Jon Purdy
la source
8
Je en quelque sorte savais que Perl serait ( en partie) la réponse. Je suppose que les macros du préprocesseur C correspondent également à la description, dans une petite mesure.
yannis
La surcharge des opérateurs en C ++ peut également être agréable. L'exemple du bonjour au monde vient à l'esprit. cout << "Salut";
Lord Tydus
@LordTydus: En effet, et même juste une surcharge d'opérateur vous permet de faire un peu de magie derrière une interface saine. Ce serait bien si C ++ avait des capacités de surcharge plus générales, disons, surcharger 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.
Jon Purdy
3

Cela ressemble à la programmation conceptuelle .

Je ne le connais pas, mais XL est un langage spécialement conçu pour lui.

XL propose une syntaxe et une sémantique reconfigurables par le programmeur. Les plug-ins du compilateur peuvent être utilisés pour ajouter de nouvelles fonctionnalités au langage.

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.


Par exemple, vous choisiriez des configurations spécifiques comme "les blocs indexés de Python", "[a, b, c]" initialisent les tableaux, "^" pour l'exponentiation et autres.

Vous pourriez être intéressé par un langage comme Haskell qui a une syntaxe très flexible mais uniforme.

Pubby
la source
C'est ce que je cherchais.
Dokkat
2

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.

mikera
la source
2

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.

Michael Dillon
la source
C'est génial. Je vais jeter un oeil sur scala.
Dokkat
1

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).

Le concept de programmation orientée langage adopte l'approche pour capturer les exigences dans les termes de l'utilisateur, puis pour essayer de créer un langage d'implémentation aussi isomorphe que possible aux descriptions de l'utilisateur, afin que la correspondance entre les exigences et l'implémentation soit aussi directe que possible.

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:

  • Étendez une langue existante.
  • Composez différentes langues.
  • Utilisez un «langage de transformation» existant afin de convertir vos mots clés nouvellement définis en un langage de base.

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 '':

  • Realaxy est un éditeur d'actionscript entièrement construit sur MPS. En utilisant la puissance de LOP, ils ont pu mettre en œuvre, par exemple, des fermetures pour AS3.
  • mbeddr C est un langage C extensible basé sur MPS.
Steven Jeuris
la source
1

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.

Associés Donal
la source
0

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_missingque 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.

sakisk
la source
0

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.

mootinator
la source
0

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.

marque
la source
voici quelques liens: CONTENU PPWIZARD (documents officiels), PPWizard - EDM2 (une référence externe). L'outil est puissant, mais sa documentation n'est pas facile à lire (peut-être à cause de sa puissance).
Wolf
0

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

Olivier Jacot-Descombes
la source
0

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.

hotpaw2
la source