Un langage de programmation utilise-t-il des variables car elles sont en mathématiques?

11

En mathématiques, une variable signifie que vous pouvez y mettre n'importe quel nombre, et une équation sera toujours vraie:

root(square(x)) = abs(x)

Dans les langages de programmation, ce n'est pas le cas: une var peut changer. En Python:

y = (x**2)**.5
x *= 2
assert y == abs(x)

lèvera une exception, car x dans la dernière ligne n'est pas le même.

Existe-t-il des langages de programmation qui utilisent des variables immuables?


la source
5
En mathématiques, la plupart des équations ne sont pas des identités. Par exemple, x ^ 2 + 5 = 6x est valide si et seulement si x = 1 ou x = 5. Équations valides pour toutes les valeurs dans un "univers" (comme l'ensemble de tous les nombres réels), par exemple sin ( 2x) = 2 sin x cos x, sont appelés identités .
Andreas Rejbrand
4
variables en mathématiques! = variables dans les langages de programmation. J'ai toujours pensé qu'ils devraient également avoir des noms différents, car beaucoup de gens sont confus lorsqu'ils apportent des idées préconçues sur les variables en mathématiques à la programmation.
Lie Ryan
1
Je pense que l'objectif des variables en mathématiques n'est pas le même qu'en programmation. En mathématiques, les variables représentent une valeur inconnue que vous voulez connaître ou une place dans une formule que vous mettez une valeur pour prendre un résultat. Pour les langages de programmation courants, seul le deuxième cas a du sens. Pour le premier cas, vous aurez besoin d’un logiciel comme Mathematica.
Pagotti
Non, ils ne le font pas. Essayez de mettre n'importe quel nombre sur "x = 5".

Réponses:

6

Pour répondre à votre question de titre "Est-ce qu'un langage de programmation utilise des variables comme en mathématiques?": C, C #, Java, C ++ et tout autre langage de style C utilisent des variables dans la façon dont ils sont utilisés en mathématiques.

Vous avez juste besoin d'utiliser == au lieu de =.

Si je prends ton original

root(square(x)) = abs(x)

Ensuite, je peux traduire cela en C # directement sans aucun changement autre que pour la syntaxe. Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)

Cela sera évalué à vrai pour toute valeur de x tant que x au carré est inférieur au maximum pour le type de données que vous utilisez. (Java sera très similaire, mais je pense que l'espace de noms Math est un peu différent)

Ce bit suivant ne parviendra pas à se compiler en C # car le compilateur est suffisamment intelligent pour savoir que je ne peux pas affecter le retour d'une opération à une autre opération.

Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)

L'immuabilité n'a rien à voir avec cela. Vous devez toujours affecter la valeur dans une langue immuable et il est tout à fait possible qu'une langue donnée puisse choisir de le faire en utilisant = comme opérateur.

Preuve supplémentaire du point, cette boucle s'exécutera jusqu'à ce que vous épuisiez les valeurs légales de x et obteniez une exception de dépassement de capacité:

 while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
        {
            ++x;
            System.Console.WriteLine(x);
        }

C'est pourquoi les mathématiciens détestent l'utilisation de = pour l'affectation. Cela les confond. Je pense que cela vous a amené à vous confondre. Prenez votre exemple

y = (x**2)**.5
x *= 2
assert y == abs(x)

Lorsque je transforme cela en algèbre, j'obtiens ceci:

abs (2x) = racine (x ^ 2)

Ce qui bien sûr n'est pas vrai pour les valeurs autres que 0. L'immutabilité ne vous évite que l'erreur de modifier la valeur de x lorsque vous ajoutez des étapes supplémentaires entre l'évaluation du côté gauche et du côté droit de l'équation d'origine. Cela ne change pas réellement la façon dont vous évaluez l'expression.

MIA
la source
24

Les langages de programmation purement fonctionnels, tels que Haskell , appliquent des variables immuables. J'aime bien les appeler des identifiants, au lieu de variables.

Ionuț G. Stan
la source
3
Dans Erlang, qui est un langage fonctionnel impur, les variables sont immuables aussi.
sepp2k
Je ne connais pas trop Erlang. Ce sont les atomes, non? Erlang autorise-t-il une sorte de stockage variable de type mutable?
Ionuț G. Stan
3
@Ionut: Non, les atomes d'Erlang sont ce qu'on appelle des symboles dans le lisp et le rubis. Concernant votre deuxième question: il contient le dictionnaire de processus, qui est une carte de hachage mutable globale (enfin, par processus). Cependant, cela est très rarement utilisé dans mon expérience. À part cela, la seule façon de briser la transparence référentielle est la transmission de messages.
sepp2k
4
Hm, je devrais apprendre moi-même quelques Erlang :)
Ionuț G. Stan
comment cela répond-il à la question posée?
moucher
5

Le =signe utilisé dans les langages de programmation est trompeur. <-, ce qui signifie "stocker", ou même COBOL MOVEdoit être utilisé à la place.

En outre, Prolog utilise des variables comme les mathématiques: les variables ne peuvent pas changer et le moteur Prolog remplira les variables pour voir si les solutions existent.

De plus, Curry est un mélange de Haskell et de Prolog.

Ming-Tang
la source
3

C, C ++ et Objective-C peuvent spécifier l'immuabilité pour les arguments de fonction (et de méthode), ainsi que pour d'autres variables (identificateurs), avec le qualificatif de type "const".

Huperniketes
la source
3

Vous pouvez également simuler l'immuabilité en Python en n'autorisant pas les mises à jour des classes. Comme indiqué précédemment, la plupart des langages de programmation fonctionnels purs imposent l'immuabilité. Clojure est un ajout récent à la plate-forme JVM (Clojure est un dialecte LISP)

Dans Scala (également un langage JVM ), un unificateur des variables de support OO et FP déclarées avec valest immuable. L'expressivité de Scala et la prise en charge hybride OO / FP le rendent similaire à Mathematica . ( Akka est un framework qui ajoute des fonctionnalités Erlang OTP et Clojure telles que STM .. à Scala et Java.) LACASA ajoute un système de type et un modèle de programmation pour appliquer la discipline de capacité d'objet dans Scala et pour fournir des références d'objet uniques. ( code ) ( contexte théorique )

En Java, une variable déclarée finalest immuable et les bibliothèques Java telles que Google Guava incluent des bibliothèques immuables de collections. Les Java Stringsont également toujours immuables.

oluies
la source