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.
la source
@Nullable
et@NonNull
qui sont utilisées par des vérificateurs externes comme findbugs.Réponses:
Converge possède des installations de méta-programmation assez impressionnantes.
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.
Perligata: Romana montre comment une syntaxe entièrement nouvelle peut être appliquée à une langue.
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 .
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.
la source
"Est-ce théoriquement faisable? *
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.
la source
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.)
la source
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. ...
la source