Programmer * dans * un langage vs écrire du code C dans Ruby

10

Code stipule complets que vous devriez code aways dans une langue , par opposition au code dans ce. Par cela, ils veulent dire

Ne limitez pas votre pensée de programmation aux seuls concepts pris en charge automatiquement par votre langage. Les meilleurs programmeurs pensent à ce qu'ils veulent faire, puis ils évaluent comment atteindre leurs objectifs avec les outils de programmation à leur disposition. (chapitre 34.4)

Cela ne conduit-il pas à utiliser un style de programmation dans chaque langue, quelles que soient les forces et les faiblesses particulières de la langue en question?

Ou, pour mettre la question dans un format plus répondable:

Proposeriez-vous que l'on essaie de coder son problème aussi soigneusement que possible avec les particularités de sa langue, ou si vous préférez rechercher la solution la plus élégante dans son ensemble, même si cela signifie que vous devez mettre en œuvre des constructions éventuellement maladroites qui n'existent pas nativement dans sa langue?

bastibe
la source
5
+1 bonne question. À ce stade, je peux écrire en Perl dans une demi-douzaine de langues différentes.
Dan Ray
@Dan Ray - bizarre! J'écris toujours C en Perl.
James Anderson
Voir aussi: Programmation "dans" un langage vs programmation "dans" un langage par Jon Skeet
Arseni Mourzenko

Réponses:

7

Il existe une approche encore meilleure: oubliez votre langage de programmation fixe pathétique. Encodez votre problème dans un langage que vous venez d'inventer, dérivé des termes mêmes du domaine problématique concerné, encodez-le aussi naturellement que possible, et pensez alors à implémenter ce nouveau langage de programmation ou à simplifier votre code jusqu'aux limites de la langue existante.

Cette approche est appelée programmation orientée langage . Il existe de nombreuses techniques de mise en œuvre efficace des langages spécifiques au domaine , et c'est un sujet particulièrement brûlant pour la communauté Ruby.

SK-logic
la source
1
La communauté Haskell comprend également des langages spécifiques au domaine et le langage de programmation Haskell est particulièrement adapté à leur mise en œuvre.
tdammers
La mise en œuvre d'un système de script sur mesure basé sur un langage intégré comme Lua ou Tkl est-elle considérée comme une écriture DSL? Si oui, comment gérez-vous les carences de Lua, par exemple?
bastibe
@Paperflyer, dans certains cas, il est logique d'implémenter des langages au-dessus de quelque chose comme Lua (surtout s'il s'agit de Metalua), mais il est plus facile d'écrire un compilateur approprié pour la plupart des DSL typiques.
SK-logic
@tdammers, oui, Haskell et Scala sont tous des DSL. Mais je viens du côté obscur de la Force: mon approche préférée est la métaprogrammation. Je pense que les interprètes ad hoc sont presque toujours inférieurs aux compilateurs.
SK-logic
2
@tdammers, un DSL implémenté au-dessus de fonctions d'ordre élevé est, pratiquement, un interprète ad hoc. Vous ne pouvez pas étendre la syntaxe Haskell de la même façon que vous étendez, disons, Lisp. Même avec Template Haskell. C'est une manière totalement différente (et, je dirais, limitée) de mettre en œuvre les DSL. C'est correct dans de nombreux cas, mais pour tout ce qui est vraiment complexe, cela conduit à des implémentations totalement illisibles, alors qu'une métaprogrammation en plusieurs étapes est tout simplement triviale, quelle que soit la taille et l'alien de votre DSL.
SK-logic
2

Je crois que la bonne réponse, et celle voulue par le livre est:

on devrait essayer de coder son problème aussi soigneusement que possible avec les particularités de sa langue

En programmant dans un langage, j'ai toujours supposé que c'était d'utiliser des techniques en dehors du style normal du langage où cela conduirait à un avantage . Il s'agit d'une différence clé par rapport à l'écriture dans un style dans toutes les langues.

Par exemple, l'apprentissage de Haskell a considérablement amélioré mes compétences dans l'utilisation de fonctions d'ordre supérieur. Maintenant, lors de la programmation en c #, j'utilise les différentes IEnumerableméthodes telles que Selectplus souvent, car l'utilisation de ces méthodes conduit à un code plus propre que l'écriture de boucles. J'ai également tendance à utiliser les passes et les fonctions (c'est-à-dire Func<int, int>) plus souvent en raison de mon expérience avec haskell. Mon utilisation de l'héritage a chuté à cause de cela, et la plupart du temps le résultat est un code plus simple.

Cependant, je n'utilise pas de concepts comme les monades ou les types de données algébriques en c #. C'est parce que ni l'un ni l'autre ne sont clairement représentables en c #, et conduisent à peu d'avantages en échange d'une grande obscurité.

J'utilise donc les outils de la langue pour utiliser au mieux les compétences que j'ai. Je crois que c'est de la programmation dans la langue.

David Miani
la source
0

Proposeriez-vous que l'on essaie de coder son problème aussi soigneusement que possible avec les particularités de sa langue, ou si vous préférez rechercher la solution la plus élégante dans son ensemble, même si cela signifie que vous devez mettre en œuvre des constructions éventuellement maladroites qui n'existent pas nativement dans sa langue?

Le point est que les bons programmeurs ne sont pas une langue. La citation du livre parle des "outils de programmation à leur disposition" - cela signifie que si vous connaissez Perl et Java, alors vous devriez peut-être utiliser Perl pour cette manipulation de chaîne rapide. Les langages de programmation ne sont pas des boîtes pour nous limiter, mais des outils que nous utilisons pour résoudre des problèmes. C'est (imo) ce que Code Complete veut dire. Ne codez pas dans une boîte de langage / environnement de programmation, mettez la meilleure solution dans le meilleur langage / environnement de programmation pour vous, votre problème et votre solution.

Telastyn
la source