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
Réponses:
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.
la source
Point
séquences en utilisant un tableau de tableaux 2D. Mais, A a l'avantage de me permettre d'exprimer unPoint
concept plus lisible par l'homme. Est-ce que A est plus expressif?map
,filter
, types de première classe / méthodes / fonctions, peut - être un peueval
, et encore moins métaclasse magie ou types dynamiquement créés , etc.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.
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:
Cela signifie que la somme des valeurs de 3 et 4 est calculée et que la valeur est associée à une étiquette
x
dans 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:
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.
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.write
tandis 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.
la source
fishies
de typeFish
.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é.)
la source
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.
la source
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.
la source
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_homework
etbring_down_trash
. Ceci est facilement écrit en code:Cette solution semble assez simple, mais en réalité
do_homework
et nebring_down_trash
sont pas ordonnées, on pourrait aussi écrire: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:
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 ++.
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.
la source