Perché i linguaggi di programmazione hanno iniziato a usare = per assegnazione?


13

Nella maggior parte dei primi libri sugli algoritmi, <-riferiti al compito e =al confronto. Ma al giorno d'oggi le uniche lingue che non usano =per il compito sono Pascal ( :=) e linguaggi giocattolo come COOL . Cosa ha fatto sì che i moderni linguaggi di programmazione cambiassero =in assegnazione di significato anziché nel suo significato matematico di uguaglianza?


8
Non farmi iniziare ===...
Deer Hunter

1
rimane comune nel lavoro degli algoritmi; è una delle tre notazioni comuni per l'assegnazione quando si scrive un algoritmo (gli altri sono :=e =). Solo perché tutti i programmatori usano =non significa che tutti i matematici abbiano abbandonato .
Pas

@DeerHunter ===va bene.
Darth Egregious,

1
Ho fatto ululare una ragazza della scuola media: "Come può x uguale x più uno?" in un'introduzione ho insegnato. È la stranezza fondamentale dei computer: le variabili non esistono in natura, sono diverse da qualsiasi altra cosa nell'universo.

1
User251748: Il mio portafoglio è una variabile del mondo reale, contenente un set multiplo di monete, banconote e pezzi di carta occasionali.
gnasher729,

Risposte:


14

Secondo Wikipedia , l'uso di uguali per il compito risale al linguaggio Superplan di Heinz Rutishauser, progettato dal 1949 al 1951, ed è stato particolarmente reso popolare da Fortran:

Un esempio noto per una cattiva idea è stata la scelta del segno uguale per indicare l'incarico. Risale a Fortran nel 1957 ed è stato copiato alla cieca da eserciti di designer linguistici. Perché è una cattiva idea? Perché rovescia una tradizione secolare per lasciare che "=" denoti un confronto per l'uguaglianza, un predicato che è vero o falso. Ma Fortran significava incarico, far rispettare l'uguaglianza. In questo caso, gli operandi sono su una base disuguale: l'operando di sinistra (una variabile) deve essere reso uguale all'operando di destra (un'espressione). x = y non significa la stessa cosa di y = x.

—Niklaus Wirth, buone idee, attraverso lo specchio

Konrad Zuse ha anche usato il segno di uguale per Plankalkul , che ha ispirato il Superplan di Rutishauser, sebbene un compilatore non sia mai stato ideato per questo. Perché ha scelto il segno di uguale? Immagino che dovresti chiederglielo.


4
Bene, c'erano sicuramente idee peggiori. Dopotutto, i testi di matematica usano =sia come predicato sia per definire variabili, ad es. In "Let x = 4. Quindi √ (x - y) è zero se y = 4". Questo funziona perché la notazione matematica dovrebbe essere intesa in modo dichiarativo piuttosto che imperativo. I linguaggi di programmazione funzionale (ad es. La famiglia ML) passano automaticamente alle variabili non modificabili e possono quindi continuare a utilizzare =nel suo duplice ruolo senza problemi. O più precisamente, =è sia un operatore che parte della letsintassi.
amon

2
@amon: non sono d'accordo sul doppio significato in matematica. "Let 4 = x" è valido quanto "Let x = 4".
VIENI DAL

4
@COMEFROM "Let 4 = x" è quasi innaturale quanto l'istruzione INTERCAL da cui prendi il tuo nome utente. Quando "x" non è mai stato menzionato prima, "Let x = {qualcosa}" o "Let x essere un {widget}" introduce una variabile oltre a specificarne il valore e questo pone la variabile prima per convenzione. Questo è esattamente perché, almeno in termini di intuizione, questa è una cosa diversa dalla semplice affermazione "il valore è uguale a ...".

3
@delnan "Let x = 4" è solo una scorciatoia per "Let x ∈ ℤ and x = 4". Il contesto introduce la nuova variabile ed =è quindi solo un predicato, come in qualsiasi altro luogo venga utilizzato. Si noti che a seconda del contesto, "Let x = 4" potrebbe anche significare "Let x ∈ ℝ and x = 4".
Doval

2
@RobertHarvey Stiamo parlando di scrittura matematica, non di programmazione C. VIENI DA: Ammetto che non è così chiaro come l'ho messo prima, ma dal momento che la prosa matematica è basata su convenzioni e non ci sono specifiche che un avvocato può consentire "lascia 4 = x", no, ha detto che non valido solo come "let x = 4". Per lo meno, confonde i lettori e quindi non riesce allo scopo principale della prosa .

7

Ma quando ho fatto matematica a scuola "let x = 123"

era un fraseggio comune. Le prime versioni di Basic insistevano sulla parola chiave "let" prima dell'uguale. Quindi si capisce sostanzialmente che bolle per "lasciare".

Un driver chiave di solito non considerato ma molto importante al momento su cosa hai effettivamente digitato.

C'erano due dispositivi di input fattibili,

  • Il "teletipo" in base al quale è possibile utilizzare una macchina per teletipo standard per praticare piccoli buchi in un nastro di carta che possono essere letti dal computer. Questo non era poi così male in quanto supportava l'alfabeto standard in maiuscolo e minuscolo più la maggior parte dei caratteri nella riga superiore della tastiera.
  • Schede perforate - c'erano molte macchine per schede perforate in giro poiché l'uso di smistatori, tabulatori e stampanti era comune nelle grandi aziende. Questi supportavano un set di caratteri molto limitato Solo lettere maiuscole e un numero limitato di caratteri "speciali".

I teletipi tendevano ad essere utilizzati nei negozi accademici e militari, i pugni alle carte in negozi più commerciali. Quindi linguaggi accademici come Pascal supportavano identificatori minuscoli e notazioni "sensibili" come ": =" per il compito. Le lingue rivolte a un pubblico più commerciale presumevano che le schede perforate sarebbero state la principale forma di input, quindi le maiuscole solo lingue come FORTRAN e COBOL con un supporto limitato per i caratteri ":;> <" che non erano disponibili in un keypunch standard.

Per inciso, non vi era alcuna ambiguità sul fatto che "=" venisse utilizzato per il compito all'inizio di FORTRAN poiché il confronto veniva effettuato utilizzando ".LT.", ".LE.", ".EQ.", ".GE." e ".GT." sintassi.


Trovo let x = 123più analogo a assert(x == 123)qualsiasi tipo di incarico, però.
AKHolland,

1
PS Se stai diventando pedante, la sintassi COBOL "MOVE" è la descrizione più accurata di ciò che il computer sta effettivamente facendo. Sebbene "COPIA" sarebbe ancora più accurato.
James Anderson,

@AKHolland per valori elevati di 123.

Da quando il C ++ ha inventato i costruttori di mosse, i COBOL "MOVE" sembrano molto più strani.
gnasher729,

Ho sempre pensato che la LET fosse rimasta obbligatoria in BASIC, poiché avrebbe distinto il compito dai test di uguaglianza. Sorta di stenografia COBOL. Il problema è che occuperebbe un altro token nella sorgente, un altro byte prezioso nei minuscoli PC dell'epoca. Quindi l'hanno lasciato cadere.
Chuck Adams,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.