Pourquoi les langages de programmation ont-ils commencé à utiliser = pour l'affectation?

13

Dans la plupart des premiers livres d'algorithmes, il est fait <-référence à l'affectation et =à la comparaison. Mais de nos jours, les seuls langages qui n'utilisent pas =pour l'affectation sont Pascal ( :=) et les langages jouets comme COOL . Qu'est-ce qui a fait que les langages de programmation modernes se sont transformés =en affectation de sens au lieu de leur signification mathématique d'égalité?

Siqi Lin
la source
8
Ne me lancez pas ===...
Deer Hunter
1
reste courant dans le travail des algorithmes; c'est l'une des trois notations courantes pour l'affectation lors de l'écriture d'un algorithme (les autres étant :=et =). Ce =n'est pas parce que les programmeurs utilisent tous que les mathématiciens ont tous abandonné .
cpast
@DeerHunter ===va bien.
Dark Egregious
1
J'ai fait hurler une collégienne: "Comment x peut-il égal x plus un?" dans une intro que j'ai enseignée. C'est la bizarrerie fondamentale des ordinateurs: les variables n'existent pas dans la nature, elles ne ressemblent à aucune autre chose dans l'univers.
1
User251748: Mon portefeuille est une variable du monde réel, contenant un ensemble multiple de pièces de monnaie, des billets de banque et des morceaux de papier occasionnels.
gnasher729

Réponses:

14

Selon Wikipédia , l'utilisation d'égaux pour l'affectation remonte au superplan linguistique de Heinz Rutishauser, conçu de 1949 à 1951, et a été particulièrement popularisé par Fortran:

Un exemple notoire d'une mauvaise idée était le choix du signe égal pour désigner l'affectation. Il remonte à Fortran en 1957 et a été copié à l'aveugle par des armées de concepteurs linguistiques. Pourquoi est-ce une mauvaise idée? Parce qu'il renverse une tradition centenaire de laisser «=» dénoter une comparaison pour l'égalité, un prédicat qui est vrai ou faux. Mais Fortran a signifié la cession, le renforcement de l'égalité. Dans ce cas, les opérandes sont sur un pied d'égalité: l'opérande gauche (une variable) doit être rendu égal à l'opérande droit (une expression). x = y ne signifie pas la même chose que y = x.

—Niklaus Wirth, bonnes idées, à travers le miroir

Konrad Zuse a également utilisé le signe égal pour Plankalkul , qui a inspiré le Superplan de Rutishauser, bien qu'un compilateur n'ait jamais été conçu pour cela. Pourquoi a-t-il choisi le signe égal? Je suppose que tu devrais lui demander.

Robert Harvey
la source
4
Eh bien, il y avait certainement des idées pires. Après tout, les textes mathématiques utilisent à la =fois comme prédicat et pour définir des variables, par exemple dans «Soit x = 4. Alors √ (x - y) est nul si y = 4». Cela fonctionne parce que la notation mathématique doit être comprise de manière déclarative plutôt qu'impérative. Les langages de programmation fonctionnels (par exemple la famille ML) utilisent par défaut des variables non mutables et peuvent donc continuer à utiliser =dans leur double rôle sans aucun problème. Ou plus précisément, =est à la fois un opérateur et une partie de la letsyntaxe.
amon
2
@amon: Je ne suis pas d'accord sur la double signification en mathématiques. "Let 4 = x" est tout aussi valide que "Let x = 4".
VENIR DU
4
@COMEFROM "Let 4 = x" est à peu près aussi peu naturel que l'instruction INTERCAL dont vous tirez votre nom d'utilisateur. Lorsque "x" n'a jamais été mentionné auparavant, "Soit x = {quelque chose}" ou "Soit x un {widget}" introduit une variable en plus de spécifier sa valeur, ce qui place la variable en premier par convention. C'est précisément parce que, au moins en termes d'intuition, c'est différent de simplement dire "la valeur est égale à ...".
3
@delnan "Let x = 4" est juste un raccourci pour "Let x ∈ ℤ and x = 4". Le contexte introduit la nouvelle variable et =n'est alors qu'un prédicat, comme c'est le cas partout où il est utilisé. Notez que selon le contexte, "Let x = 4" pourrait également signifier "Let x ∈ ℝ and x = 4".
Doval
2
@RobertHarvey Nous parlons d'écriture mathématique, pas de programmation en C. VENIR DE: Je concède que ce n'est pas aussi clair que je l'ai dit auparavant, mais comme la prose mathématique est basée sur des conventions et qu'il n'y a pas de spécification qui puisse être avocat pour permettre "let 4 = x", non, ladite déclaration est non seulement aussi valable que "let x = 4". À tout le moins, cela déroute les lecteurs et, par conséquent, échoue à l'objectif principal de la prose .
7

Mais quand je faisais des maths à l'école "laissez x = 123"

était une formulation courante. Les premières versions de Basic insistaient sur le mot clé "let" avant l'égal. Donc, son résumé se résume à "laisser" est compris.

Un pilote clé n'est généralement pas considéré, mais très important au moment de la saisie.

Il y avait deux dispositifs d'entrée possibles,

  • Le "télétype" par lequel vous pourriez utiliser une machine à télétype standard pour percer de petits trous dans un ruban de papier qui pourraient ensuite être lus par l'ordinateur. Ce n'était pas si mal car il supportait l'alphabet standard en majuscules et minuscules ainsi que la plupart des caractères sur la ligne supérieure de votre clavier.
  • Cartes perforées - il y avait beaucoup de machines à cartes perforées qui traînaient, car l'utilisation de trieurs, de tabulateurs et d'imprimantes était courante dans les grandes sociétés. Ceux-ci prenaient en charge un jeu de caractères très limité Alphabet majuscule uniquement et un nombre limité de caractères "spéciaux".

Les télétypes étaient généralement utilisés dans les magasins universitaires et militaires, les cartes perforées dans les magasins plus commerciaux. Par conséquent, les langues académiques comme Pascal supportaient les identifiants minuscules et les notations "sensibles" comme ": =" pour l'affectation. Les langues destinées à un public plus commercial supposaient que les cartes perforées seraient la principale forme d'entrée, d'où les seules langues majuscules comme FORTRAN et COBOL avec une prise en charge limitée des caractères ":;> <" qui n'étaient pas disponibles sur un clavier standard.

Soit dit en passant, il n'y avait aucune ambiguïté quant à l'utilisation de "=" pour l'affectation au début du FORTRAN, car la comparaison était effectuée à l'aide des ".LT.", ".LE.", ".EQ.", ".GE." et ".GT". syntaxe.

James Anderson
la source
Je trouve cependant let x = 123plus analogue à assert(x == 123)n'importe quel type de mission.
AKHolland
1
PS Si vous devenez pédant, la syntaxe COBOL "MOVE" est la description la plus précise de ce que l'ordinateur fait réellement. Bien que "COPIER" serait encore plus précis.
James Anderson
@AKHolland pour les grandes valeurs de 123.
Depuis que C ++ a inventé les constructeurs de mouvements, les COBOLs «MOVE» semblent beaucoup plus étranges.
gnasher729
J'ai toujours pensé que LET aurait dû rester obligatoire en BASIC, car cela ferait en sorte que l'affectation se démarque des tests d'égalité. Sorte de raccourci COBOL-ish. Le problème est que cela prendrait un autre jeton dans la source, un autre octet précieux dans les minuscules PC de l'époque. Alors ils l'ont laissé tomber.
Chuck Adams