Mengapa bahasa pemrograman mulai menggunakan = untuk tugas?

13

Di sebagian besar buku algoritma awal, <-disebut penugasan dan =disebut perbandingan. Tetapi saat ini satu-satunya bahasa yang tidak digunakan =untuk penugasan adalah Pascal ( :=) dan bahasa mainan seperti COOL . Apa yang menyebabkan bahasa pemrograman modern berubah =menjadi penetapan makna alih-alih makna matematisnya tentang kesetaraan?

Siqi Lin
sumber
8
Jangan mulai saya ===...
Deer Hunter
1
tetap umum dalam pekerjaan algoritma; itu salah satu dari tiga notasi umum untuk penugasan saat menulis sebuah algoritma (yang lainnya adalah :=dan =). Hanya karena semua programmer menggunakan =tidak berarti semua matematika turun .
cpast
@DeerHunter ===baik-baik saja.
Darth Egregious
1
Saya memiliki seorang gadis sekolah menengah melolong: "Bagaimana bisa x sama dengan x ditambah satu?" di intro aku mengajar. Ini adalah keanehan mendasar komputer: variabel tidak ada di alam, mereka tidak seperti benda lain di alam semesta.
1
User251748: Dompet saya adalah variabel dunia nyata, berisi sekumpulan koin, uang kertas, dan sesekali kertas.
gnasher729

Jawaban:

14

Menurut Wikipedia , penggunaan equals untuk penugasan berasal dari Superplan bahasa Heinz Rutishauser, dirancang dari tahun 1949 hingga 1951, dan secara khusus dipopulerkan oleh Fortran:

Contoh terkenal untuk ide buruk adalah pilihan tanda sama untuk menunjukkan penugasan. Ini kembali ke Fortran pada tahun 1957, dan secara membabi buta telah disalin oleh tentara perancang bahasa. Mengapa itu ide yang buruk? Karena itu menggulingkan tradisi lama seabad untuk membiarkan "=" menunjukkan perbandingan untuk kesetaraan, predikat yang benar atau salah. Tetapi Fortran menjadikannya sebagai penugasan, penegakan kesetaraan. Dalam kasus ini, operan berada pada pijakan yang tidak sama: Operan kiri (variabel) harus dibuat sama dengan operan kanan (ekspresi). x = y tidak berarti sama dengan y = x.

—Niklaus Wirth, Gagasan Bagus, Melalui Kaca Tampak

Konrad Zuse juga menggunakan tanda sama dengan untuk Plankalkul , yang mengilhami Superplan Rutishauser, meskipun kompiler tidak pernah dirancang untuk itu. Kenapa dia memilih tanda sama dengan? Saya kira Anda harus bertanya padanya.

Robert Harvey
sumber
4
Ya, tentu saja ada ide yang lebih buruk. Setelah semua, teks matematika menggunakan =keduanya sebagai predikat dan untuk mendefinisikan variabel, misalnya dalam "Biarkan x = 4. Kemudian √ (x - y) adalah nol jika y = 4". Ini bekerja karena notasi matematika harus dipahami secara deklaratif daripada imperatif. Bahasa pemrograman fungsional (mis. Keluarga ML) default ke variabel yang tidak bisa berubah dan karena itu dapat terus digunakan =dalam peran ganda tanpa masalah. Atau lebih tepatnya, =apakah operator dan bagian dari letsintaksis.
amon
2
@amon: Saya tidak setuju tentang makna ganda dalam matematika. "Biarkan 4 = x" sama validnya dengan "Biarkan x = 4".
DATANG DARI
4
@COMEFROM "Let 4 = x" sama tidak wajarnya dengan pernyataan INTERCAL tempat Anda mengambil nama pengguna Anda. Ketika "x" tidak pernah disebutkan sebelumnya, "Biarkan x = {sesuatu}" atau "Biarkan x menjadi {widget}" memperkenalkan variabel selain menentukan nilainya dan ini menempatkan variabel pertama dengan konvensi. Itu justru karena, setidaknya dalam hal intuisi, ini adalah hal yang berbeda dari hanya menyatakan "nilai sama dengan ...".
3
@delnan "Let x = 4" hanyalah singkatan untuk "Let x ∈ ℤ dan x = 4". Konteksnya memperkenalkan variabel baru dan =kemudian hanya predikat, sama seperti di tempat lain digunakan. Perhatikan bahwa tergantung pada konteksnya, "Biarkan x = 4" bisa juga berarti "Biarkan x ∈ ℝ dan x = 4".
Doval
2
@ RobertTarvey Kita berbicara tentang penulisan matematika, bukan pemrograman C. DATANG DARI: Saya mengakui bahwa itu tidak sejelas yang saya katakan sebelumnya, tetapi karena prosa matematika didasarkan pada konvensi dan tidak ada spesifikasi yang dapat pengacara izinkan untuk "biarkan 4 = x", tidak, kata pernyataan itu bukan hanya valid seperti "let x = 4". Paling tidak, itu membingungkan pembaca dan karenanya gagal tujuan utama prosa .
7

Tetapi ketika saya melakukan matematika di sekolah "let x = 123"

adalah ungkapan yang umum. Versi awal Basic bersikeras kata kunci "let" sebelum equal. Jadi pada dasarnya bisul dilakukan untuk "membiarkan" dipahami.

Pengemudi kunci biasanya tidak dianggap tetapi sangat penting pada saat itu apa yang Anda ketik sebenarnya.

Ada dua perangkat input yang layak,

  • "Teletype" di mana Anda dapat menggunakan mesin teletype standar untuk membuat lubang kecil pada pita kertas yang kemudian dapat dibaca oleh komputer. Ini tidak terlalu buruk karena mendukung aplphabet standar dalam huruf besar dan kecil ditambah sebagian besar karakter di baris atas keyboard Anda.
  • Kartu punched - ada banyak mesin kartu punch nongkrong karena penggunaan penyortir, tabulator dan printer adalah umum di perusahaan besar. Ini mendukung karakter terbatas terbatas yang mengatur huruf besar hanya alfabet dan sejumlah karakter "khusus".

Teletype cenderung digunakan di toko-toko akademik dan militer, pukulan kartu di toko-toko komersial. Karenanya bahasa akademik seperti Pascal mendukung pengidentifikasi huruf kecil dan notasi "masuk akal" seperti ": =" untuk penugasan. Bahasa yang ditujukan untuk khalayak yang lebih komersial berasumsi bahwa kartu berlubang akan menjadi bentuk input utama maka bahasa huruf besar hanya bahasa FORTRAN dan COBOL dengan dukungan terbatas untuk karakter ":;> <" yang tidak tersedia pada keypad standar.

Kebetulan tidak ada ambiguitas tentang "=" digunakan untuk penugasan di FORTRAN awal karena perbandingan dilakukan menggunakan ".LT.", ".LE.", ".EQ.", ".GE." dan ".GT." sintaksis.

James Anderson
sumber
Saya menemukan let x = 123lebih analog assert(x == 123)dari pada jenis tugas apa pun.
AKHolland
1
NB. Jika Anda mulai bertele-tele maka sintaks COBOL "MOVE" adalah deskripsi yang paling akurat tentang apa yang sebenarnya dilakukan komputer. Meskipun "COPY" akan lebih akurat.
James Anderson
@AKHolland untuk nilai besar dari 123.
Karena C ++ menciptakan konstruktor pemindahan, COBOL “MOVE” terdengar jauh lebih aneh.
gnasher729
Saya selalu berpikir LET seharusnya tetap wajib di BASIC, karena itu akan membuat tugas terpisah dari pengujian kesetaraan. Semacam singkatan COBOL-ish. Masalahnya adalah, itu akan mengambil token lain lain di sumbernya, byte lain yang berharga di PC mungil kecil waktu itu. Jadi mereka menjatuhkannya.
Chuck Adams