it-swarm.asia

Atama operatörü neden sol tarafa atar?

Yakın zamanda bir arkadaşınıza programlama yapmaya başladım (Python kullanıyoruz) ve değişken oluşturma ve atama operatörünü tartışmaya başladığımızda, sağdaki değerin neden soldaki isme atandığını sordu, tersi değil .

Daha önce çok fazla düşünmemiştim, çünkü benim için doğal görünüyordu, ama soldan sağa onun için daha doğal göründüğünü söyledi, çünkü çoğumuz doğal dilleri böyle okuyoruz.

Bunu düşündüm ve kodun okunmasını daha kolay hale getirdiği sonucuna vardım, çünkü atanan isimler (programcının yeniden kullanması gerekecek) solda hizalı olarak kolayca görülebilir.

aligned = 2
on = 'foo' + 'bar' + 'foobar'
the = 5.0 / 2
left = 2 + 5

Aksine:

2 = aligned 
'foo' + 'bar' + 'foobar' = on
5.0 / 2 = the 
2 + 5 = right 

# What were the names again...?

Şimdi bu standardın başka nedenleri olup olmadığını merak ediyorum. Arkasında bir tarih var mı? Yoksa bunun iyi bir seçenek olmasının teknik bir nedeni var mı (derleyiciler hakkında fazla bir şey bilmiyorum)? Sağ tarafa atanan programlama dilleri var mı?

48
voithos

Aynen @paxdiablo. İlk programlama dilleri matematikçiler tarafından yazılmıştır - aslında hepsi yazılmıştır. Matematikte, kendi prensibi ile - soldan sağa okuma - çalışma biçiminde mantıklıdır.

x = 2y - 4.

Matematikte şunu söylerdiniz: x, 2y-4'e eşit olsun.

Ayrıca, cebirde bile bunu yaparsınız. Bir değişken için bir denklem çözdüğünüzde, çözdüğünüz değişkeni sol tarafa ayırırsınız. yani y = mx + b;

Ayrıca, C ailesi gibi bir dil ailesinin tamamı belirli bir sözdizimine sahip olduğunda, değiştirilmesi daha maliyetlidir.

56
Jonathan Henson

En eski bilgisayar dillerinden biri olan BASIC şu biçime sahip:

10 LET AREA = HEIGHT * WIDTH

"H, nesnenin yüksekliği olsun" gibi bir değişken belirtmenin matematiksel zihniyetiyle eşleşir.

COBOL ayrıca COMPUTE ifadesiyle benzerdi. Bir şeyleri yapmanın birçok yolunda olduğu gibi, birçok dilde ileri sürülen keyfi bir karar olabilir.

26
user10776

Aslında, sağ tarafa atanan bir programlama dili var: TI-BASIC ! Sadece bu değil, aynı zamanda atama operatörü olarak '=' kullanmaz, aksine "STO" operatörü olarak bilinen bir ok kullanır.

örnekler:

5→A
(A + 3)→B
(A - B)→C

Yukarıdaki örnekte, üç değişken bildirilmiş ve değerler verilmiştir. A 5, B 8 ve C -3 olacaktır. İlk bildirim/atama '5'i A olarak kaydet' şeklinde okunabilir.

TI-BASIC'in neden böyle bir sistemi atama için kullandığına gelince, onu bir hesap makinesi için bir programlama dili olduğu için varlıkla ilişkilendiriyorum. TI hesap makinelerindeki "STO" operatörü çoğunlukla normal hesap makinesi işlemlerinde kullanıldı after bir sayı hesaplandı. Kullanıcının hatırlamak istediği bir sayı olsaydı, "STO" düğmesine basarlardı ve caclulator onlara bir isim vermesini isterdi (tuş vuruşlarının rakamlar yerine harf üretmesi için otomatik olarak alfa kilidini devreye sokar):

Sin(7 + Cos(3))
                    -.26979276
Ans→{variable name}
                    -.26979276

ve kullanıcı, ne isterse seçebilir. Alfa kilidini açmak zorunda, adı yazın, sonra "STO" tuşuna basın ve "Ans" tuşuna basmak normal işlemler için çok zahmetli olurdu. Tüm hesap makinesi işlevleri TI-BASIC'te mevcut olduğundan, "STO" aynı görevi yerine getirirken başka birçok atama operatörü eklenmedi, diğer dillere kıyasla geriye doğru da olsa.

(Anekdot: TI-BASIC öğrendiğim ilk dillerden biriydi, bu yüzden ilk öğrenirken Java kolejde LEFT'ye atamak olağandışı ve 'geri' gibi hissettim! )

25
diceguyd30

Sezgisel 1: Bir dil tasarlarken bir şey yapmanın birden fazla yoluyla karşı karşıya kaldığınızda, en yaygın, en sezgisel olanı seçin, yoksa bitirirsiniz Perl + ile.

Şimdi, nasıl daha doğal (en azından İngilizce konuşanlar için)? İngilizcede nasıl yazdığımızı/söylediğimizi inceleyelim:

Steven şimdi 10 yaşında (10 yaşında Steven'ın aksine). 190 kilodan fazla tartıyorum (190 kilodan fazla tartıldığımın aksine).

Kodda:

steven = 10
i > 190

Aşağıdakiler de daha doğal geliyor:

"Mary 18 yaşındaysa, o zaman bir şeker alabilir". "Eğer 21 yaşından küçüksem kardeşim tekila isteyeceğim".

if (mary == 18) { ... }
if (i < 21) { ... }

daha:

"Eğer 18 yaşındaki Mary ..." "21 yaşımdan büyükse ..."

Şimdi kod:

if (18 == mary) { ... }
if (21 > i) { ... }

Bunun programcılar veya İngilizce konuşanlar için doğal olmadığını unutmayın. Cümleler yoda-speak gibi görünür ve kod yoda-koşulları olarak adlandırılır. Bunlar C++ 'da yardımcı olabilir, ancak eminim çoğu insan kabul eder: bir derleyici ağır kaldırma yapabilir ve yoda koşullarına olan ihtiyacı hafifletebilirse, hayat biraz daha kolay olurdu.

Tabii ki, herhangi bir şeye alışabilirdi. Örnekler için 81 sayısı şu şekilde yazılmıştır:

Seksen Bir (İngilizce) Seksen ve bir (İspanyolca) Bir ve Seksen (Almanca).

Sonunda 4 tane var! = 24 geçerli "yeşil Apple masada yatıyor" demenin Rusça - sıra (neredeyse) önemli değil, 'on' ile 'table' bir araya gelmelidir. anadili Rusça olan biriyseniz (örneğin), birinin a = 10 veya 10 = a çünkü her ikisi de eşit derecede doğal görünüyor.

Dilbilim büyüleyici bir konu olsa da, resmi olarak hiç çalışmadım ve o kadar çok dil bilmiyorum. Umarım yeterince karşı örnek verdim.

15
Job

1950'lerde FORTRAN ile başladı. FORTRAN, FORmula TRANslation'ın bir kısaltmasıydı - söz konusu formüller, konvansiyonla her zaman sola atanan basit cebirsel denklemlerdir.

Öte yandan onun yakın çağdaş COBOL İngilizce gibi olması ve sağ (çoğunlukla!) Atandı.

MOVE 1 TO COUNTER.
ADD +1 TO LINE-CNT.
MULTIPLY QTY BY PRICE GIVING ITEM-PRICE.
11
James Anderson

@ Diceguyd30'un işaret ettiği gibi, her iki gösterim de vardır.

  • <Identifier> = <Value> "let Tanımlayıcı be Değer" anlamına gelir. Veya bunu genişletmek için: Tanımlayıcı ila Değer değişkenini tanımlayın (veya yeniden tanımlayın).
  • <Value> -> <Identifier> "mağaza Değer - Tanımlayıcı" anlamına gelir. Veya bunu genişletmek için: Değer öğesini Tanımlayıcı ile belirtilen konuma yerleştirin.

Tabii ki, genel olarak Tanımlayıcı konuşmak aslında herhangi bir L-değeri olabilir.

İlk yaklaşım, değişkenlerin soyut kavramını onurlandırırken, ikinci yaklaşım daha çok gerçek depolama ile ilgilidir.

İlk yaklaşımın ödevleri olmayan dillerde de yaygın olduğunu unutmayın. Ayrıca, değişken tanım ve atamanın nispeten yakın olduğunu unutmayın <Type> <Identifier> = <Value> vs. <Identifier> = <Value>.

5
back2dos

Erken ayrıştırma algoritmalarının bir kalıntısı olabilir. LR ayrıştırma işleminin sadece 1965 yılında icat edildiğini ve LL ayrıştırıcılarının (diğer bir deyişle makinelerin zaman ve alan sınırlamaları dahilinde) tersine dönmekte zorlanmaları olabileceğini unutmayın. Düşünmek:

identifier = function();
function();

İkisi açıkça ikinci jetondan ayrılıyor. Diğer yandan,

function() = identifier;
function();

Eğlenceli değil. Ödev ifadelerini iç içe yerleştirmeye başladığınızda bu durum daha da kötüleşir.

function(prev_identifier = expression) = identifier;
function(prev_identifier = expression);

Tabii ki, makineler için daha kolay anlaşılması aynı zamanda insanlar için daha kolay anlaşılması anlamına gelir. Başka bir kolay örnek, herhangi bir tanımlayıcının başlatılmasını aramak olabilir.

identifier1 = expressionOfAnArbitraryLength;
identifier2 = expressionOfAReallyReallyReallyArbitraryLength;
identifier3 = expression;
identifier4 = AlongLineExpressionWithAFunctionCallWithAssignment(
    identifier = expr);

Kolay, sadece sol tarafa bak. Sağ tarafta, diğer yandan

expressionOfAnArbitraryLength = identifier1;
expressionOfAReallyReallyReallyArbitraryLength = identifier2;
expression = identifier3;
AlongLineExpressionWithAFunctionCallWithAssignment(expr = identifier
    ) = identifier4;

Özellikle grep delikli kart bulamadığınızda, istediğiniz tanımlayıcıyı bulmak çok daha zordur.

3
DeadMG

Daha önce de belirtildiği gibi, tüm erken bilgisayar dilleri bu şekilde çalıştı. Örneğin. BASIC'ten yıllar önce gelen FORTRAN.

Atama ifadesinin solunda atanan değişkenin olması çok mantıklıdır. Bazı dillerde, AYNI AD ile birkaç farklı aşırı yüklenmiş rutininiz olabilir ve bu da farklı sonuç türleri döndürür. Derleyicinin önce atanan değişkenin türünü görmesine izin vererek, hangi aşırı yük yordamının çağrılacağını ya da bir tamsayıyı bir kayan noktaya dönüştürürken (ör.) Hangi dolaylı dökümün üretileceğini bilir. Bu biraz basit bir açıklama, ama umarım bu fikri anlarsınız.

3
Dave Jewell

Montaj dilleri soldaki opcode'un bir parçası olarak varış yerine sahip. Üst düzey diller, önceki dillerin kurallarına uyma eğilimindeydi.

Gördüğünde = (veya := için Pascal lehçeleri), bunları is assigned the value, soldan sağa doğa anlamlıdır (çünkü çoğu dilde soldan sağa da okuruz). Programlama dilleri ağırlıklı olarak soldan sağa okuyan insanlar tarafından geliştirildiğinden, sözleşmeler takıldı.

Bu bir tür yola bağımlılık . Bilgisayar programlamanın İbranice veya Arapça (veya sağdan sola başka bir dil) konuşan insanlar tarafından icat edildiğini varsayalım, o zaman hedefi sağa koyacağımızdan şüpheleniyorum.

2
Tangurena

Değeri ne olursa olsun, COBOL'daki çoğu ifade soldan sağa okunur, bu nedenle iki işlenen önce adlandırılır ve hedef son olarak şöyle: multiply salary by rate giving tax.

Bununla birlikte, öğrencinizin COBOL'u tercih edebileceğini önermeyeceğim, çünkü bu kadar alçakgönüllü, tatsız, tatsız bir yorum yapmak için işaretlendiğimden (oldukça haklı olarak)! :-)

2
Jerry Coffin

soldan sağa onun için daha doğal göründüğünü söyledi, çünkü çoğumuz doğal dilleri böyle okuyoruz.

Bence bu bir hata. Bir yandan, "10'a x ata" veya "10'a x taşı" diyebilirsiniz. Öte yandan, "x'i 10'a ayarla" veya "x 10 olur" diyebilirsiniz.

Başka bir deyişle, fiil seçiminize bağlı olarak, atanan değişken özne olabilir veya olmayabilir ve solda olabilir veya olmayabilir. Yani "doğal olan" tamamen, ödevi temsil etmek için alışılmış ifade biçimlerinize bağlıdır.

1
Steve314

Sözde kodda atama operatörü çok sağda yazılıdır. Örneğin

2*sqrt(x)/(3+y) -> z

Casio hesap makinelerinde, hatta programlanamayan varyantlarda, atama değişkeni de sağda görüntülenir

A+2B → C

Dördüncü olarak, değişken de sağda

expression variable !

X86'da Intel sözdiziminin solda hedefi vardır, ancak GAS sözdizimi düzeni tersine çevirerek birçok kişiye, özellikle de çıkarma veya karşılaştırma gibi parametrelerin sırasına ilişkin talimatlarda, bazı karışıklıklar yaratır. Bu talimatlar 2 farklı lehçede aynıdır

mov rax, rbx    ; Intel syntax
movq %rbx, %rax ; GAS syntax

Her ikisi de rbx'deki değeri rax'a taşır. Bildiğim başka Meclis dili yok, hedefi GAZ gibi sağ tarafa yazın.

Bazı platformlar ifadeyi sola, değişkeni sağa koyar:

MOVE expression TO variable      COBOL
expression → variable            TI-BASIC, Casio BASIC
expression -> variable           BETA, R
put expression into variable     LiveCode

https://en.wikipedia.org/wiki/Assignment_%28computer_science%29#Notation

Çoğu dil, değeri sola atar, operatörlerin hizalanmasının kolay olması, değişkenin okunması ve tanınması daha kolaydır, çünkü atama operatörleri ve değişkenlerin konumları satırlarda çılgınca değişmez ve msgstr "değişken bir değer olsun".

Ancak bazı insanlar "x değerini y'ye taşı" demeyi ve değişkeni sağa yazmayı tercih eder.

0
phuclv