Dlaczego języki programowania zaczęły używać = do przypisania?

13

W większości wczesnych książek <-o algorytmach odnosił się do zadania i =do porównania. Ale obecnie jedynymi językami, które nie są używane =do przypisywania, są Pascal ( :=) i języki zabawkowe, takie jak COOL . Co spowodowało, że współczesne języki programowania zmieniły się =w przypisanie znaczeń zamiast matematycznego znaczenia równości?

Siqi Lin
źródło
8
Nie zaczynaj mnie w dniu ===...
Deer Hunter
1
pozostaje powszechny w działaniu algorytmów; jest to jeden z trzech typowych zapisów przypisywania przy pisaniu algorytmu (pozostałe to :=i =). To, że wszyscy programiści używają =, nie oznacza, że ​​wszyscy matematycy się porzucili .
cpast
@DeerHunter ===jest w porządku.
Darth Egregious
1
Miałem wycie dziewczyny ze szkoły średniej: „Jak x może równać się x plus jeden?” we wprowadzeniu, którego uczyłem. Jest to podstawowa dziwność komputerów: zmienne nie istnieją w naturze, są niepodobne do żadnej innej rzeczy we wszechświecie.
1
User251748: Mój portfel to zmienna świata rzeczywistego, zawierająca wiele zestawów monet, banknotów i okazjonalnie kawałków papieru.
gnasher729,

Odpowiedzi:

14

Według Wikipedii użycie znaku równości do przypisania sięga języka Superplana Heinza Rutishausera, zaprojektowanego w latach 1949–1951 i szczególnie spopularyzowanego przez Fortran:

Znanym przykładem złego pomysłu był wybór znaku równości oznaczającego przydział. Wrócił do Fortranu w 1957 roku i został ślepo skopiowany przez armie projektantów języków. Dlaczego to zły pomysł? Ponieważ obala wielowiekową tradycję, pozwalając „=” oznaczać porównanie dla równości, orzeczenie, które jest albo prawdziwe, albo fałszywe. Ale Fortran sprawił, że oznaczało to zadanie, egzekwowanie równości. W takim przypadku operandy są nierówne: lewy operand (zmienna) ma być równy prawemu operandowi (wyrażenie). x = y nie oznacza tego samego, co y = x.

—Niklaus Wirth, dobre pomysły, przez lustro

Konrad Zuse użył również znaku równości dla Plankalkul , który zainspirował Superplan Rutishausera, chociaż nigdy nie opracowano dla niego kompilatora. Dlaczego wybrał znak równości? Chyba musisz go zapytać.

Robert Harvey
źródło
4
Cóż, z pewnością były gorsze pomysły. W końcu teksty matematyczne wykorzystują =zarówno predykat, jak i do definiowania zmiennych, np. W „Niech x = 4. Wtedy √ (x - y) wynosi zero, jeśli y = 4”. Działa to, ponieważ notację matematyczną należy rozumieć raczej deklaratywnie niż imperatywnie. Funkcjonalne języki programowania (np. Rodzina ML) domyślnie mają zmienne niemodyfikowalne, dlatego mogą =bez problemu nadal pełnić podwójną rolę. A dokładniej, =jest zarówno operatorem, jak i częścią letskładni.
amon
2
@amon: Nie zgadzam się co do podwójnego znaczenia matematyki. „Niech 4 = x” jest tak samo ważne jak „Niech x = 4”.
PRZYCHODZĄ Z
4
@COMEFROM „Let 4 = x” jest tak nienaturalny jak instrukcja INTERCAL, z której bierzesz swoją nazwę użytkownika. Kiedy „x” nigdy wcześniej nie było wspomniane, „Niech x = {coś}” lub „Niech x będzie {widget}” wprowadza zmienną oprócz określenia jej wartości, a to ustawia zmienną na pierwszym miejscu zgodnie z konwencją. Dokładnie dlatego, że przynajmniej pod względem intuicji jest to coś innego niż stwierdzenie „wartość jest równa ...”.
3
@ delnan „Niech x = 4” jest po prostu skrótem dla „Niech x ∈ ℤ i x = 4”. Kontekst wprowadza nową zmienną, a =następnie jest tylko predykatem, tak samo jak wszędzie tam, gdzie jest używana. Zauważ, że w zależności od kontekstu „Niech x = 4” mogło również oznaczać „Niech x ∈ ℝ i x = 4”.
Doval,
2
@RobertHarvey Mówimy o piśmie matematycznym, a nie programowaniu w C. PRZYJDŹ: Przyznaję, że nie jest to tak jednoznaczne, jak to powiedziałem wcześniej, ale ponieważ proza ​​matematyczna opiera się na konwencjach i nie ma specyfikacji, która mogłaby być prawnikiem pozwalającym na „niech 4 = x”, nie, powiedziałem nie tylko tak ważny jak „let x = 4”. Przynajmniej myli czytelników, a zatem nie spełnia podstawowego celu prozy .
7

Ale kiedy robiłem matematykę w szkole „niech x = 123”

było popularne frazowanie. Wczesne wersje Basic nalegały na słowo kluczowe „let” przed równością. Więc w zasadzie rozumie się jego czyraki wykonane w celu „wypuszczenia”.

Kluczowy kierowca zwykle nie jest brany pod uwagę, ale bardzo ważny w momencie, w którym wpisałeś.

Były dwa możliwe urządzenia wejściowe,

  • „Teletyp”, za pomocą którego można użyć standardowej maszyny do teletekstu, aby wykrawać małe dziury w papierowej wstążce, którą następnie może odczytać komputer. Nie było tak źle, ponieważ obsługiwało standardowy alfabet pisany wielkimi i małymi literami oraz większość znaków w górnym rzędzie klawiatury.
  • Dziurkacze - kręciło się wiele automatów do dziurkowania kart, ponieważ w dużych korporacjach powszechne było stosowanie sortowników, tabulatorów i drukarek. Obsługiwali one bardzo ograniczony zestaw znaków Tylko wielkie litery i ograniczoną liczbę „znaków specjalnych”.

Teletypy były zwykle używane w sklepach akademickich i wojskowych, dziurkowania kart w bardziej komercyjnych sklepach. Stąd języki akademickie, takie jak Pascal, obsługiwały małe litery i „rozsądne” notacje, takie jak „: =” do przypisania. Języki skierowane do bardziej komercyjnej publiczności zakładały, że perforowane karty będą główną formą wprowadzania danych, dlatego też tylko wielkie litery, takie jak FORTRAN i COBOL, z ograniczoną obsługą znaków „:;> <”, które były niedostępne w standardowym keypunchu.

Nawiasem mówiąc, nie było dwuznaczności, że „=” został użyty do przypisania we wczesnym FORTRAN, ponieważ porównania przeprowadzono za pomocą „.LT.”, „.LE.”, „.EQ.”, „.GE.” i „.GT”. składnia.

James Anderson
źródło
Uważam jednak, że jest let x = 123bardziej analogiczny assert(x == 123)niż jakikolwiek rodzaj zadania.
AKHolland
1
PS Jeśli zaczynasz pedantycznie, to składnia „MOVE” języka COBOL jest najdokładniejszym opisem tego, co faktycznie robi komputer. Chociaż „KOPIOWANIE” byłoby jeszcze dokładniejsze.
James Anderson
@AKHolland dla dużych wartości 123.
Odkąd C ++ wynalazł konstruktory ruchów, COBOL „MOVE” brzmi znacznie dziwniej.
gnasher729,
Zawsze myślałem, że LET powinien pozostać obowiązkowy w języku BASIC, ponieważ odróżniałby przypisanie od testowania równości. Coś w stylu COBOL-a. Problem polega na tym, że zajmie to kolejny token w źródle, kolejny cenny bajt w tych niewielkich komputerach tego czasu. Więc upuścili.
Chuck Adams