Saya mulai mengajar pemrograman teman baru-baru ini (kami menggunakan Python), dan ketika kami mulai membahas pembuatan variabel dan operator penugasan, ia bertanya mengapa nilai di sebelah kanan diberikan ke nama di sebelah kiri, dan bukan sebaliknya. .
Saya tidak terlalu memikirkannya sebelumnya, karena itu tampak alami bagi saya, tetapi dia mengatakan bahwa kiri-ke-kanan tampak lebih alami baginya, karena itulah sebagian besar dari kita membaca bahasa alami.
Saya memikirkannya, dan menyimpulkan bahwa itu membuat kode lebih mudah dibaca, karena nama-nama yang ditugaskan (yang perlu digunakan kembali oleh programmer) mudah terlihat, disejajarkan di sebelah kiri.
aligned = 2
on = 'foo' + 'bar' + 'foobar'
the = 5.0 / 2
left = 2 + 5
Sebagai lawan:
2 = aligned
'foo' + 'bar' + 'foobar' = on
5.0 / 2 = the
2 + 5 = right
# What were the names again...?
Sekarang saya bertanya-tanya apakah ada alasan lain juga untuk standar ini. Apakah ada sejarah di baliknya? Atau ada beberapa alasan teknis mengapa ini merupakan opsi yang baik (saya tidak tahu banyak tentang kompiler)? Dan apakah ada bahasa pemrograman yang menetapkan ke sisi kanan?
sumber
value -> variable
).Jawaban:
Ditto @paxdiablo. Bahasa pemrograman awal ditulis oleh matematikawan - sebenarnya semuanya. Dalam matematika, dengan prinsipnya sendiri - membaca dari kiri ke kanan - masuk akal dalam cara kerjanya.
x = 2thn - 4.
Dalam matematika, Anda akan mengatakan ini: Misalkan x sama dengan 2y -4.
Juga, bahkan dalam aljabar kamu melakukan ini. Saat Anda memecahkan persamaan untuk variabel, Anda mengisolasi variabel yang Anda pecahkan untuk sisi kiri. yaitu y = mx + b;
Selain itu, sekali seluruh keluarga bahasa - seperti keluarga C - memiliki sintaks tertentu, lebih mahal untuk berubah.
sumber
let a be...
karena tidak ada waktu, kedua sisi penugasan sama juga, jadi penugasan ini sebenarnya adalah persamaan, tidak heran mengapa keduanya menggunakan tanda yang sama:=
x = 1
dalam bab satu, tetapi menegaskanx = 2
dalam bab dua, itu bukan kontradiksi yang mengerikan - setiap pernyataan hanya berlaku dalam konteks tertentu. Perbedaan dalam pemrograman imperatif sebagian adalah penghapusan penghalang (kita tidak perlu perubahan konteks), dan sebagian tentang implementasi dan kegunaan.BASIC
, salah satu bahasa komputer paling awal memiliki bentuk "layak":yang cocok dengan pola pikir matematika menentukan variabel, seperti "Biarkan H menjadi ketinggian objek".
COBOL
juga mirip denganCOMPUTE
pernyataannya. Seperti banyak cara melakukan sesuatu, itu mungkin hanya keputusan sewenang-wenang yang dilakukan melalui banyak bahasa.sumber
I declare that X must equal THIS
bukannya yang lebih linierEvaluate THIS and store it in X
MULTIPLY HEIGHT BY WIDTH GIVING AREA
, jadi variabel yang mendapatkan hasilnya ada di sisi kanan pernyataan.Sebenarnya, ada bahasa pemrograman yang ditugaskan ke sisi kanan: TI-BASIC ! Bukan hanya itu, tetapi juga tidak menggunakan '=' sebagai operator penugasan, melainkan menggunakan panah yang dikenal sebagai operator "STO".
contoh:
Dalam contoh di atas, tiga variabel dinyatakan dan diberi nilai. A akan menjadi 5, B akan menjadi 8, dan C akan menjadi -3. Deklarasi / penugasan pertama dapat dibaca 'store 5 as A'.
Mengenai mengapa TI-BASIC menggunakan sistem seperti itu untuk penugasan, saya mengaitkannya karena merupakan bahasa pemrograman untuk kalkulator. Operator "STO" pada kalkulator TI paling sering digunakan dalam operasi kalkulator normal setelah angka dihitung. Jika itu adalah angka yang ingin diingat pengguna, mereka akan menekan tombol "STO", dan caclulator akan meminta mereka untuk sebuah nama (secara otomatis menggunakan kunci alfa sehingga penekanan tombol menghasilkan huruf alih-alih angka):
dan pengguna dapat memberi nama variabel apa pun yang mereka pilih. Harus mengaktifkan kunci alfa, ketik nama, lalu tekan "STO", dan menekan tombol "Ans" akan terlalu rumit untuk operasi normal. Karena semua fungsi kalkulator tersedia dalam TI-BASIC, tidak ada operator penugasan lain yang ditambahkan ketika "STO" melakukan tugas yang sama, meskipun mundur jika dibandingkan dengan sebagian besar bahasa lainnya.
(Anekdot: TI-BASIC adalah salah satu bahasa pertama yang saya pelajari, jadi ketika saya ketika saya pertama kali belajar Java di perguruan tinggi saya merasa seolah-olah menugaskan ke KIRI itu tidak biasa dan 'mundur'!)
sumber
Heuristik 1: Ketika dihadapkan dengan lebih dari satu cara yang mungkin untuk melakukan sesuatu saat mendesain bahasa, pilih yang paling umum, paling intuitif, atau Anda akan berakhir dengan Perl +.
Sekarang, bagaimana itu lebih alami (setidaknya untuk penutur bahasa Inggris)? Mari kita lihat bagaimana kita menulis / mengatakan sesuatu dalam bahasa Inggris:
Steven sekarang berusia 10 tahun (berbeda dengan Steven yang berumur 10 tahun sekarang). Saya menimbang lebih dari 190 pound (berbeda dengan lebih dari 190 pound yang saya timbang).
Dalam kode:
Berikut ini juga terdengar lebih alami:
"Jika Mary berusia 18 tahun, maka dia dapat memiliki permen". "Jika saya lebih muda dari 21 tahun, maka saya akan meminta saudara saya untuk tequila".
dari:
"Jika 18 tahun, Mary ..." "Jika 21 lebih besar dari usiaku ..."
Sekarang kodenya:
Perhatikan bahwa ini tidak alami baik bagi programmer maupun penutur bahasa Inggris. Kalimat-kalimatnya terdengar seperti berbicara yoda, dan kode itu dijuluki kondisi-yoda. Ini mungkin membantu dalam C ++, tetapi saya yakin kebanyakan orang akan setuju: jika seorang kompiler dapat melakukan pengangkatan berat dan mengurangi kebutuhan untuk kondisi yoda, hidup akan sedikit lebih mudah.
Tentu saja, orang bisa terbiasa dengan apa pun. Sebagai contoh, angka 81 ditulis sebagai:
Eighty One (Inggris) Eighty dan satu (Spanyol) One dan Eighty (Jerman).
Akhirnya, ada 4! = 24 cara sah untuk mengatakan "apel hijau terletak di atas meja" dalam bahasa Rusia - urutan (hampir) tidak masalah, kecuali bahwa 'on' harus datang bersama dengan 'table'. Jadi, jika Anda adalah penutur asli bahasa Rusia (misalnya), maka Anda mungkin tidak peduli apakah seseorang menulis
a = 10
atau10 = a
karena keduanya tampak sama alami.Sementara linguistik adalah subjek yang menarik, saya tidak pernah mempelajarinya secara formal dan tidak tahu banyak bahasa. Semoga saya telah memberikan contoh-contoh yang cukup.
sumber
(four times twenty) one
Dimulai dengan FORTRAN pada 1950-an. Di mana FORTRAN adalah singkatan dari FORmula TRANslation - rumus yang dimaksud adalah persamaan aljabar sederhana yang oleh konvensi selalu menetapkan ke kiri.
Sebaliknya, COBOL kontemporer dekat ini dimaksudkan seperti bahasa Inggris dan ditugaskan ke kanan (kebanyakan!).
sumber
Nah, seperti yang ditunjukkan @ diceguyd30, ada kedua notasi.
<Identifier> = <Value>
berarti "biarkan Identifier menjadi Nilai ". Atau untuk memperluas itu: Tentukan (atau definisikan ulang) variabel Identifier to Value .<Value> -> <Identifier>
berarti "menyimpan Nilai untuk Pengidentifikasi ". Atau untuk memperluas itu: Masukkan Nilai ke lokasi yang ditunjuk oleh Identifier .Tentu saja, secara umum Pengenal sebenarnya bisa berupa nilai-L.
Pendekatan pertama menghormati konsep abstrak variabel, pendekatan kedua lebih tentang penyimpanan aktual.
Perhatikan bahwa pendekatan pertama juga umum dalam bahasa, yang tidak memiliki tugas. Juga mencatat, bahwa variabel definisi dan tugas yang relatif dekat
<Type> <Identifier> = <Value>
vs<Identifier> = <Value>
.sumber
Seperti yang telah disebutkan, cukup baik semua bahasa komputer awal bekerja seperti itu. Misalnya FORTRAN, yang datang bertahun-tahun sebelum BASIC.
Sebenarnya sangat masuk akal untuk memiliki variabel yang ditugaskan di sebelah kiri ekspresi penugasan. Dalam beberapa bahasa, Anda mungkin memiliki beberapa rutinitas kelebihan beban yang berbeda dengan NAMA SAMA, menghasilkan berbagai jenis hasil. Dengan membiarkan kompilator melihat jenis variabel yang ditugaskan terlebih dahulu, ia tahu mana yang overload rutin untuk memanggil, atau apa yang dilemparkan implisit untuk menghasilkan ketika mengkonversi dari (misalnya) integer ke float. Itu sedikit penjelasan yang sederhana, tetapi mudah-mudahan Anda mendapatkan idenya.
sumber
Ini bisa menjadi sisa dari algoritma parsing awal. Ingat bahwa parsing LR hanya ditemukan pada tahun 1965, dan bisa jadi parser LL mengalami kesulitan (dalam batasan waktu dan ruang mesin pada saat itu) sebaliknya. Mempertimbangkan:
Keduanya jelas disatukan dari token kedua. Di samping itu,
Tidak menyenangkan. Ini semakin buruk ketika Anda mulai ekspresi penugasan bersarang.
Tentu saja, lebih mudah untuk ambigu untuk mesin juga berarti lebih mudah untuk ambigu bagi manusia. Contoh mudah lainnya adalah mencari inisialisasi dari setiap pengenal yang diberikan.
Mudah, lihat saja sisi kiri. Sisi kanan, di sisi lain
Terutama ketika Anda tidak dapat membuat
grep
kartu, jauh lebih sulit untuk menemukan pengenal yang Anda inginkan.sumber
Bahasa asssembly memiliki tujuan sebagai bagian dari opcode kiri. Bahasa tingkat yang lebih tinggi cenderung mengikuti konvensi bahasa pendahulunya.
Ketika Anda melihat
=
(atau:=
untuk dialek Pascalish), Anda dapat melafalkannya sebagaiis assigned the value
, maka sifat dari kiri ke kanan akan masuk akal (karena kami juga membaca dari kiri ke kanan dalam kebanyakan bahasa). Karena bahasa pemrograman sebagian besar dikembangkan oleh orang-orang yang membaca kiri-ke-kanan, konvensi macet.Ini adalah jenis ketergantungan jalan . Saya kira jika pemrograman komputer ditemukan oleh orang-orang yang berbicara bahasa Ibrani atau Arab (atau bahasa kanan-ke-kiri lainnya), maka saya curiga kita akan meletakkan tujuan di sebelah kanan.
sumber
mov.b #255, d0
, misalnya, di manad0
register untuk ditugaskan. Perakit yang lebih tua hanya memiliki satu argumen per instruksi. Di 6502LDA #255
(Load Accumulator), Anda bisa berargumen bahwaA
di sebelah kiri, tetapi juga di sebelah kiri diSTA wherever
(Store Accumulator).Untuk apa layak, sebagian pernyataan dalam COBOL dibaca dari kiri ke kanan, sehingga dua operan diberi nama pertama, dan tujuan yang terakhir, seperti:
multiply salary by rate giving tax
.Namun saya tidak akan, menyarankan bahwa siswa Anda mungkin lebih suka COBOL, karena takut bahwa saya (cukup benar) ditandai karena membuat komentar yang begitu rendah, kasar, dan hambar! :-)
sumber
Saya pikir ini adalah kesalahan. Di satu sisi, Anda dapat mengatakan "tetapkan 10 ke x" atau "pindahkan 10 ke x". Di sisi lain, Anda dapat mengatakan "atur x ke 10" atau "x menjadi 10".
Dengan kata lain, tergantung pada pilihan kata kerja Anda, variabel ditugaskan-ke mungkin atau mungkin bukan subjek, dan mungkin atau mungkin tidak di sebelah kiri. Jadi "apa yang alami" hanya bergantung sepenuhnya pada pilihan kebiasaan Anda untuk kata-kata untuk mewakili tugas.
sumber
Dalam pseudocode, operator penugasan biasanya ditulis di sebelah kanan. Sebagai contoh
Dalam kalkulator Casio, bahkan varian yang tidak dapat diprogram, variabel penugasan juga ditampilkan di sebelah kanan
Di Forth variabelnya ada di kanan juga
Pada x86, sintaks Intel memiliki tujuan di sebelah kiri, tetapi sintaks GAS membalik urutan, membuat beberapa kebingungan bagi banyak orang, terutama pada instruksi mengenai urutan parameter seperti pengurangan atau perbandingan. Instruksi-instruksi ini sama dalam 2 dialek yang berbeda
Keduanya memindahkan nilai dalam rbx ke rax. Tidak ada bahasa rakitan lain yang saya tahu tulis tujuan di sebelah kanan seperti GAS.
https://en.wikipedia.org/wiki/Assignment_%28computer_science%29#Notation
Sebagian besar bahasa menetapkan nilai ke kiri, salah satu alasannya adalah mudah menyelaraskan operator, lebih mudah membaca dan mengenali variabel, karena operator penugasan dan posisi variabel tidak akan bervariasi secara liar di dalam garis, dan lebih mudah dibaca sebagai + msgstr "biarkan variabel menjadi beberapa nilai".
Namun beberapa orang lebih suka mengatakan "pindahkan nilai x ke y" dan tulis variabel di sebelah kanan.
sumber
Saya pikir ini mengikuti cara berpikir logis.
Harus ada kotak (variabel) terlebih dahulu, lalu Anda meletakkan objek (nilai) di dalamnya.
Anda tidak meletakkan benda di udara dan kemudian meletakkan sebuah kotak di sekitarnya.
sumber