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

je vois beaucoup du mot "expressivité" quand les gens veulent souligner une langue est meilleure que l'autre. Mais je ne vois pas exactement ce qu'ils veulent dire par elle.

  • est-ce le verboseness/succinctness? Je veux dire, si une langue peut écrire quelque chose de plus court que l'autre, est-ce à dire expressivité? S'il vous plaît se référer à mon autre question - Article sur la densité du code comme une mesure de la puissance du langage de programmation
  • est-ce la puissance de la langue? Paul Graham dit qu'une langue est plus puissante que l'autre dans un 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 rend la vie plus facile? L'expression régulière peut en être un exemple.
  • 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 L'ADSL? Faire les gens DSL pour obtenir l'expressivité?

47
demandé sur Community 2010-03-11 21:13:59

11 réponses

personnellement, je pense que l '" expressivité "d'un langage vient vraiment de la façon dont les constructions du langage peuvent" exprimer " clairement les intentions du développeur.

par exemple, je sens que C# (surtout LINQ via C# 3+) devient beaucoup plus expressif. Cet énoncé de LINQ est un excellent exemple:

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

sans connaître les détails du langage ou de la mise en œuvre utilisée, l'intention du développeur est (à mon avis) Très clair dans l'énoncé ci-dessus.

Je ne pense pas que la verbosité de la langue soit égale à son expressivité, cependant, il y a une certaine corrélation en place. Si un langage nécessite beaucoup de code pour exprimer une abstraction, il est moins expressif. Il s'agit de deux concepts connexes, mais différents.

il en va de même pour le pouvoir - bien que les caractéristiques d'un langage (le pouvoir) doivent être suffisamment complètes pour exprimer clairement l'abstraction. Sans cela, l'expressivité en souffrira. Cela dit, un langage peut être très "puissant" en termes de caractéristiques, mais pas nécessairement expressif, si l'ensemble des caractéristiques est difficile à comprendre.

30
répondu Reed Copsey 2010-03-11 18:19:35

"Expressivité" signifie la capacité de dire que ce que vous voulez faire:

bad_event = events.find(&:bad)

plutôt que comment vous voulez qu'il soit fait:

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 contribuent à l'expressivité sont:

  • Un manque de sucre syntaxique
  • fonctions de première classe
  • collecte des ordures
  • soit dynamic typing, soit type inference
  • La langue de base n'étant pas forcément minimaliste
  • bonne fonctionnalité dans la bibliothèque standard

dans une certaine mesure, l'expressivité de n'importe quelle langue peut être augmentée en poussant autant de "comment le faire" dans les sous-programmes/objets que possible de sorte que la plupart du code restant est " ce qu'il faut faire."La quantité de code "comment le faire" nécessaire dans le code le plus abstrait est une mesure de l'expressivité d'une langue: Plus le code ressemble au pseudocode, plus il est expressif de l'intention du programmeur.

on peut aussi penser à la "méta-expressivité" d'une langue: Quelle est l'expressivité de la langue dans la construction de langues spécifiques à un domaine?

26
répondu Wayne Conrad 2015-07-01 17:15:53

j'aime Matthias Felleisen de la notion de puissance expressive, qui est comparatif :

  • la langue A est strictement plus expressive que la langue B si les deux énoncés suivants sont vrais:

    • tout programme écrit dans la langue B peut être réécrit dans la langue a tout en gardant la structure essentielle du programme intact.
    • certains programmes écrits dans la langue A doivent être restructurés violemment afin d'être écrits dans la langue B.

Habituellement, nous voulons faire de ces comparaisons en regardant une sorte de "noyau essentiel" d'une langue-par exemple, peut-être, nous voulons considérer un dialecte de C avec seulement while et pas aussi for et do...while . Ou peut-être que nous voulons considérer un dialecte de Perl avec seulement un préfixe if et non unless . 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"); }

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

L'autre chose que j'aime à propos de Felleisen l'idée est qu'il n'admet la notion de deux langues qui sont certainement différentes, mais ni est plus expressif que les autres.

vous pouvez lire un exposé plus détaillé dans les deux premières pages de son papier sur le pouvoir expressif des langages de programmation . Après cela vient beaucoup de théorie pointue: -)

25
répondu Norman Ramsey 2010-03-11 21:12:51

si vous voulez une réponse quelque peu théorique mais plus rigoureuse que la plupart des autres, vous pourriez vouloir regarder autour de Matthias Felleisen sur le pouvoir expressif des langages de programmation . Je suis presque sûr qu'en regardant autour du filet on trouvera au moins quelques copies.

si vous voulez une réponse plus pratique de ce que la plupart des gens signifie quand ils le disent, c'est, franchement, assez différent. Généralement, à d'après mon expérience, un langage "expressif" signifie: "j'aime le langage, mais je ne peux citer aucun soutien objectif pour le faire."À l'inverse, des choses comme "moins expressives" ou "pas expressives" signifient généralement: "Je n'aime pas la langue [aussi], mais je ne peux pas citer d'appui objectif pour le faire."

"pas 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 supposé être mauvais.

L'un des grands problèmes vient d'une divergence 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 certaines idées spécifiques clairement (et souvent succinctement).

pour considérer quelques exemples extrêmes, montage la langue se qualifierait comme très expressive selon les premiers critères--vous pouvez faire essentiellement n'importe quoi dans le langage d'assemblage que vous pouvez faire dans une langue de niveau supérieur, et vous pouvez faire certaines choses dans le langage d'assemblage que vous ne pouvez pas faire essentiellement dans n'importe quelle langue de niveau supérieur.

de toute évidence, le langage assembleur n'a pas l'air aussi bon à la seconde mesure--il nécessite généralement une quantité assez importante de code assez opaque pour accomplir beaucoup de choses. Cette mesure aurait tendance à favoriser un langage comme Haskell ou APL, pour ne donner que quelques exemples.

ces deux notions de ce que" expressif " signifie sont souvent proches de notions diamétralement opposées. Le premier tend à favoriser les langues de niveau "le plus bas", tandis que le second tend à favoriser le niveau "le plus haut". 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.

7
répondu Jerry Coffin 2017-06-10 03:39:16

Wikipedia a un peu sur le concept. je suis cela signifie qu'une langue peut faire plus avec moins (dite "informelle" dans l'article de Wikipedia).

je considère JavaScript expressif (bien que cela puisse être parce que Douglas Crockford a percé cette idée dans mon noggin) parce qu'il peut faire tellement avec juste quelques mots clés. Par exemple, le function mot-clé est une fonction, ainsi qu'une méthode, une classe, et un lambda.

certaines illustrations de code (laissant de côté quelques détails pour plus de brièveté) en JavaScript. C'est un event class que j'ai écrit:

SJJS.util.Event = (function() {
    var _listeners = [];
    var _listenerReturns = [];

    return {
        addDomListener: function(element, eventName, listener) {
        },
        trigger: function(element, eventName) {
        },
        removeListener: function(eventlistener) {
        }
    }
})();

avec juste function , var , et quelques accolades bouclées et des parenthèses j'ai fait une classe statique avec des méthodes et des variables privées.

3
répondu Bob 2010-03-11 18:24:24

pour moi, c'est la capacité qu'a le langage d'exprimer clairement ma logique et mes idées à travers le code, d'une manière que quelqu'un d'autre lisant le code que j'ai écrit puisse facilement comprendre ce à quoi je pensais quand je l'ai fait.

3
répondu Andres 2010-03-11 18:38:53

j'ai toujours cru que c'était à peu près l'équivalent d'une langue de haut niveau. 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 bon à faire plutôt beaucoup de travail sans écrire beaucoup de code. Cependant, elle serait probablement plus spécifique à un domaine et un peu plus lente pour certaines tâches qu'une tâche moins expressive.

1
répondu T.E.D. 2010-03-11 18:54:23

prendre par exemple LINQ. Il vous permet d'utiliser programmation fonctionnelle .

programmation Fonctionnelle met l'accent sur l'application de fonctions, contrairement à l'impératif de style de programmation, qui met l'accent sur les changements dans l'état.

LINQ vous permet d'exprimer ce que vous voulez faire au lieu de savoir comment le faire. Ceci est un exemple clair d'expressivité os.

1
répondu Leniel Maccaferri 2010-03-11 18:58:24

Généralement parlant, avec un langage de programmation qui est turing complete vous pouvez faire tout ce qu'un autre turing complete peut faire. Cela étant dit, certains peuvent le faire beaucoup mieux que les autres.

je prends expressivité pour signifier combien vous pouvez dire facilement, et comment bien / clairement il peut être dit. La capacité d'être terne fait partie de cela (un langage très puissant et terne est un comme J ). En général, je trouve qu'être concis est bon indicateur d'être expressif. Si la langue peut exprimer une opération complexe de manière simple, il va dans la bonne direction.

quant au pouvoir, l'expressivité n'est pas toute la puissance d'un langage. Bien que cela puisse en faire partie, la vitesse, la sécurité, la stabilité, tous ces facteurs entrent également en ligne de compte.

exemple: la sommation d'une liste dans le lisp commun en utilisant l'opérateur de boucle est concise et expressive

(loop for x in list sum x)

0
répondu zellio 2010-03-11 18:25:43

la précision, la concision et la lisibilité sont les principales composantes de l'expressivité.

0
répondu Paul Nathan 2010-03-11 18:34:09

de Wikipedia : en informatique, le pouvoir expressif (aussi appelé expressivité ou expressivité) d'un langage est l'étendue des idées qui peuvent être représentées et communiquées dans ce langage. Plus une langue est expressive, plus grande est la variété et la quantité d'idées qu'elle peut être utilisée pour représenter.

donc, je suis d'accord. "Comment facile, complet et composable la langue que vous utilisez pour exprimer vos intentions." : je crois, c'est la mesure de l'expressivité.


QUESTION: s'agit-il de la verbosité ou de la concision? Je veux dire, si une langue peut écrire quelque chose de plus court que l'autre, est-ce à dire expressivité?

Pas de. Par exemple, Brainfuck langue expressive? Je ne le pense pas. Regardez un Bonjour Exemple du monde à Brainfuck:

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

Ou: hq9plus de la langue. Bonjour tout le Monde code:

H

QUESTION: Est-ce le pouvoir de la langue? Paul Graham dit qu'une langue est plus puissante que l'autre dans un 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, la langue 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 , est-ce que cela signifie qu'il est puissant? Je ne le pense pas.


QUESTION:: Est-il juste quelque chose qui rend la vie plus facile? L'expression régulière peut en être un exemple.

les Regexes sont grands, mais parfois ils perdent leur pouvoir expressif. Parfois, cela dépend du programmeur.


QUESTION: 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?

Moitié Oui. SQL est une déclaration et langage très expressif. Parce que les moteurs et les technologies sous-jacents peuvent progresser et changer sans que vous changiez vos requêtes SQL. Cela le rend très expressif. Il y a de nombreuses requêtes qui fonctionnent depuis des décennies et la technologie sous-jacente des bases de données change. Mais vos requêtes n'en ont pas besoin. Je pense que cela est dû à la puissance de son expressivité.

je crois aussi que les langues fonctionnelles sont très expressives. Parce que, vous décrivez seulement votre intention, pas votre hows , et 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)

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

0
répondu Inanc Gumus 2016-12-27 10:47:10