Mengapa tanda sisipan digunakan untuk XOR dan bukan eksponensial?

32

Bukannya itu benar-benar masalah bagi siapa saja yang pernah menghadapi masalah sintaksis ini sebelumnya, tetapi saya melihat sejumlah besar kebingungan yang berasal dari penggunaan tanda sisipan ( ^) sebagai operasi XOR sebagai pengganti operasi eksponensial matematika yang diterima secara luas.

Tentu saja ada banyak tempat di mana (mis-) penggunaan tanda sisipan dijelaskan dan diperbaiki, tetapi saya belum menemukan sumber definitif tentang mengapa tanda sisipan diberi arti yang berbeda.

Apakah ini masalah kenyamanan? Kecelakaan? Jelas alasannya bisa berbeda untuk berbagai bahasa, sehingga informasi dalam hal apa pun akan berwawasan luas.

Qix
sumber

Jawaban:

58

Meskipun ada prekursor yang lebih tua, yang berpengaruh matematikawan Perancis Rene Descartes biasanya dikreditkan untuk memperkenalkan eksponen superscripted (a b ) ke dalam tulisan matematika, dalam karyanya Geometri yang diterbitkan pada tahun 1637. Ini adalah notasi masih universal digunakan dalam matematika hari ini.

Fortran adalah bahasa pemrograman tertua yang banyak digunakan untuk perhitungan numerik yang menyediakan operator eksponensial, dimulai pada tahun 1954. Operasi eksponensial dilambangkan dengan tanda bintang ganda **. Perlu dicatat bahwa banyak komputer pada saat itu menggunakan pengkodean karakter 6-bit yang tidak memberikan karakter tanda sisipan ^. Penggunaan **kemudian diadopsi oleh pencipta berbagai bahasa pemrograman yang lebih baru yang menawarkan operasi eksponensial, seperti Python.

Set karakter yang diadopsi secara luas pertama yang berisi tanda sisipan ^adalah pengkodean ASCII 7-bit yang pertama kali distandarisasi pada tahun 1963. Bahasa pemrograman tertua yang saya ketahui yang menggunakan tanda sisipan untuk menunjukkan eksponensial adalah BASIC, yang bertanggal tahun 1964. Hampir sama waktu IBM mengadopsi pengkodean karakter EBCDIC , yang juga termasuk tanda sisipan ^.

Bahasa C muncul pada tahun 1972. Bahasa ini tidak menyediakan operator eksponensial, melainkan mendukung eksponen melalui fungsi pustaka seperti pow(). Oleh karena itu, tidak ada simbol yang perlu dikesampingkan untuk eksponensial dalam bahasa C, dan lainnya, nanti, dalam keluarga C, seperti C ++ dan CUDA.

Di sisi lain, dan tidak umum untuk bahasa pemrograman hingga saat itu, C menyediakan simbol untuk operasi bitwise. Jumlah karakter khusus yang tersedia dalam ASCII 7-bit terbatas, dan karena ada "afinitas alami" dari operasi lain untuk karakter khusus tertentu, misalnya &untuk DAN dan ~untuk TIDAK, tidak ada begitu banyak pilihan untuk simbol untuk XOR .

Saya tidak mengetahui alasan yang dipublikasikan yang diberikan oleh Ritchie atau Kernighan tentang mengapa mereka memilih ^untuk menunjukkan XOR secara khusus; Sejarah singkat Ritchie tentang C tidak membahas masalah ini. J melihat spesifikasi untuk prekursor untuk C, bahasa B , mengungkapkan bahwa itu tidak memiliki operator XOR, tetapi sudah digunakan semua karakter khusus selain ^, $, @, #.

[Pembaruan] Saya mengirim email ke Ken Thompson, pencipta B dan salah satu co-pencipta C, menanyakan tentang alasan memilih ^sebagai operator XOR C, dan meminta izin untuk membagikan jawaban di sini. Jawabannya (sedikit diformat ulang untuk dibaca):

Dari: Ken Thompson
Terkirim: Kamis, 29 September 2016 4:50
Kepada: Norbert Juffa
Subjek: Re: Dasar Pemikiran dibalik pemilihan tanda kuret sebagai operator XOR di C?

itu adalah pilihan acak dari karakter yang tersisa.

jika saya harus melakukannya lagi (yang saya lakukan) saya akan menggunakan operator yang sama untuk xor (^) dan komplemen bit (~).

karena ^ sekarang adalah operator yang lebih dikenal, in go, ^ adalah xor dan juga pelengkap.

Penggunaan ^untuk eksponensial dalam "matematika" yang Anda rujuk sebenarnya adalah penggunaan yang ditetapkan jauh di kemudian hari untuk sistem pengaturan huruf seperti Knuth's TeX yang bertanggal tahun 1978, antarmuka baris perintah untuk sistem aljabar seperti Mathematica yang tanggal tahun 1988, dan grafik kalkulator di awal 1990-an.

Mengapa produk-produk ini mengadopsi penggunaan ^eksponensial? Dalam kasus kalkulator saya curiga pengaruh BASIC. Sepanjang 1980-an itu adalah bahasa pemrograman pertama yang sangat populer dan juga tertanam ke dalam produk perangkat lunak lainnya. Oleh karena itu, notasi ini sudah biasa bagi banyak pembeli kalkulator. Ingatan saya tidak jelas, tetapi saya percaya bahkan ada kalkulator yang benar-benar menjalankan penerjemah BASIC sederhana.

njuffa
sumber
4
Itu adalah pelajaran sejarah yang menyenangkan. Jadi pertanyaan sebenarnya adalah "Mengapa perangkat lunak Tex (dan lainnya dari periode itu) telah memutuskan untuk menggunakan simbol XOR memiliki eksponensial?" ;)
AxelH
5
@ Axel Sebenarnya, tidak. TeX digunakan ^untuk superscript . Dan masuk akal bagi saya untuk menggunakan karakter "naik" untuk superscript dan karakter "turun" ( _) untuk subskrip.
svick
2
@AxelH Saya setuju dengan svick bahwa ^menyarankan panah atas, yang pada gilirannya mengisyaratkan posisi tradisional dari eksponen superscript, sehingga agak cocok secara alami. Saya yakin Donald Knuth akan menanggapi email yang menanyakan tentang keputusannya untuk menggunakan ^eksponensial di TeX, tetapi mengingat bahwa ia sedang sibuk mengerjakan hal-hal yang lebih penting, seperti menyelesaikan TAOCP, saya tidak ingin mengambil langkah itu (saya memang mempertimbangkan saya t).
njuffa
7
Menurut en.wikipedia.org/wiki/Caret , Algol 60 menggunakan panah menunjuk ke atas untuk eksponensial, dan mencatat bahwa awalnya ASCII juga memiliki panah atas pada titik kode yang sama di mana saat ini memiliki simbol tanda sisir, sehingga keduanya jelas-jelas disamakan satu sama lain di sekitar waktu yang sama.
Periata Breatta
4
Jawaban bersejarah yang sangat bagus. Saya hanya ingin menambahkan alasan yang mungkin untuk menerapkan operator bit C bukan eksponensial: Tujuan C adalah menjadi bahasa tingkat rendah yang memungkinkan programmer akses mudah ke bagian besar dari hal-hal yang didukung CPU secara asli. Dan CPU selalu memberikan instruksi manipulasi bit, namun saya tidak tahu satu CPU yang memiliki instruksi khusus untuk eksponensial. Dengan demikian, eksponensial selalu membutuhkan loop (setidaknya dengan bilangan bulat aritmatika), dan tidak ada fitur tunggal di C yang menyembunyikan loop di belakang konstruksi bahasa.
cmaster