La programmation orientée langage est-elle pratique?

12

J'ai lu cet article sur la programmation orientée langage. Il souligne certaines faiblesses des approches procédurales / POO modernes de la programmation et suggère un nouveau paradigme de programmation qui les résoudra.

Je suis tout pour les petites parties de programme à couplage lâche: il vaut beaucoup mieux apprendre beaucoup de petites choses, que vous utiliserez toutes, que quelques grandes choses, que vous n'utilisez que des morceaux.

En lisant l'article, j'ai eu l'impression que l'auteur faisait la promotion de deux choses:

  • Une multitude de langages de script faciles à créer
  • Un langage unique et facilement extensible qui peut se réécrire pour répondre aux besoins du programmeur

S'il propose le second, je répondrais par "Déjà fait!" et donnez Lisp comme exemple. Comme le suggère Paul Graham, les langues semblent de toute façon évoluer dans ce sens .

En ce qui concerne le premier, je pense que c'est une bonne idée, s'il existe un langage sous-jacent qui les relie tous ensemble. Cela me semble être le point faible: la communication entre les langues. Souhaitez-vous utiliser des appels, qui est un concept procédural ou un passage de message, qui me rappelle la communication interprocessus? Je serais ravi d'avoir l'opportunité de travailler avec des langues spécifiques à un petit domaine, s'il est facile de les utiliser toutes en même temps. Cette approche (LOP) serait-elle pratique?

Michael K
la source
Il a certainement un énorme potentiel époustouflant.
2
Il n'est pas clair pour moi quel problème ce paradigme résout. Soit dit en passant, LISP n'est pas un exemple de langue réussie.
mouviciel
7
@mouviciel cela dépend beaucoup de ce que vous entendez exactement par "réussi". Est-il utilisé par la majorité des programmeurs? Non. Cela existe-t-il depuis longtemps? Oui - 50 ans et plus. La plupart des langues modernes lui ont-elles volé un tas de fonctionnalités utiles? Oui. (Les langues peuvent-elles voler encore plus des langues Lisp? Oui!)
Frank Shearar
2
Il existe une différence entre une langue largement utilisée et une langue utile. Un langage qui explore de nouveaux domaines n'est généralement pas utilisé, mais peut contribuer à tous à long terme. D'un autre côté, Java est inutile, car il n'apporte rien de nouveau à la table (même s'il s'agit définitivement d'un langage réussi pour tous les comptes).
Matthieu M.
1
Je trouverais plus utile de maîtriser Lisp que de maîtriser Cobol.
glenatron

Réponses:

8

Je préconise les DSL depuis longtemps, mais je m'inquiète de ce qui arrive aux bonnes idées lorsqu'elles deviennent des fourgons. Des produits sont construits qui font la publicité de The Good Idea, promettant que tout ce que vous avez à faire est d'en obtenir un , et vous serez dans le groupe, sans avoir à réfléchir très attentivement à ce que cela signifie.

Qu'est-ce qu'une langue? C'est un vocabulaire et une syntaxe dans lesquels les significations peuvent être communiquées, non? Chaque fois que vous déclarez une variable, écrivez une fonction, définissez une classe, vous construisez un nouveau langage, en ajoutant des noms et des verbes à un langage existant. Vous pouvez maintenant y dire des choses que vous ne pouviez pas auparavant.

Je pense que ce qui rend un langage spécifique au domaine, c'est la mesure dans laquelle il exprime naturellement les concepts mentaux qui sont communiqués, et je pense qu'il existe une mesure simple de cela. Fondamentalement, s'il existe une simple exigence autonome indépendante X, qui pourrait être incluse ou non dans le programme, sa mise en œuvre correcte nécessite un ensemble d'insertions, de suppressions et de remplacements de code Y. Un simple avant-après diff peut afficher Y. Le nombre N de ces modifications est une mesure de la spécificité du domaine de la langue. Le plus petit N est, pour les besoins typiques, meilleur.

Cela ne dépend pas nécessairement de la syntaxe sophistiquée, des structures de contrôle, de la transmission des messages ou de ce que vous avez. Cela dépend de la concision avec laquelle il met en œuvre l'exigence. De nombreux outils prétendent le faire, mais les affirmations ne sont pas réelles. Cela doit être réel .

Parfois, une technologie inhabituelle est nécessaire. Voici mon exemple préféré. Quand il l'est, il illustre le fait qu'il peut nécessiter des efforts de la part des programmeurs pour le comprendre. La spécificité du domaine (et la maintenabilité) n'est donc pas du tout la même chose que la lisibilité .

Je suis donc d'accord avec la deuxième approche, qu'une bonne langue est celle qui permet facilement de construire les langues nécessaires par-dessus. (C'est ce que j'ai aimé à propos de Lisp.) Mais ce qui est encore plus important, c'est que les programmeurs doivent savoir comment créer des langues pour correspondre aux domaines dans lesquels ils travaillent et être prêts à gravir les courbes d'apprentissage de ces langues.

Je ne vois pas vraiment cela se produire. Au lieu de cela, ils sont coincés dans les "programmes = algorithmes + structure de données", ou "les noms deviennent des classes et les verbes deviennent des méthodes". Ils ne travaillent pas sur la façon de prendre des domaines de pensée et de les linguiser pour une concision maximale.

Mike Dunlavey
la source
Certainement d'accord avec vous sur la partie du train en marche - "le patron aux cheveux pointus sait dans quelle langue il doit être écrit. [...] Java." Un autre problème est ce que Joel appelle «l'astronaute de l'architecture». Je pourrais aussi voir DSLs empilage sur l'autre annonce infitium (sp?). Je suppose que cela revient au programmeur -> ingénieur logiciel -> informaticien.
Michael K
Et si cela ne nécessite pas d'effort pour comprendre, il y a des chances que cela n'en vaille pas vraiment la peine :)
Michael K
4

C'est tout à fait l'approche Ruby.

  • Gardez le langage de base simple et étendez-le via des gemmes
  • Créez des dialectes de Ruby pour des domaines spécifiques via le patch de singe. ig Ruby on Rails.

Je ne sais pas si c'est mieux, mais je suppose que c'est très pragmatique.

Nerian
la source
7
RoR n'est pas un dialecte de Ruby.
back2dos
4
@ back2dos: Je pensais à la métaprogrammation. Bien sûr, RoR n'est pas un langage de programmation différent. Ce que je veux dire par dialecte, c'est que même si tout ce qui se trouve sous Rails est Ruby, du point de vue du développeur, il utilise Ruby à un niveau d'abstraction plus élevé. Un domaine. Un dialecte. Il utilise des vues, des modèles, des contrôleurs et il les programme en utilisant une syntaxe qui ressemble à une langue différente, un dialecte pour ainsi dire. C'est la beauté d'un langage scripté aussi puissant que Ruby.
Nerian
Je pense qu'il est important de vraiment voir la différence. AspectJ est un dialecte de Java, alors qu'AspectR n'est qu'une bibliothèque Ruby. La différence est vraiment la langue. Ruby a été conçu pour offrir cette flexibilité et cette expressivité, contrairement à Java. Les deux peuvent être considérés comme des langages à usage général, la différence est que Ruby est généralement suffisamment expressif pour éliminer le besoin d'une véritable DSL pour tout usage général, contrairement à Java, même si par exemple vous utilisez couramment des vues, des modèles et des contrôleurs.
back2dos
1

L'approche LOP est extrêmement pratique. Gardez à l'esprit que vous n'avez pas nécessairement à implémenter des "langages de script" - la méthodologie est également applicable aux eDSL, et ils sont généralement compilés efficacement. J'utilise cette approche dans littéralement tout mon travail de développement.

SK-logic
la source
Pardonnez mon ignorance - un eDSL pourrait être un préprocesseur pour la langue des anthères, non?
Michael K
@Michael, oui, il est possible d'implémenter eDSL de cette façon, voir CamlP4 par exemple. Mais le plus souvent, eDSL est construit sur les propres fonctionnalités du langage (par exemple, les macros Lisp, les modèles C ++, etc.).
SK-logic
1

Nous en verrons beaucoup plus sur les langages spécifiques à un domaine à l'avenir, à en juger par les gens qui en parlent maintenant - j'ai remarqué que Martin Fowler en parlait beaucoup aussi et quelques articles intéressants sur Lambda The Ultimate sur Lambda The Ultimate , entre autres.

Cela me donne à penser que c'est certainement une direction dans laquelle le vent souffle en ce qui concerne la conception de langages de programmation et les plateformes de programmation. À certains égards, cela fait déjà un certain temps - l'un des avantages de Ruby (comme quelqu'un l'a déjà observé) est qu'il facilite la création de DSL, mais en fait il y en a beaucoup dans les applications et les bibliothèques de programmation que nous utilisons déjà.

glénatron
la source
Vous pouvez ajouter FoF avec est utilisé pour développer des pilotes pour le multi-noyau Barrelfish. Un langage pour développer des DSL en :)
Matthieu M.
0

J'utilise LOP chaque fois que je programme en solo. J'ai trouvé que dans certains projets, il n'y avait pas d'autre moyen de respecter le calendrier. Dans une allégorie simple, on peut assimiler l'utilisation de la LOP aux outils électriques. Si vous travaillez seul dans l'atelier, vous ne pouvez pas faire les choses manuellement et respecter la date limite. S'il y a d'autres personnes avec vous, la coordination de l'utilisation de ces outils électriques est essentielle pour l'efficacité et la sécurité.
En mode équipe, LOP nécessite une préparation organisationnelle pour éviter une catastrophe de la Tour de Babel.

Kakungulu
la source