Niedawno zacząłem uczyć znajomego programowania (używamy Pythona), a kiedy zaczęliśmy omawiać tworzenie zmiennych i operatora przypisania, zapytała, dlaczego wartość po prawej stronie jest przypisana do nazwy po lewej stronie, a nie odwrotnie .
Nie myślałem o tym zbyt wiele, ponieważ wydawało mi się to naturalne, ale powiedziała, że od lewej do prawej wydaje się jej bardziej naturalna, ponieważ tak większość z nas czyta naturalne języki.
Pomyślałem o tym i doszedłem do wniosku, że znacznie ułatwia odczytanie kodu, ponieważ nazwy, które są przypisane (do których programista będzie musiał ponownie użyć), są dobrze widoczne, wyrównane po lewej stronie.
aligned = 2
on = 'foo' + 'bar' + 'foobar'
the = 5.0 / 2
left = 2 + 5
W przeciwieństwie do:
2 = aligned
'foo' + 'bar' + 'foobar' = on
5.0 / 2 = the
2 + 5 = right
# What were the names again...?
Teraz zastanawiam się, czy istnieją również inne powody tego standardu. Czy kryje się za tym historia? A może jest jakiś techniczny powód, dla którego jest to dobra opcja (niewiele wiem o kompilatorach)? I czy są jakieś języki programowania, które przypisują po prawej stronie?
źródło
value -> variable
).Odpowiedzi:
Ditto @paxdiablo. Języki wczesnego programowania zostały napisane przez matematyków - właściwie wszystkie były. W matematyce, według jej własnej zasady - czytania od lewej do prawej - ma sens sposób, w jaki działa.
x = 2–4.
W matematyce powiedziałbyś: Niech x będzie równe 2y -4.
Robisz to nawet w algebrze. Kiedy rozwiązujesz równanie dla zmiennej, izolujesz zmienną, dla której rozwiązujesz, po lewej stronie. tj. y = mx + b;
Ponadto, gdy cała rodzina języków - na przykład rodzina C - ma określoną składnię, zmiana jest bardziej kosztowna.
źródło
let a be...
jak nie ma czasu, obie strony zadania są równe, więc zadanie jest w rzeczywistości równością, nic dziwnego, dlaczego oba używają tego samego znaku:=
x = 1
w rozdziale pierwszym, ale stwierdzamx = 2
w rozdziale drugim, nie jest to żadna straszna sprzeczność - każde stwierdzenie ma zastosowanie tylko w określonym kontekście. Różnica w programowaniu imperatywnym polega częściowo na usunięciu bariery (nie potrzebujemy zmiany kontekstu), a częściowo na implementacji i użyteczności.BASIC
, jeden z najwcześniejszych języków komputerowych miał „właściwą” formę:co odpowiada matematycznemu sposobowi określania zmiennej, na przykład „Niech H będzie wysokością obiektu”.
COBOL
był również podobny ze swoimCOMPUTE
oświadczeniem. Podobnie jak w przypadku wielu sposobów działania, może to być po prostu arbitralna decyzja podjęta w wielu językach.źródło
I declare that X must equal THIS
zamiast bardziej liniowegoEvaluate THIS and store it in X
MULTIPLY HEIGHT BY WIDTH GIVING AREA
, więc zmienna, która otrzymuje wynik, znajduje się po prawej stronie instrukcji.W rzeczywistości istnieje język programowania, który przypisuje się do prawej strony: TI-BASIC ! Nie tylko to, ale również nie używa „=” jako operatora przypisania, ale raczej używa strzałki znanej jako operator „STO”.
przykłady:
W powyższym przykładzie deklarowane są trzy zmienne i podane wartości. A byłoby 5, B byłoby 8, a C byłoby -3. Pierwszą deklarację / przypisanie można odczytać „zapisz 5 jako A”.
Jeśli chodzi o to, dlaczego TI-BASIC używa takiego systemu do przypisywania, przypisuję go byciu, ponieważ jest to język programowania kalkulatora. Operator „STO” w kalkulatorach TI był najczęściej używany w normalnych operacjach kalkulatora po obliczeniu liczby. Gdyby to był numer, który użytkownik chciał zapamiętać, nacisnąłby przycisk „STO”, a kaclulator poprosiłby go o nazwę (automatycznie włącza blokadę alfa, aby naciśnięcia klawiszy tworzyły litery zamiast cyfr):
a użytkownik może nazwać zmienną, co wybierze. Konieczność włączenia blokady alfa, wpisz nazwę, a następnie naciśnij „STO”, a naciśnięcie klawisza „Ans” byłoby zbyt skomplikowane dla normalnych operacji. Ponieważ wszystkie funkcje kalkulatora są dostępne w TI-BASIC, nie dodano żadnych innych operatorów przypisania, ponieważ „STO” wykonał to samo zadanie, choć wstecz w porównaniu do większości innych języków.
(Anegdota: TI-BASIC był jednym z pierwszych języków, których się nauczyłem, więc kiedy pierwszy raz uczyłem się języka Java na studiach, czułem się tak, jakby przypisanie do LEFT było niezwykłe i „zacofane”!)
źródło
Heurystyka 1: W obliczu więcej niż jednego możliwego sposobu zrobienia czegoś podczas projektowania języka, wybierz najczęstszy, najbardziej intuicyjny, inaczej skończysz z Perl +.
Teraz, jak jest to bardziej naturalne (przynajmniej językiem angielskim)? Zobaczmy, jak piszemy / mówimy po angielsku:
Steven ma teraz 10 lat (w przeciwieństwie do 10 lat, kiedy Steven ma teraz). Ważę ponad 190 funtów (w przeciwieństwie do ponad 190 funtów ważę).
W kodzie:
Brzmi również bardziej naturalnie:
„Jeśli Mary ma 18 lat, może mieć cukierki”. „Jeśli mam mniej niż 21 lat, poproszę mojego brata o tequilę”.
niż:
„Jeśli 18 lat Maria ma ...” „Jeśli 21 lat jest więcej niż mój wiek ...”
Teraz kod:
Pamiętaj, że nie jest to naturalne ani dla programistów, ani dla osób mówiących po angielsku. Zdania brzmią jak yoda-speak, a kod jest nazywany warunkami yoda. Mogą to być pomocne w C ++, ale jestem pewien, że większość ludzi się zgodzi: jeśli kompilator mógłby wykonać ciężkie podnoszenie i zmniejszyć potrzebę warunków yoda, życie byłoby nieco łatwiejsze.
Oczywiście można się przyzwyczaić do wszystkiego. Na przykład liczba 81 jest zapisana jako:
Osiemdziesiąt jeden (angielski) Osiemdziesiąt jeden (hiszpański) Jeden i osiemdziesiąt (niemiecki).
Wreszcie są 4! = 24 poprawne sposoby powiedzenia „zielone jabłko leży na stole” w języku rosyjskim - kolejność (prawie) nie ma znaczenia, z wyjątkiem tego, że „on” musi łączyć się z „table”. Tak więc, jeśli jesteś rodzimym językiem rosyjskim (na przykład), możesz nie mieć znaczenia, czy ktoś pisze
a = 10
lub10 = a
ponieważ oba wydają się równie naturalne.Podczas gdy językoznawstwo jest fascynującym przedmiotem, nigdy formalnie go nie studiowałem i nie znam tak wielu języków. Mam nadzieję, że podałem jednak wystarczającą liczbę kontrprzykładów.
źródło
(four times twenty) one
Zaczęło się od FORTRAN w latach 50. Gdzie FORTRAN był skrótem FORmula TRANslacja - omawiane wzory to proste równania algebraiczne, które zgodnie z konwencją zawsze przypisują lewą.
Z drugiej strony jego prawie współczesny język COBOL miał być podobny do angielskiego i przypisany do prawej (głównie!).
źródło
Cóż, jak zauważył @ diceguyd30, istnieją obie notacje.
<Identifier> = <Value>
oznacza „niech identyfikator będzie wartością ”. Lub rozwinąć to: Zdefiniuj (lub ponownie zdefiniuj) zmienną Identyfikator na wartość .<Value> -> <Identifier>
oznacza „zapisz wartość do identyfikatora ”. Lub rozwinąć to: Wprowadź wartość do lokalizacji wyznaczonej przez identyfikator .Oczywiście, ogólnie mówiąc, identyfikator może w rzeczywistości mieć dowolną wartość L.
Pierwsze podejście uwzględnia abstrakcyjną koncepcję zmiennych, drugie podejście dotyczy bardziej faktycznego przechowywania.
Zauważ, że pierwsze podejście jest również powszechne w językach, które nie mają przypisań. Zauważ też, że definicja i przypisanie zmiennej są względnie zbliżone
<Type> <Identifier> = <Value>
do siebie<Identifier> = <Value>
.źródło
Jak już wspomniano, całkiem dobrze działały wszystkie wczesne języki komputerowe. Np. FORTRAN, który pojawił się wiele lat przed BASIC.
W rzeczywistości sensowne jest umieszczenie przypisanej zmiennej po lewej stronie wyrażenia przypisania. W niektórych językach możesz mieć kilka różnych przeciążonych procedur z SAMĄ NAZWĄ, zwracając różne typy wyników. Pozwalając kompilatorowi najpierw zobaczyć typ przypisanej zmiennej, wie, którą przeciążoną procedurę wywołać lub jakie niejawne rzutowanie wygenerować podczas konwersji (np.) Liczby całkowitej na zmiennoprzecinkową. To trochę uproszczone wyjaśnienie, ale mam nadzieję, że masz pomysł.
źródło
Może to być pozostałość po wczesnych algorytmach parsowania. Pamiętaj, że parsowanie LR zostało wynalezione dopiero w 1965 roku i może być tak, że parsery LL miały problemy (w ograniczeniach czasowych i przestrzennych maszyn w tym czasie) idące w drugą stronę. Rozważać:
Oba są wyraźnie jednoznaczne od drugiego tokena. Z drugiej strony,
Nie śmieszne. Gorzej, gdy zaczniesz zagnieżdżać wyrażenia przypisania.
Oczywiście łatwiejsze do jednoznacznego określenia dla maszyn oznacza również łatwiejsze do jednoznacznego określenia dla ludzi. Innym łatwym przykładem byłoby poszukiwanie inicjalizacji dowolnego identyfikatora.
Łatwo, wystarczy spojrzeć w lewą stronę. Z drugiej strony prawa strona
Zwłaszcza, gdy nie możesz
grep
dziurkować kart, znacznie trudniej jest znaleźć odpowiedni identyfikator.źródło
Języki asemblera mają miejsce docelowe jako część kodu operacji po lewej stronie. Języki wyższego poziomu były zgodne z konwencjami języków poprzedników.
Kiedy zobaczysz
=
(lub:=
w przypadku dialektu pascalskiego), możesz je wymówić jakois assigned the value
, wtedy natura od lewej do prawej będzie miała sens (ponieważ czytamy również od lewej do prawej w większości języków). Ponieważ języki programowania zostały opracowane głównie przez ludzi, którzy czytają od lewej do prawej, konwencje utknęły w miejscu.Jest to rodzaj zależności ścieżki . Podejrzewam, że jeśli programy komputerowe zostały wymyślone przez ludzi, którzy mówili po hebrajsku lub arabsku (lub w innym języku pisanym od prawej do lewej), podejrzewam, że wybraliśmy miejsce docelowe po prawej stronie.
źródło
mov.b #255, d0
na przykład, gdzied0
jest rejestr, do którego chcesz przypisać. Starsze asemblery mają tylko jeden argument na instrukcję. W 6502LDA #255
(Load Accumulator) można argumentować, żeA
jest on po lewej stronie, ale jest także po lewej stronie wSTA wherever
(Store Accumulator).Na co warto, większość wypowiedzi w języku COBOL czytane od lewej do prawej, a więc dwa argumenty zostały nazwane pierwszy i ostatni przeznaczenia, takich jak:
multiply salary by rate giving tax
.Nie będę jednak sugerować, że twój uczeń może preferować COBOL, z obawy, że (całkiem słusznie) zostanę oznaczony za wypowiedzenie tak niskiego, nieokrzesanego, bez smaku komentarza! :-)
źródło
Myślę, że to pomyłka. Z jednej strony możesz powiedzieć „przypisz 10 do x” lub „przenieś 10 do x”. Z drugiej strony możesz powiedzieć „ustaw x na 10” lub „x zamieni się w 10”.
Innymi słowy, w zależności od wyboru czasownika, zmienna przypisana do może być lub nie być przedmiotem i może, ale nie musi być po lewej stronie. Tak więc „to, co naturalne”, zależy wyłącznie od twojego zwyczajowego wyboru sformułowań reprezentujących zadanie.
źródło
W pseudokodzie operator przypisania jest bardzo często zapisywany po prawej stronie. Na przykład
W kalkulatorach Casio, nawet w wariantach nieprogramowalnych, zmienna przypisania jest również wyświetlana po prawej stronie
W Forth zmienna również znajduje się po prawej stronie
W wersji x86 składnia Intela ma miejsce docelowe po lewej stronie, ale składnia GAS odwraca kolejność, wprowadzając zamieszanie dla wielu osób, szczególnie w przypadku instrukcji dotyczących kolejności parametrów, takich jak odejmowanie lub porównania. Te instrukcje są takie same dla 2 różnych dialektów
Oba przenoszą wartość w rbx do rax. Nie znam innych języków asemblera po prawej stronie, takich jak GAS.
https://en.wikipedia.org/wiki/Assignment_%28computer_science%29#Notation
Większość języków przypisuje wartość po lewej stronie, co jest jednym z powodów łatwego wyrównywania operatorów, łatwiejszego do odczytania i rozpoznania zmiennej, ponieważ operatory przypisania i pozycje zmiennych nie będą się bardzo różnić w wierszach i łatwiej jest je odczytać jako „Niech zmienna będzie jakąś wartością”.
Jednak niektórzy wolą powiedzieć „przenieś wartość x na y” i napisz zmienną po prawej stronie.
źródło
Myślę, że to logiczne myślenie.
Najpierw musi być pole (zmienne), a następnie umieść w nim obiekt (wartość).
Nie umieszczasz obiektu w powietrzu, a następnie umieszczasz wokół niego pudełko.
źródło