web-dev-qa-db-fra.com

À quoi se réfère spécifiquement le pouvoir expressif?

Expressive Power est défini par Wikipedia comme:

.. l'étendue des idées qui peuvent être représentées et communiquées dans cette langue.

Les "idées" se réfèrent-elles aux choses (opérations, structures, algorithmes, etc.?) Que nous pouvons communiquer à la machine? Ou fait-il référence aux concepts "humains" qui peuvent être capturés et communiqués avec le langage à d'autres humains?

Comment le pouvoir expressif est-il évalué et mesuré?

Par exemple, si nous prenions un langage comme JavaScript et imposions une restriction étrange aux noms de variables, comme la variable doit être un nombre à 8 chiffres précédé d'un trait de soulignement, correspondant à /^_[0-9]{8}$/, perdrions-nous le pouvoir expressif?

Ou serait-ce seulement serait absurde et ennuyeux?


Pour clarifier:

La puissance expressive est-elle mesurée par les idées générales inhérentes au langage:

  • entiers et chaînes
  • boucles
  • conditionnels

Ou le nombre de spécifiques, idées uniques que le langage peut représenter:

  • les entiers 1, 2 ... 2 ^ 32
  • des chaînes contenant "que dit le renard?" et "wha pah pah pah pah pah pow"
  • pour chaque grenouille dans ma collection de grenouilles
  • si grenouille est vert ou quelque chose alors faites quelque chose
34
svidgen

Le document de référence sur l'expressivité est Sur la puissance expressive des langages de programmation par Matthias Felleisen (1991) . Il contient une définition mathématiquement rigoureuse de l'expressivité du langage.

Intuitivement, si chaque programme qui peut être écrit en langue [~ # ~] a [~ # ~] peut également être écrit en langue [~ # ~] b [~ # ~] avec uniquement des transformations locales, mais il existe des programmes écrits en langage [~ # ~] b [~ # ~] qui ne peut pas être écrit en langue [~ # ~] a [~ # ~] sans changer leur structure globale (c'est-à-dire pas seulement avec des transformations purement locales), alors la langue [~ # ~] b [~ # ~] est plus expressif que la langue [~ # ~] a [~ # ~] .

Une belle propriété de cette définition est qu'elle admet la possibilité qu'il y ait des paires de langues où il y a des programmes en [~ # ~] x [~ # ~] qui ne peut pas être exprimé en [~ # ~] y [~ # ~] et des programmes en [~ # ~] y [~ # ~] qui ne peut pas être exprimé en [~ # ~] x [~ # ~] , et donc les langues sont distinctes, mais aucune des deux langues n'est plus expressive que l'autre. Cela correspond bien à notre expérience du monde réel selon laquelle il existe des langues qui sont bonnes pour certaines choses et d'autres qui sont bonnes pour d'autres choses, et ni l'une ni l'autre n'est généralement "meilleure" que l'autre.

39
Jörg W Mittag

Expressive Power est défini par Wikipedia comme:

Laissons cette page relire. L'une des premières choses à noter est qu'il dit "langage", pas "langage de programmation", et la plupart de ses exemples ne sont pas des langages de programmation, par ex. le premier exemple donné est une comparaison de OWL2 EL et OWL2 RL, qui sont tous deux des langages d'ontologie.

On peut appliquer le concept aux langages de programmation, mais aussi aux langages de correspondance de motifs, aux langages de balisage, aux langages de requête, aux langages de feuilles de style visuels, aux expressions régulières (et à tous les langages réguliers auxquels ils se réfèrent) et ainsi de suite. On peut même se référer au pouvoir expressif des langues naturelles comme l'anglais, ce qui est souvent fait de manière très informelle, mais avec plus de sérieux lorsque l'on considère les problèmes liés au traitement du langage naturel.

Les "idées" se réfèrent-elles aux choses (opérations, structures, algorithmes, etc.?) Que nous pouvons communiquer à la machine? Ou fait-il référence aux concepts "humains" qui peuvent être capturés et communiqués avec le langage à d'autres humains?

Il fait référence à ce qui peut être exprimé dans cette langue, considérée uniquement comme une chose en soi.

Par exemple, (j'utiliserai javascript tout au long de mes exemples, car votre question indique que c'est l'une des langues que vous connaissez) considérez l'instruction javascript:

var x = 3 + 4;

Cela signifie que la somme des valeurs de 3 et 4 est calculée et la valeur associée à une étiquette x dans une étendue d'espace de noms donnée.

Si nous détruisions tous les ordinateurs du monde et écrivions ce code sur une feuille de papier, il resterait qu'en javascript il avait toujours cette même signification; nous ne pourrions pas exécuter un tel code sur quoi que ce soit, mais la définition abstraite du langage est encore quelque chose dont nous pourrions parler.

Cela peut sembler pédant, mais il est en fait assez important que les langues soient des choses qui peuvent être raisonnées dans l'abstrait sans tenir compte des vrais ordinateurs. D'une part, le raisonnement des gens sur des points théoriques des langages informatiques qui n'étaient pas encore réalisables dans la pratique est l'une des choses qui nous a amenés là où nous en sommes aujourd'hui; les ordinateurs ont besoin d'informatique, mais l'informatique n'a pas besoin d'ordinateurs, juste l'idée d'un calcul.

Bien sûr, nous utilisons des ordinateurs dans le monde réel, et de nos jours, beaucoup de gens les utilisent dans la pratique plutôt que quelques spécialistes en discutant en théorie. La page à laquelle vous avez lié dit:

Le terme puissance expressive peut être utilisé avec une gamme de sens. Cela peut signifier une mesure des idées exprimables dans cette langue:

  • quelle que soit la facilité (expressivité théorique)

  • de manière concise et facile (expressivité pratique)

Le premier sens domine dans les domaines des mathématiques et de la logique qui traitent de la description formelle des langues et de leur signification, comme la théorie formelle du langage, la logique mathématique et l'algèbre des processus.

Dans les discussions informelles, le terme fait souvent référence au deuxième sens, ou aux deux. C'est souvent le cas lorsque l'on discute des langages de programmation. Des efforts ont été faits pour officialiser ces utilisations informelles du terme

De ces deux utilisations du terme, l'impact pratique du premier ne concerne que ce qui peut être transmis à l'ordinateur.

Le second se rapporte davantage à la compréhension humaine à la fois en lecture et en écriture, bien que le degré auquel il le fait, diffère beaucoup entre les utilisations, car ils sont informels et en tant que tels ne sont pas rigoureusement définis.

Par exemple, si nous avons pris un langage comme JavaScript et imposé une restriction étrange sur les noms de variables, comme variable doit être un nombre à 8 chiffres précédé d'un trait de soulignement, correspondant à /^_[0-9]{8}$/, perdrions-nous le pouvoir expressif?

Selon la définition formelle, nous n'avons perdu aucun pouvoir expressif: nous sommes limités à 100 000 000 de variables, mais si nous en avions vraiment besoin, nous pourrions contourner cela en créant des objets pour contenir plus de variables dans l'espace de noms nouvellement créé. En tant que tel, tout programme écrit en javascript aujourd'hui pourrait être réécrit sous cette nouvelle forme, ils sont donc tout aussi expressifs.

Selon la définition informelle, nous en avons perdu, mais tout dépend de la façon dont nous sommes informels, ce qui variera car, encore une fois, vous ne pouvez pas dire quelle est "la règle" à propos d'une utilisation informelle. Nous pourrions dire que nous avons perdu une petite quantité, car les programmes avec plus de 100 000 000 de variables dans le même espace de noms doivent être réécrits au-delà d'une simple substitution. Une utilisation encore plus informelle ferait référence à l'impact mental de ces noms de variables disgracieuses sur l'homme complet.

Il vaut également la peine de noter que les gens vont de manière informelle considérer les choses qui ne font pas du tout partie du langage. Considérez les changements dans Javascript depuis sa création jusqu'à aujourd'hui.

Selon la définition la plus formelle, l'expressivité n'a pratiquement pas changé; c'était Turing complet pour commencer, après tout.

Par une définition plus informelle, il est devenu beaucoup plus expressif dans certaines choses comme la manipulation de tableaux, la gestion des exceptions et (peut-être surtout) dans l'inclusion d'expressions régulières. Ceux-ci ne font rien qui ne pouvait pas être fait en javascript auparavant, bien qu'ils puissent souvent faire quelque chose en quelques lignes et un temps d'exécution d'une seconde qui nécessiterait des kilo-octets de code pour écrire en javascript1.0 et beaucoup de temps pour s'exécuter.

Par une définition beaucoup plus informelle, le changement par rapport à la première utilisation de javascript dans les navigateurs (capable de modifier les valeurs des entrées de formulaire, document.write pendant que la page est analysée pour la première fois et se déplacer vers un nouvel emplacement ou revenir en arrière ou en avant dans l'historique, mais à peu près rien d'autre) à celle d'aujourd'hui (capable de modifier à peu près n'importe quoi sur la page, y compris sur la base des données des appels du serveur) est absolument immense, bien que la plupart ne concerne pas le javascript mais les modèles d'objet et les API mis à disposition, plutôt que la langue (par exemple, vbscript in IE a bénéficié de ces changements) également).

À mon avis, cette dernière utilisation est si informelle qu'elle n'est pas vraiment correcte, mais c'est le problème des définitions informelles.

Par la définition officielle, il n'est vraiment pas devenu plus expressif du tout.

10
Jon Hanna

Je ne pense pas que les règles de nommage des variables capturent vraiment ce que l'on entend par "expressivité". Je pense que "l'expressivité" se réfère à des choses plus fondamentales. Considérez C # avec Linq contre C # avant Linq, par exemple. Après l'ajout de Linq, il est devenu possible d'écrire des requêtes de type SQL directement dans le C #. C'est beaucoup plus élégant que les alternatives précédentes, par ex. mettre SQL dans des littéraux de chaîne, puis le transmettre au serveur, ou itérer sur une collection en utilisant "for".

Un autre bon exemple pourrait être les langues avec héritage basé sur des prototypes. Dans ces langages, il est possible d'ajouter simplement de nouvelles méthodes à une instance ou même à une classe (par n'importe quel nom une "classe" peut aller dans un langage donné ...) au moment de l'exécution. Vous ne pouvez pas vraiment faire cela en C++ ou C #. Ils manquent de ce degré d'expressivité par rapport aux langages basés sur des prototypes. (C # a le concept de méthodes d'extension, et on pourrait certainement dire qu'elles ajoutent de l'expressivité.)

4
user1172763

Comme référencé par l'article de Wikipedia, le pouvoir expressif se réfère à l'ensemble des programmes qui peuvent être exprimés dans la langue. Tout ce que vous voyez comme un "langage de programmation" (JavaScript, LISP, C #, Perl, etc.) est essentiellement Turing complet, ce qui signifie qu'il peut exprimer tout ce qui est dit "calculable".

Cependant, il devrait être assez clair que les expressions régulières ne sont pas aussi expressives que le langage de programmation normal. De plus, les caractères génériques Shell sont un peu moins expressifs que les expressions régulières.

Une version de SQL avec des expressions de table communes est plus expressive qu'une version sans car les CTE vous permettent de représenter des requêtes récursives qui seraient autrement impossibles à exprimer en SQL.

0
Gabe

Il existe un moyen plus simple et plus direct de comprendre le pouvoir expressif, mais nous devons d'abord établir ce que nous entendons par langues. Il existe deux disciplines qui étudient les langues: la linguistique et les automates. Les deux s'entendraient sur le fait que la langue est un ensemble de mots (séquences finies) construits à partir d'un alphabet fini utilisant la concaténation. Typiquement, les langues intéressantes (par intéressant j'entends de telles langues que nous pouvons interpréter de manière utile) ont également un ensemble de règles qui régissent quels mots sont dans la langue et lesquels ne le sont pas. Notez que l'expressivité ne peut exister qu'en cas d'interprétation.

Par interprétation, j'entends l'existence d'une fonction qui, étant donné un mot dans une langue, sélectionne un objet dans un ensemble d'objets (c'est évidemment discutable pour les langues naturelles).

Ne vous laissez pas induire en erreur par l'utilisation de "Word". Un programme Java est un mot dans la langue Java (bien qu'il puisse s'étendre sur plusieurs fichiers contenant plusieurs chaînes de caractères séparées par des espaces)).

Il serait contre-productif d'utiliser des langages aussi compliqués que les langages de programmation modernes pour gérer ce concept relativement simple, c'est pourquoi je préfère utiliser des formules mathématiques à la place.

  • Définissons le langage A comme étant toutes les formules impliquant l'addition d'entiers.

  • Définissons le langage B comme le langage de toutes les formules impliquant une multiplication entière.

Dans les deux cas, nous interdisons l'utilisation de l'élément d'identité. Ainsi, la langue A contient les mots "1 + 1", "1 + 2", "1 + 3", "2 + 3" et ainsi de suite. La langue B contient les mots "2 * 2", "2 * 3", "2 * 4", "3 * 4" et ainsi de suite. Nous attribuons également des interprétations habituelles à "*" et "+" (addition d'entiers et multiplication d'entiers) aux symboles respectifs. Ainsi, l'interprétation de "1 + 1" est 2, et l'interprétation de "2 * 2" est 4.

Observez maintenant que le langage A est strictement plus expressif que le langage B, car dans les entiers, il est vrai que la multiplication peut être exprimée en addition répétée, mais il n'y a pas moyen de représenter l'addition comme multiplication en général.


Pour résumer: le langage A peut être considéré comme plus expressif que le langage B lorsque leurs fonctions d'interprétation partagent le même domaine, mais l'image de la fonction d'interprétation de B est un sous-ensemble approprié de l'image de la fonction d'interprétation de A.

0
wvxvw