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 010
sebenarnya 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?
javascript
python
ruby
octal
Manishearth
sumber
sumber
chmod
dengan 0666 atau 0777 untuk grup 3 bit untuk pengguna, grup, dan lainnya: baca, tulis, dapat dieksekusi.parseInt('010')
memang mengembalikan 8, maka semua saran untuk selalu menggunakanparseInt(foo, 10)
(dan itu masih kebiasaan bagi saya)Jawaban:
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.)
sumber
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.
sumber
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.
sumber
chmod 438 ./myfile
Mengerikan!0o10
sintaksis? 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 oktal031
sebagai 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 mendukung0q31
sebagai notasi ketika oktal diinginkan, atau0t025
untuk basis-sepuluh untuk memungkinkan nilai-nilai makro-paste dengan angka nol di depan, dan hanya melarang angka nol terkemuka tanpa spekulan dasar .