Qu’entendez-vous par l’expressivité d’un langage de programmation?

Je vois beaucoup de mot «expressivité» quand les gens veulent insister sur une langue mieux que l’autre. Mais je ne vois pas exactement ce qu’ils veulent dire par là.

  • Est-ce la verbosité / la concision? Je veux dire, si une langue peut écrire quelque chose de plus court que l’autre, cela signifie-t-il une expressivité? S’il vous plaît se référer à mon autre question – Article sur la densité de code en tant que mesure de la puissance du langage de programmation
  • Est-ce le pouvoir de la langue? Paul Graham dit qu’une langue est plus puissante que l’autre langue dans le sens où une langue peut faire ce que l’autre langue ne peut pas faire (par exemple, LISP peut faire quelque chose avec une macro que l’autre langue ne peut pas faire).
  • Est-ce juste quelque chose qui facilite la vie? L’expression régulière peut être l’un des exemples.
  • Est-ce une façon différente de résoudre le même problème: quelque chose comme SQL pour résoudre le problème de recherche?

Que pensez-vous de l’expressivité d’un langage de programmation? Pouvez-vous montrer l’expressivité en utilisant un code?

Quelle est la relation avec l’expressivité et DSL? Est-ce que les gens proposent DSL pour obtenir l’expressivité?

Personnellement, j’estime que «l’expressivité» d’un langage se résume à la clarté avec laquelle le langage construit peut «exprimer» les intentions du développeur.

Par exemple, je pense que C # (en particulier LINQ via C # 3+) devient beaucoup plus expressif. Cette déclaration LINQ est un excellent exemple:

var results = collection.Where(item => item > 5); 

Sans connaître les détails de la langue ou de l’implémentation utilisée, l’intention du développeur est (à mon avis) très claire dans la déclaration ci-dessus.

Je ne pense pas que la verbosité de la langue soit égale à son expressivité, cependant, il existe une certaine corrélation. Si une langue nécessite beaucoup de code pour exprimer une abstraction, elle est moins expressive. Ce sont deux concepts liés mais différents.

La même chose est vraie avec le pouvoir – bien que les caractéristiques d’une langue (c.-à-d. Le pouvoir) doivent être suffisamment complètes pour exprimer clairement l’abstraction. Sans cela, l’expressivité souffrira. Cela étant dit, un langage peut être très “puissant” en termes de fonctionnalités, mais pas nécessairement expressif, si les fonctionnalités sont difficiles à comprendre.

“Expressivité” signifie la capacité de dire seulement ce que vous voulez faire:

 bad_event = events.find(&:bad) 

plutôt que comme vous le souhaitez:

 i = 0 bad_event = nil while i < events.size && bad_event.nil? event = events[i] if event.bad? bad_event = event end i += 1 end 

Parmi les choses qui consortingbuent à l'expressivité sont:

  • Un manque de sucre syntaxique requirejs
  • Fonctions de première classe
  • Collecte des ordures
  • Saisie dynamic ou inférence de type
  • Le kernel de la langue n'est pas servilement minimaliste
  • Bonne fonctionnalité dans la bibliothèque standard

Dans une certaine mesure, l'expressivité de n'importe quel langage peut être augmentée en déplaçant autant que possible «comment le faire» dans des sous-programmes / objects afin que la majeure partie du code restant soit «quoi faire». La quantité de "comment faire" le code nécessaire dans le code le plus abstrait est une mesure de l'expressivité d'une langue: plus le code ressemble à un pseudo-code, plus il est expressif dans l'intention du programmeur.

On peut également penser à la "méta-expressivité" d'une langue: à quel point le langage est-il expressif lors de la construction de langages spécifiques à un domaine?

J’aime la notion de pouvoir expressif de Matthias Felleisen, qui est comparative :

  • La langue A est ssortingctement plus expressive que la langue B si les deux suivantes sont vraies:

    • Tout programme écrit en langage B peut être réécrit dans la langue A tout en conservant la structure essentielle du programme.
    • Certains programmes écrits en langage A doivent être restructurés avec violence pour être écrits dans le langage B.

Habituellement, nous voulons faire ces comparaisons en examinant une sorte de “kernel essentiel” d’une langue – par exemple, nous voulons peut-être considérer un dialecte de C avec seulement le while et pas aussi le do...while . Ou peut-être voulons-nous considérer un dialecte de Perl avec seulement un préfixe if form et non unless formulaire. Mais parfois, ces distinctions syntaxiques superficielles sont exactement ce que nous entendons par «pouvoir expressif»; pour certains programmeurs, il est important de dire

 die ("found no solutions") unless length(solutions) > 0; 

au lieu de

 if (length(solutions) == 0) { die("found no solutions"); } 

Vous devez donc déterminer si vous posez des questions sur le pouvoir expressif de la syntaxe de surface ou sur une structure plus profonde.

L’autre chose que j’aime de l’idée de Felleisen, c’est qu’elle admet la notion de deux langues qui sont nettement différentes, mais aucune n’est plus expressive que l’autre.

Vous pouvez lire un exposé plus détaillé dans les deux premières pages de son article intitulé Le pouvoir expressif des langages de programmation . Après cela, il y a beaucoup de théories pointues 🙂

Si vous voulez une réponse quelque peu théorique mais plus rigoureuse que la plupart des autres, vous pourriez vouloir chercher Sur le pouvoir expressif des langages de programmation de Matthias Felleisen. Je suis presque certain qu’un peu de recherche sur le net se fera au moins en quelques exemplaires.

Si vous voulez une réponse plus pratique de ce que la plupart des gens veulent vraiment dire quand ils le disent, c’est franchement plutôt différent. D’habitude, du moins dans mon expérience, un langage “expressif” signifie: “J’aime le langage, mais je ne peux citer aucun support objective pour le faire”. Inversement, des choses comme “moins expressif” ou “non expressif” signifient généralement: “Je n’aime pas le langage [aussi], mais je ne peux citer aucun support objective pour le faire”.

“Non expressif” est souvent similaire à un politicien accusant un autre d’être “fasciste” – clairement péjoratif, mais sans aucune définition significative de ce qui est censé être faux.

L’un des gros problèmes provient d’une différence d’opinion fondamentale. Il y a au moins deux idées générales fondamentalement différentes que les gens semblent avoir au sujet de l’expressivité:

  1. la capacité d’exprimer une grande variété d’idées.
  2. la capacité d’exprimer des idées spécifiques clairement (et souvent de manière succincte).

Pour considérer certains exemples extrêmes, le langage d’assemblage serait hautement expressif selon les premiers critères – vous pouvez essentiellement faire tout ce que vous pouvez dans le langage d’assemblage dans un langage de niveau supérieur et vous pouvez faire certaines choses en langage d’assemblage que vous ne pouvez pas dans essentiellement n’importe quelle langue de niveau supérieur.

De toute évidence, le langage d’assemblage ne semble pas si bon dans la seconde mesure – il nécessite généralement une assez grande quantité de code assez opaque pour accomplir beaucoup de choses. Cette mesure aurait tendance à favoriser une langue comme Haskell ou APL, pour ne donner que quelques exemples.

Ces deux notions de «sens expressif» sont souvent diamétralement opposées. Le premier tend à privilégier les langages de niveau “le plus bas”, le second à privilégier le niveau “le plus élevé”. En combinant les deux, il est assez banal de choisir une définition qui “prouve” qu’une langue de votre choix est la plus expressive.

Wikipedia parle un peu du concept. Je pense moi-même que cela signifie qu’une langue peut accomplir plus avec moins (le soi-disant “usage informel” dans l’article de Wikipedia).

Je considère JavaScript comme expressif (bien que cela puisse être dû au fait que Douglas Crockford a forgé cette idée dans ma noggin) car il peut en faire beaucoup avec seulement quelques mots-clés. Par exemple, le mot-clé function est une fonction, ainsi qu’une méthode, une classe et un lambda.

Quelques illustrations de code (en laissant de côté certains détails pour plus de brièveté) en JavaScript. C’est un cours d’événement que j’ai écrit:

 SJJS.util.Event = (function() { var _listeners = []; var _listenerReturns = []; return { addDomListener: function(element, eventName, listener) { }, sortinggger: function(element, eventName) { }, removeListener: function(eventlistener) { } } })(); 

Avec just function , var , et certaines accolades et parenthèses, j’ai créé une classe statique avec des méthodes et des variables privées.

Pour moi, c’est la capacité du langage à exprimer clairement ma logique et mes idées par le code, de manière à ce que quelqu’un d’autre lisant le code que j’ai écrit puisse facilement comprendre ce que je pensais quand je l’ai fait.

Je l’ai toujours considéré comme étant à peu près équivalent à un niveau linguistique élevé. Si vous vouliez essayer de quantifier l’expressivité, les unités seraient quelque chose comme ” instructions de code machine par énoncé de langue

Un langage plus expressif pourrait être très utile pour faire beaucoup de travail sans écrire beaucoup de code. Cependant, il serait probablement plus spécifique à un domaine et un peu plus lent pour certaines tâches que pour une autre moins expressive.

Prenons par exemple LINQ. Il vous permet d’utiliser la functional programming .

La functional programming met l’accent sur l’application des fonctions, contrairement au style de programmation impératif, qui met l’accent sur les changements d’état.

LINQ vous permet d’exprimer ce que vous voulez faire plutôt que de le faire. Ceci est un exemple clair de l’expressivité.

D’une manière générale, avec un langage de programmation qui est complet, vous pouvez faire tout ce qu’un autre langage complet peut faire. Cela étant dit, certains peuvent le faire beaucoup mieux que d’autres.

Je prends l’expressivité pour dire combien vous pouvez dire facilement et à quel point cela peut être dit clairement. La capacité d’être concis en fait partie (un langage très puissant et laconique est un langage comme J ). Généralement, je trouve que le fait d’être concis est un bon marqueur de l’expression. Si la langue peut exprimer une opération complexe de manière simple, elle va dans la bonne direction.

En ce qui concerne le pouvoir, l’expressivité n’est pas tout le pouvoir d’une langue. Bien que cela puisse en faire partie, la rapidité, la sécurité, la stabilité, tout cela compte également.

exemple: la sum d’une liste dans Common lisp utilisant l’opérateur de boucle est concise et expressive

(loop for x in list sum x)

La précision, la concision et la lisibilité sont les principaux composants de l’expressivité.

Extrait de Wikipedia : En informatique, le pouvoir expressif (aussi appelé expressivité ou expressivité) d’une langue est l’ampleur des idées qui peuvent être représentées et communiquées dans cette langue. Plus le langage est expressif, plus la variété et la quantité d’idées qu’il peut représenter peuvent être grandes.

Donc, je suis d’accord. “Comment facile, complet et composable le langage pour que vous puissiez exprimer vos intentions.” : Je crois, c’est la mesure de l’expressivité.


QUESTION: Est-ce la verbosité / la concision? Je veux dire, si une langue peut écrire quelque chose de plus court que l’autre, cela signifie-t-il une expressivité?

Par exemple, le langage Brainfuck est-il expressif? Je ne pense pas. Regardez un exemple Hello World dans Brainfuck:

 ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. 

Ou: langue hq9plus . Bonjour le code du monde:

 H 

QUESTION: Est-ce le pouvoir de la langue? Paul Graham dit qu’une langue est plus puissante que l’autre langue dans le sens où une langue peut faire ce que l’autre langue ne peut pas faire (par exemple, LISP peut faire quelque chose avec une macro que l’autre langue ne peut pas faire).

Je ne suis pas d’accord avec Paul. Comme vous le voyez dans les exemples ci-dessus, le langage hq9plus fait Hello World avec une lettre: H Alors que la plupart des autres langues le feront avec beaucoup plus de lettres. Mais, vous pouvez créer du code composable et facile à lire avec d’autres langues. Si hq9plus fait Hello World avec H , cela signifie-t-il que c’est puissant? Je crois non.


QUESTION: Est-ce juste quelque chose qui facilite la vie? L’expression régulière peut être l’un des exemples.

Les regexes sont géniales, mais parfois elles perdent leur pouvoir d’expression. Parfois, cela dépend du programmeur.


QUESTION: Est-ce une manière différente de résoudre le même problème: quelque chose comme SQL pour résoudre le problème de recherche?

Moitié Oui. SQL est un langage déclaratif et très expressif. Parce que les moteurs et les technologies sous-jacents peuvent avancer et changer sans que vous ne modifiiez vos requêtes SQL. Cela le rend très expressif. De nombreuses requêtes ont fonctionné pendant des décennies et la technologie sous-jacente des bases de données a changé. Mais vos requêtes ne sont pas nécessaires. Je pense que cela est dû à la puissance de son expressivité.

Je pense également que les langages fonctionnels sont très expressifs. Parce que vous ne décrivez que votre intention, et non vos vœux , et que les technologies sous-jacentes peuvent toujours changer et optimiser, mais cela ne nuira pas à votre code expressif .

Exemple:

 // top 10 products with rating higher than 5 return products .sort(p => p.rating) .filter(p => p.rating > 5) .map(p => p.title) .take(10) 

Au-dessus du programme est expressif, il transmet vos intentions. Et, très probablement, cela ne changera pas lorsque les mécanismes sous-jacents changent.