Un langage de programme peut-il être suffisamment malléable pour permettre aux programmes d'étendre la sémantique des langues

15

En ce qui concerne les fonctionnalités dans des langages comme ruby ​​(et javascript), qui permettent à un programmeur d'étendre / remplacer des classes à tout moment après l'avoir défini (y compris des classes comme String), est-il théoriquement possible de concevoir un langage permettant aux programmes de s'étendre plus tard sa sémantique.

ex: Ruby n'autorise pas l'héritage multiple, mais puis-je étendre / remplacer le comportement du langage par défaut pour permettre une implémentation de l'héritage multiple.

Y a-t-il d'autres langues qui le permettent? Est-ce réellement un sujet de préoccupation pour les concepteurs de langues? En examinant le choix d'utiliser ruby ​​pour construire un cadre de rails pour le développement d'applications Web, ces langages peuvent être très puissants pour permettre la conception de cadres (ou DSL) pour une grande variété d'applications.

sandeepkunkunuru
la source
2
Considérez-vous comme des extensions sémantiques les macros hygiéniques de Scheme ou la réflexion de Newspeak qui permettent aux exceptions d'être implémentées en tant que code de bibliothèque? Qu'en est-il des extensions syntaxiques comme Perligata: Romana ?
Cela semble être une question demandant une liste de langues plutôt que des concepts. Dans l'attente de modifications modifiant l'orientation de la question, je vote virtuellement pour fermer comme hors sujet.
Raphael
Si je me souviens bien, même Java va obtenir des fonctionnalités qui permettent aux programmes d'étendre le système de type.
Raphael
1
@Raphael, pensez-vous au JSR 305 ? Les annotations Java ont été conçues (en partie) par Gilad Bracha qui a conçu Newspeak que j'ai lié dans ma réponse ci-dessous et a également défendu les systèmes de type enfichables . JSR 305 fournit des annotations système de type comme @Nullableet @NonNullqui sont utilisées par des vérificateurs externes comme findbugs.
Mike Samuel
On ne sait pas ce que signifie "étendre sa sémantique". Si je regarde Boost.Spirit , cela dépasse déjà mon seuil personnel d '"extension de la sémantique": les opérateurs mathématiques de C ++ sont plutôt utilisés pour décrire une syntaxe de langage, que le compilateur transforme ensuite en analyseur pour ledit langage. Je sais que ce n'est pas ce que l'on entend par "étendre la sémantique du langage" par les rats de laboratoire, mais je pense que c'est assez impressionnant.
DevSolar

Réponses:

12

Converge possède des installations de méta-programmation assez impressionnantes.

À un niveau simple, cela peut être considéré comme une fonction de type macro, bien qu'il soit plus puissant que la plupart des fonctions de macro existantes car du code arbitraire peut être exécuté au moment de la compilation. En utilisant cela, on peut interagir avec le compilateur et générer du code en toute sécurité et facilement sous forme d'ITrees (aka arbres de syntaxe abstraite).

qui est une avancée par rapport aux macros hygiéniques de Scheme qui permettent des définitions de macro référentiellement transparentes.

Des mécanismes comme les quasi - critères ont permis de construire et de déstructurer des arbres d'analyse dans d'autres langages, mais ceux-ci sont plus souvent utilisés pour interagir avec des langages spécifiques au domaine (DSL) au lieu de s'auto-modifier.


La réflexion de Newspeak permet aux exceptions d'être implémentées en tant que code de bibliothèque.

7.6 Traitement des exceptions

Parce que Newspeak fournit un accès réfléchi (7.2) aux enregistrements d'activation (3.6), la gestion des exceptions est purement un problème de bibliothèque. La plateforme fournira une bibliothèque standard qui prend en charge la levée, la capture et la reprise des exceptions, tout comme dans Smalltalk.


Perligata: Romana montre comment une syntaxe entièrement nouvelle peut être appliquée à une langue.

Cet article décrit un module Perl - Lingua :: Romana :: Perligata - qui permet d'écrire des programmes Perl en latin.


Sans doute sémantiquement non significatif, PyPy est un générateur d'interpréteur pour les langues dont la sémantique est spécifiée dans un sous-ensemble de Python hautement analysable statiquement, et ils l'utilisent pour expérimenter de nouvelles constructions de langage en Python comme l'ajout de thunks au langage.


Ometa pourrait également être intéressant .

Cette thèse porte sur l'expérimentation en informatique. En particulier, je montrerai que les nouveaux langages et constructions de programmation conçus spécifiquement pour soutenir l'expérimentation peuvent simplifier considérablement les tâches des chercheurs et des programmeurs.

Je présente un travail qui aborde deux types d'expérimentation très différents. Le premier vise à aider les chercheurs en langages de programmation à expérimenter leurs idées, en leur facilitant la création de nouveaux langages de programmation et d'extensions de langages existants. L'autre étudie l'expérimentation en tant que paradigme de programmation, en permettant aux programmes eux-mêmes d'expérimenter différentes actions et possibilités - en d'autres termes, c'est une tentative de fournir un support linguistique pour que faire si ...? ou raisonnement des mondes possibles.

La thèse d'Alex Warth démontre l'utilisation d'un Ometa pour définir une nouvelle sémantique significativement nouvelle (sémantique transactionnelle via les mondes) dans JavaScript + Ometa.

Mike Samuel
la source
8

"Est-ce théoriquement faisable? *

LS

L

SL

Le nouveau langage peut toujours s'exécuter lentement si son modèle d'exécution est sensiblement différent du langage d'implémentation. Dans ce cas, des bits de l'interpréteur s'afficheront dans le code traduit et il continuera à fonctionner lentement. Cependant, si la nouvelle langue est principalement la même que la langue d'origine, avec seulement quelques ajustements, il devrait être possible d'éliminer la plupart des bits d'interprétation dans le code cible en ajustant soigneusement l'évaluation partielle. Ensuite, la performance ne sera là que pour les nouvelles fonctionnalités.

Il s'agit en effet de la technologie de «virtualisation» des langages de programmation.

Uday Reddy
la source
6

Historiquement, Lisp a été le premier langage de programmation majeur à introduire des installations de métaprogrammation. Le système de macro de Lisp permet au programmeur de définir de nouvelles structures de contrôle, de nouveaux modèles de données, etc. Par exemple, le Common Lisp Object System peut être entièrement défini avec des macros au-dessus d'un langage de base qui ne sait rien des objets ou des classes. Le macro système permet également la définition de langages spécifiques au domaine .

Ruby s'est beaucoup inspiré de Lisp, y compris sa capacité de réflectivité et de métaprogrammation. De nombreux langages typés dynamiquement se sont inspirés de Lisp à cet égard. (La saisie statique complique les choses, car de nombreuses extensions ne rentrent pas dans le système de saisie d'origine.)

Gilles 'SO- arrête d'être méchant'
la source
4

Pas encore mentionné dans les réponses / commentaires:

le sondage:

Résumé: Les langages extensibles sont des langages de programmation qui permettent à un utilisateur de modifier ou d'ajouter de la syntaxe, et d'associer les nouvelles formes syntaxiques à la sémantique. À quoi servent ces langues? Quels types de fonctionnalités sont faciles à ajouter et lesquels ne le sont pas? Sont-ils suffisamment puissants pour être pris au sérieux? Dans cette enquête, nous tenterons de répondre aux questions que nous considérons comme les langages extensibles procéduraux, orientés objet, fonctionnels et à usage général. Nous nous intéressons principalement au pouvoir expressif (régulier, hors contexte), aux mises en garde associées (non hygiéniques, ambiguës) et à la facilité d'utilisation des différents mécanismes.

et

Résumé: La capacité d'étendre un langage avec de nouvelles formes syntaxiques est un outil puissant. Un système de macro suffisamment flexible permet aux programmeurs de construire à partir d'une base commune vers un langage conçu spécifiquement pour leur domaine problématique. Cependant, les macro-installations qui sont intégrées, capables et en même temps assez simples pour être largement utilisées ont été limitées à ce jour à la famille de langues Lisp. Dans cet article, nous introduisons une fonction de macro, appelée Java Syntactic Extender (JSE), avec la puissance et la facilité d'utilisation supérieures des systèmes de macro Lisp, mais pour Java, un langage avec une syntaxe algébrique plus conventionnelle. ...

Vor
la source
1
Veuillez écrire une ou deux phrases résumantes pour chaque référence; les collections de liens purs ne sont presque jamais de «bonnes» réponses.
Raphael