Mengapa begitu banyak bahasa memperlakukan angka yang dimulai dengan 0 sebagai oktal?

21

Saya sudah membaca Di mana oktal bermanfaat? dan sepertinya oktal adalah sesuatu yang dulunya bermanfaat.

Banyak bahasa memperlakukan angka yang diawali dengan 0 sebagai oktal, jadi literal 010sebenarnya adalah 8. Beberapa di antaranya adalah JavaScript, Python (2.7), dan Ruby.

Tetapi saya tidak benar-benar mengerti mengapa bahasa-bahasa ini membutuhkan oktal, terutama ketika penggunaan notasi yang lebih mungkin adalah untuk menunjukkan angka desimal dengan 0 yang berlebihan.

JavaScript adalah bahasa sisi klien, oktal tampaknya tidak berguna. Ketiganya cukup modern dalam arti lain, dan saya tidak berpikir bahwa akan ada banyak kode menggunakan notasi oktal yang akan rusak dengan menghapus "fitur" ini.

Jadi, pertanyaan saya adalah:

  • Apakah ada gunanya bahasa ini mendukung literal oktal?
  • Jika oktal literal diperlukan, mengapa tidak menggunakan sesuatu seperti 0o10? Mengapa menyalin notasi lama yang menimpa kasus penggunaan yang lebih bermanfaat?
Manishearth
sumber
24
Apakah Anda akan menerima "untuk membingungkan anak-anak selama wawancara" sebagai jawaban?
yannis
11
sesuai dengan sintaks C + penyalinan buta
ratchet freak
1
@Manishearth C mewarisinya dari leluhurnya. Java memilikinya, karena C memilikinya. Sebagian besar lainnya memilikinya, karena C dan Java memilikinya.
Ingo
2
Seseorang masih melihat perubahan hak Unix file oktal: chmoddengan 0666 atau 0777 untuk grup 3 bit untuk pengguna, grup, dan lainnya: baca, tulis, dapat dieksekusi.
Joop Eggen
3
@Llepwryd Di browser lama, parseInt('010')memang mengembalikan 8, maka semua saran untuk selalu menggunakan parseInt(foo, 10)(dan itu masih kebiasaan bagi saya)
Izkata

Jawaban:

34

Salinan buta C, seperti kata ratchet freak dalam komentarnya

Sebagian besar "perancang bahasa" hari ini tidak pernah melihat apa pun selain C dan salinannya (C ++, Java, Javascript, PHP, dan mungkin beberapa lusin orang lain yang belum pernah saya dengar). Mereka tidak pernah menyentuh FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL, dan lain-lain.

Sekali waktu, paparan ke beberapa bahasa pemrograman adalah WAJIB dalam kurikulum ilmu komputer, dan itu tidak termasuk menghitung C, C ++, dan Jawa sebagai tiga bahasa terpisah.

Oktal digunakan pada hari-hari sebelumnya karena membuat membaca nilai instruksi biner lebih mudah. PDP-11, misalnya, pada dasarnya memiliki opcode 4-bit, 2 nomor register 3-bit, dan 2 bidang mekanisme akses 3-bit. Mengekspresikan kata dalam oktal membuat semuanya jelas.

Karena hubungan awal C dengan PDP-11, notasi oktal dimasukkan, karena itu sangat umum pada PDP-11 pada saat itu.

Mesin lain memiliki set instruksi yang tidak memetakan dengan baik ke hex. CDC 6600 memiliki kata 60-bit, dengan setiap kata biasanya berisi 2 hingga 4 instruksi. Setiap instruksi adalah 15 atau 30 bit.

Adapun nilai membaca dan menulis, ini adalah masalah yang diselesaikan, dengan praktik terbaik industri terkenal, setidaknya di industri pertahanan. Anda DOKUMEN format file Anda. Tidak ada ambiguitas ketika formatnya didokumentasikan, karena dokumen MEMBERITAHU Anda apakah Anda melihat angka desimal, angka hex, atau angka oktal.

Perhatikan juga: Jika sistem I / O Anda default untuk memimpin 0 yang berarti oktal, Anda harus menggunakan beberapa konvensi lain pada output Anda untuk menunjukkan nilai heksadesimal. Ini belum tentu menang.

Menurut pendapat pribadi saya, Ada melakukan yang terbaik: 2 # 10010010 #, 8 # 222 #, 16 # 92 #, dan 146 semuanya mewakili nilai yang sama. (Itu mungkin akan membuat saya setidaknya tiga downvotes di sana, hanya untuk menyebutkan Ada.)

John R. Strohm
sumber
11
Menurunkan peringkat Anda karena menyebutkan Ada ... hanya bercanda
kufi
12
Saya ingin tahu bagaimana Anda menemukan figur yang jauh lebih dari 50% "perancang bahasa" - mengapa menakut-nakuti mengutip? - tidak memiliki pengalaman dengan apa pun kecuali keturunan C. Saya menghabiskan enam belas tahun yang baik dalam hidup saya berbicara dengan desainer bahasa profesional setiap hari dan tidak satu pun dari mereka yang cocok dengan deskripsi Anda.
Eric Lippert
Javascript digambarkan sebagai "kami ingin melakukan lisp di browser" untuk membuat perancang tertarik, jika saya ingat wawancara itu dengan benar ...
Izkata
2
@Izkata: Memang, Waldemar Horwat pernah mengatakan kepada saya bahwa dia memandang JavaScript sebagai dasarnya Common dengan sintaks mirip C. Bahkan Waldemar mendefinisikan bahasa logam, menulis juru bahasa untuk bahasa logamnya di Common Lisp, dan kemudian menulis spesifikasi JavaScript dalam bahasa logamnya, sehingga memungkinkannya untuk benar - benar menjalankan spesifikasi. Itu adalah teknik yang pintar.
Eric Lippert
Mengapa 0 digunakan? Bukankah masuk akal untuk menggunakan karakter non numerik? Apakah standar ANSI tidak memiliki pandangan ke depan bug yang disebabkan oleh angka yang bermaksud menjadi basis sepuluh?
Old Badman Grey
6

Mereka mendapatkannya dari C. Mengapa menyalin? Karena implementasi dasar dari ketiga adalah dalam C. Implementasi standar Python adalah CPython . Ruby awalnya dibangun di C juga. Javascript adalah kasus paling menarik di sini. Ini dijalankan di browser. Ingin menebak apa yang ditulis dengan browser web pertama ?

Jadi mengapa ketiga bahasa ini diimplementasikan dalam C? Karena semuanya berasal dari sistem UNIX. Jadi ini adalah kasus konvensi yang didorong oleh ekosistem. Perl juga melakukan ini. Lua mungkin akan jika Lua menggunakan bilangan bulat bukan ganda .

Jadi ini adalah pertanyaan tentang lingkungan dari bahasa-bahasa ini yang ditulis dalam C sehingga mereka mengambil konvensi mereka dari C. Akibat wajar yang mendukung adalah Visual Basic yang menggunakan & O sebagai gantinya. Sejauh membutuhkannya, tampaknya lebih berupa abstraksi yang berubah menjadi konvensi daripada yang lainnya.

Insinyur Dunia
sumber
Apakah Mosaic mendukung JavaScript? Jika tidak, bagaimana menyebutkannya relevan?
svick
2
@svick Ini adalah dasar untuk Netscape Navigator yang melakukannya.
Insinyur Dunia
2

Ada nilai untuk konsistensi. Jika Anda tidak dapat menentukan dengan tepat bagaimana angka akan diterjemahkan, Anda akan memiliki masalah nyata dalam menggunakan nilai dalam konteks yang berbeda.

Ini juga berarti Anda tidak perlu menulis parser Anda sendiri. Ada nilai besar dalam menggunakan rutinitas perpustakaan yang teruji dengan baik.

Juga jika Anda tidak mendukung sintaks 0 terkemuka Anda tidak memiliki cara sederhana untuk menulis nilai oktal.

Meskipun kita tidak terlalu bergantung pada angka oktal seperti dulu, angka itu masih bernilai. Sementara hasil yang sama dapat diperoleh dengan angka heksadesimal, dalam beberapa konteks, oktal lebih mudah dipahami.

Sejauh ini saya hanya melihat satu penggunaan untuk memimpin nol dalam angka desimal. Itu ada di tampilan dan entri bidang desimal panjang tetap seperti nomor identifikasi. Sudah bertahun-tahun sejak saya melihat bidang seperti itu dengan nol di depan. Meskipun ini mengurangi nilai yang tersedia sebesar 10%, itu menghilangkan masalah yang sering ditinggalkan pengguna dari nol terkemuka saat memasukkannya.

BillThor
sumber
3
Bidang dengan angka nol di depan adalah string, representasi visual dengan artinya sendiri, bukan angka.
Pieter B
1
+1 pertimbangkan chmod 438 ./myfileMengerikan!
Ingo
2
Mengapa tidak mengizinkan 0o10sintaksis? Saya percaya Python mendukungnya. Anda selalu dapat membuat cara sederhana untuk menulis nilai oktal yang tidak membuat angka tidak lagi menjadi angka normal. Saya telah melihat orang-orang mencoba menggunakan nol jejak dalam kode untuk penyelarasan dan manipulasi mudah, dan digigit oleh notasi oktal
Manishearth
Saya dapat memahami keinginan untuk memiliki sarana untuk menulis nilai oktal, selain biner dan hex. Saya juga bisa mengerti bahwa memiliki kompiler menafsirkan 031sebagai Halloween (31 Oktober) daripada Natal (25 Desember) dapat menimbulkan risiko jika programmer menyalin kode yang ditulis dalam bahasa yang menggunakan implementasi yang terakhir. Saya tidak melihat alasan, mengapa suatu bahasa tidak dapat mencapai yang terbaik dari kedua dunia dengan mendukung 0q31sebagai notasi ketika oktal diinginkan, atau 0t025untuk basis-sepuluh untuk memungkinkan nilai-nilai makro-paste dengan angka nol di depan, dan hanya melarang angka nol terkemuka tanpa spekulan dasar .
supercat
@supercat Gunakan 0 terkemuka untuk mewakili punggung tanggal oktal setidaknya untuk remaja Anda. Kasus-kasus di mana sering digunakan adalah kasus-kasus di mana bit memiliki signifikansi, dan penafsiran angka sebagai angka desimal hanya benar untuk nilai kurang dari 8. Menambahkan karakter tambahan (termasuk memimpin nol pada angka desimal) mungkin lebih membingungkan daripada membantu . Saya pasti akan menanyakan mengapa tanggal ditulisnya 012 031, 010 031, atau 012 025.
BillThor