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

34

Le pouvoir expressif est défini par Wikipedia comme suit:

.. la largeur des idées qui peuvent être représentées et communiquées dans cette langue.

Les "idées" font-elles référence 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 d'expression est-il évalué et mesuré?

Par exemple, si nous prenions un langage tel que JavaScript et imposions une restriction étrange sur les noms de variable, tel que variable doit être un nombre à 8 chiffres précédé d'un trait de soulignement, la correspondance/^_[0-9]{8}$/ perdrait-elle notre pouvoir expressif?

Ou serait-ce seulement absurde et ennuyeux?


Clarifier:

Le pouvoir d’expression est-il mesuré par les idées générales inhérentes à la langue:

  • entiers et chaînes
  • boucles
  • conditionnels

Ou le nombre d' idées spécifiques et uniques que le langage peut représenter:

  • les entiers 1, 2 ... 2 ^ 32
  • chaînes contenant "que dit le renard?" et "wha pah pah pah pah pah"
  • pour chaque grenouille dans ma collection de grenouilles
  • si la grenouille est verte ou quelque chose alors faites quelque chose
svidgen
la source
3
Il convient de noter que limiter un programme à 100 millions de variables au maximum dans un périmètre donné impose une certaine limite à l'expressivité. Cela pourrait rendre impossible la mise en œuvre de Firefox, par exemple. ;-)
R ..
1
Notez que, bien que vous ayez étiqueté ces "langages de programmation", les langages de programmation ne sont pas le seul type de langages informatiques dont le pouvoir expressif pourrait être discuté. En effet, la page à laquelle vous créez un lien a pour premier exemple Web Ontology Language.
Jon Hanna

Réponses:

39

Le document phare sur l'expressivité est Sur le pouvoir expressif des langages de programmation de Matthias Felleisen (1991) . Il contient une définition mathématiquement rigoureuse de l'expressivité du langage.

Intuitivement, si chaque programme pouvant être écrit en langue A peut également être écrit en langue B avec des transformations locales uniquement, mais que certains programmes écrits en langue B ne peuvent pas être écrits en langue A sans modifier leur structure globale purement transformations 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 existe des paires de langues dans lesquelles il existe des programmes en X qui ne peuvent pas être exprimés en Y et des programmes en Y qui ne peuvent pas être exprimés en X , et donc les langues sont distinctes, mais ni l’un ni l’autre. le langage est plus expressif que l'autre. Cela cadre bien avec notre expérience réelle de l'existence de certaines langues qui sont bonnes dans certaines choses et d'autres qui sont bonnes dans d'autres choses, et aucune n'est généralement "meilleure" que l'autre.

Jörg W Mittag
la source
Donc, (n’ayant pas encore regardé le document), l’expression concerne ce que vous pouvez exprimer à la machine par opposition aux lecteurs de la source? C'est une mesure de ce que vous pouvez demander au matériel de faire? Vous ne pouvez pas mesurer le nombre d'idées "humaines" que vous pouvez conserver ou communiquer en code? ... Je dois peut-être poser une autre question. mais, si tel est le cas, en quoi diffère-t-il de la "fonctionnalité" dont nous parlons aussi?
svidgen
Peut-être que mon exemple au PO est mauvais. Considérez les langues A et B, les deux avec des tableaux; mais, le langage A a aussi des structures. Dans les deux langues, je peux représenter une série de Pointséquences en utilisant un tableau de tableaux 2D. Mais, A a l'avantage de me permettre d'exprimer un Pointconcept plus lisible par l'homme. Est-ce que A est plus expressif?
svidgen
@svidgen Etant donné que tous les langages Turing-complete sont équivalents, l'ensemble des programmes possibles pouvant être écrits est en principe identique pour tous. Selon la définition ci-dessus, le langage B est plus expressif que A si un programme écrit en B doit être réorganisé pour tenir dans A. (Non seulement modifier la syntaxe ligne par ligne, mais en introduisant de nouvelles classes, boucles, etc. Pensez à réécrire un Python. programme en Java 7 qui utilise lambdas, map, filter, types de première classe / méthodes / fonctions, peut - être un peu eval, et encore moins métaclasse magie ou types dynamiquement créés , etc.
marczellm
@marczellm oui, les "idées" auxquelles se réfère l'expressivité sont-elles le langage construit elles-mêmes? Par exemple, un conditionnel est une idée? Une boucle est une idée? Un string? Nombre? Etc.?
svidgen
1
@ Jörg Pouvez-vous donner un exemple dans votre réponse? C'est une définition mignonne, mais elle ne fait pas beaucoup pour répondre à la question.
svidgen
10

Le pouvoir expressif est défini par Wikipedia comme suit:

Relisons cette page. Une des premières choses à noter est qu’il est question de "langage" et non de "langage de programmation". La plupart de ses exemples ne sont pas des langages de programmation. langues.

On peut appliquer le concept aux langages de programmation, mais aussi aux langages de correspondance de modèles, aux langages de balisage, aux langages de requête, aux langages de feuilles de style visuelles, aux expressions régulières (et à tous les langages réguliers auxquels ils se rapportent), etc. On peut même parler du pouvoir expressif de langages naturels comme l’anglais, qui se fait souvent de manière très informelle, mais avec plus de sérieux lorsqu’on examine les problèmes liés au traitement du langage naturel.

Les "idées" font-elles référence 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, (je vais utiliser javascript tout au long de mes exemples, car votre question indique que c'est l'une des langues que vous connaissez), considérons l'instruction javascript:

var x = 3 + 4;

Cela signifie que la somme des valeurs de 3 et 4 est calculée et que la valeur est associée à une étiquette xdans une portée d'espace de nom donnée.

Si nous détruisions tous les ordinateurs du monde et écrivions ce code sur une feuille de papier, il resterait que javascript a toujours la même signification; nous ne pourrions pas utiliser ce code sur quoi que ce soit, mais la définition abstraite du langage est toujours un sujet sur lequel nous pourrions parler.

Cela peut sembler pédant, mais il est en fait assez important que les langues soient des choses sur lesquelles on puisse raisonner de manière abstraite sans prendre en compte les ordinateurs réels. D'une part, les gens qui raisonnent sur des points théoriques du langage informatique qui n'étaient pas encore réalisables dans la pratique sont l'un des éléments qui nous ont amenés à ce que nous sommes aujourd'hui; les ordinateurs ont besoin de l'informatique, mais l'informatique n'a pas besoin des 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 personnes les utilisent dans la pratique plutôt que quelques spécialistes en discutent en théorie. La page à laquelle vous avez accédé dit:

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

  • indépendamment de 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, tels que la théorie des langues formelle, la logique mathématique et l’algèbre des processus.

Dans les discussions informelles, le terme fait souvent référence au second sens, ou aux deux. C'est souvent le cas lors des discussions sur les langages de programmation. Des efforts ont été faits pour formaliser ces utilisations informelles du terme

Parmi ces deux utilisations du terme, l'impact concret de la première concerne uniquement ce qui peut être transmis à l'ordinateur.

La seconde concerne davantage la compréhension humaine en lecture et en écriture, bien que son degré de différenciation diffère beaucoup selon les utilisations, car elles sont informelles et, en tant que telles, ne sont pas définies de manière rigoureuse.

Par exemple, si nous prenions un langage tel que JavaScript et imposions une restriction étrange sur les noms de variable, tel que variable doit être un nombre à 8 chiffres précédé d'un trait de soulignement, la correspondance /^_[0-9]{8}$/perdrait-elle notre pouvoir expressif?

Selon la définition formelle, nous n’avons perdu aucun pouvoir d’expression: nous sommes limités à 100 000 000 de variables, mais si nous en avions vraiment besoin, nous pourrions résoudre ce problème en créant des objets destinés à contenir davantage de variables dans l’espace de nom nouvellement créé. En tant que tel, tout programme écrit aujourd'hui en javascript pourrait être réécrit sous cette nouvelle forme, de sorte qu'il est tout aussi expressif.

Selon la définition informelle, nous en avons perdu une partie, mais tout dépend de la manière dont nous sommes informels, ce qui variera, car encore une fois, vous ne pouvez pas dire quelle est la "règle" en matière d'utilisation informelle. Nous pourrions dire que nous avons perdu une quantité infime, car les programmes contenant plus de 100 000 000 variables dans le même espace de noms doivent être réécrits au-delà d'une simple substitution. Une utilisation encore plus informelle ferait de nouveau référence à l’impact mental de noms aussi variables que gaiement sur l’ensemble humain.

Il faut également noter que les gens vont considérer de manière informelle des choses qui ne font pas du tout partie de la langue. Considérez les changements en 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.

Selon une définition plus informelle, il est devenu beaucoup plus expressif dans certaines opérations telles que 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 auparavant en javascript, bien qu'ils puissent souvent faire quelque chose en quelques lignes et en un temps d'exécution inférieur à une seconde qui prendrait des kilo-octets de code pour écrire en javascript1.0 et une longue durée.

Par une définition beaucoup plus informelle encore, le changement de la première utilisation de javascript dans les navigateurs (capable de changer les valeurs des entrées de formulaire, document.writetandis que la page est d'abord analysée et déplacée vers un nouvel emplacement ou de revenir en arrière dans l'historique, mais jolie. Rien d’autre aujourd’hui (pouvoir changer à peu près tout sur la page, y compris sur la base de données provenant d’appels au serveur) est absolument immense, même si la plupart ne concerne pas le javascript, mais les modèles d’objets et les API créées disponible, plutôt que la langue (par exemple, vbscript dans IE a bénéficié de ces modifications de manière égale).

À mon avis, cette dernière utilisation est assez informelle pour ne pas être vraiment correcte, mais c'est le problème des définitions informelles.

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

Jon Hanna
la source
2
"les ordinateurs ont besoin d'informatique, mais l'informatique n'a pas besoin d'ordinateurs" J'aime ça
chbaker0
En ce qui concerne la restriction de dénomination des variables, la possibilité de faire référence à des idées externes (noms de langage natif pour des objets) n'est-elle pas liée à la capacité du langage de représenter des idées? ... Peut-être plus à la racine de la question: les idées dont nous parlons sont-elles simplement l'expression du langage général construit? Par exemple, addition, soustraction, négation, tableaux, classes, etc.? Contrairement aux idées particulières que nous pouvons exprimer avec le langage? Par exemple, tableau appelé fishiesde typeFish .
svidgen
Vous pouvez voir ma modification pour plus de précisions. ... On dirait que vous dites que c'est les deux (en référence à mon édition); mais que la première liste est "formelle" et la seconde liste est "informelle". Si tel est le cas, existe-t-il une norme régissant son utilisation sans réserve dans une conversation? Ou ... avez-vous tendance à demander des éclaircissements?
svidgen
4

Je ne pense pas que les règles de dénomination des variables définissent vraiment ce que l'on entend par "expressivité". Je pense que "l'expressivité" se réfère à des choses plus fondamentales. Considérons C # avec Linq versus 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 #. Ceci est beaucoup plus élégant que les alternatives précédentes, par exemple insérer SQL dans des littéraux de chaîne puis le transmettre au serveur ou itérer sur une collection en utilisant "pour".

Un autre bon exemple pourrait être celui des langues avec héritage basé sur un prototype. Dans ces langages, il est possible d'ajouter simplement de nouvelles méthodes à une instance ou même à une classe (quelle que soit son appellation, une "classe" peut aller dans une langue donnée ...) au moment de l'exécution. Vous ne pouvez pas vraiment faire cela en C ++ ou en C #. Ils n'ont pas 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 que celles-ci ajoutent de l'expressivité.)

utilisateur1172763
la source
0

Comme mentionné dans l'article de Wikipedia, le pouvoir d'expression désigne l'ensemble des programmes pouvant être exprimés dans la langue. Tout ce que vous considérez comme un "langage de programmation" (JavaScript, LISP, C #, Perl, etc.) est essentiellement 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 de 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 qu'il serait impossible d'exprimer autrement en SQL.

Gabe
la source
0

Il existe un moyen plus simple et plus simple de comprendre le pouvoir d’expression, 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'accorderaient pour dire 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 (j'entends par intéressantes de telles langues que nous pouvons interpréter de manière utile) ont aussi un ensemble de règles qui déterminent quels mots sont dans la langue et lesquels ne le sont pas. Notez que l'expressivité ne peut exister que lorsqu'il y a interprétation.

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

Ne soyez pas trompé par l'utilisation de "mot" si. Un programme Java est un mot du langage 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 traiter ce concept relativement simple. C'est pourquoi je préférerais 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 étant le langage de toutes les formules impliquant la multiplication d’entiers.

Dans les deux cas, nous interdisons l'utilisation de l'élément d'identité. Ainsi, le langage 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 les interprétations habituelles à "*" et "+" (addition 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 en nombres entiers, il est vrai que la multiplication peut être convertie en addition répétée, mais il n’ya pas moyen de représenter l’addition en tant que multiplication en général.


En résumé, on peut dire que le langage A est plus expressif que le langage B lorsque leurs fonctions d'interprétation partagent un même domaine, mais que 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.

wvxvw
la source
-1

TLDR: Si une fonctionnalité est manquante mais peut être exprimée autrement, ce n'est pas un manque d'expression. Si vous pouvez imaginer un algorithme dans votre esprit ou même le mettre en œuvre dans un langage mais qu'un autre langage est structuré de manière à rendre impossible la mise en œuvre de l'algorithme, il s'agit d'un problème d'expressivité *.

Les restrictions de dénomination des variables ne réduisent pas l'expressivité (à moins qu'il y ait si peu de noms qu'on ne puisse plus exprimer tous les algorithmes et qu'il ne soit pas possible de simuler des variables avec quelque chose comme des tableaux + index).

Voici un exemple simple de manque de pouvoir expressif: vous devez do_homeworket bring_down_trash. Ceci est facilement écrit en code:

do_homework();
bring_down_trash();

Cette solution semble assez simple, mais en réalité do_homeworket ne bring_down_trashsont pas ordonnées, on pourrait aussi écrire:

bring_down_trash();
do_homework();

Ce qui est également imprécis, car cela ne signifie pas que nous n’avions pas l’intention de faire exécuter un ordre. Nous ne voulons pas non plus utiliser de threads. Nous voulons dire quelque chose comme ça:

compiler_or_interpreter_pick_one(
    {
        do_homework();
        bring_down_trash();
    },
    {
        bring_down_trash();
        do_homework();
    }
);

Autant que je sache, il est très difficile voire impossible de l'exprimer dans n'importe quel langage de programmation.

Un exemple qui m'énerve beaucoup, c'est qu'il est impossible en Java d'avoir un tableau d'objets. Vous pouvez créer un tableau de pointeurs sur des objets, mais la disposition de la mémoire n'est pas la même (efficacité de la parole).

Prenant un exemple d' une autre réponse : C ++ ne prend pas en charge l'ajout de méthodes à une classe ou à une instance . Ceci est vrai, cependant, cela ne limite pas l'expressivité de C ++.

struct Extensible{
    std::vector<std::function<void(Extensible *)>> instanceExtensions;
    static std::vector<std::function<void(Extensible *)>> classExtensions;
};

Il s'agit d'une classe à laquelle vous pouvez ajouter, supprimer et appeler un nombre arbitraire de fonctions membres pour les instances et la classe. Techniquement, le langage C ++ est probablement plus expressif à cet égard que les langages de programmation qui prennent en charge cette fonctionnalité, car vous pouvez choisir le mode de stockage des fonctions (vector vs array vs forward_list).

* Certaines langues ont un manque d'expressivité. Typiquement, ils rendent impossible l'écriture de boucles infinies. Cela peut permettre de résoudre le problème d’arrêt et de permettre la vérification automatique de son exactitude.

nwp
la source
2
Je suis à peu près certain que ce n'est pas correct - du moins, ce n'est pas ce que je comprends. L'écriture binaire brute sur le disque est expressive selon cette définition, qui est absurde.
Telastyn
1
@Telastyn Pourquoi cela serait-il absurde? Bien sûr, écrire du binaire brut sur le disque n’est pas expressif, mais un langage capable de le faire est plus expressif que celui qui ne le peut pas, toutes choses étant égales par ailleurs.
nwp
Je veux dire que le "langage" de votre part qui utilise une interface matérielle pour écrire des bits bruts sur l'ordinateur est un exemple du langage le plus expressif, puisqu'il peut par définition faire tout ce que l'ordinateur peut faire. Il peut exprimer n'importe quelle caractéristique manquante d'une autre manière. Je trouve absurde que votre définition, qui est un langage expressif.
Telastyn
@Telastyn Pourquoi serait-ce le langage le plus expressif? Il ne peut pas exprimer la lecture de données, ni calculer quoi que ce soit, ni afficher des graphiques ou des discussions. Un langage qui ne peut écrire que des bits dans la mémoire et le disque a si peu d’expression que je doute qu’il ait une utilité.
nwp
1
"En général, il est impossible d'écrire des boucles infinies. Cela peut permettre de résoudre le problème d'arrêt" - si vous ne pouvez pas avoir de boucle infinie, par définition, votre programme doit être interrompu.
Patrick Collins