Mengapa penamaan panggilan sistem UNIX / POSIX begitu tidak terbaca?

43

Apa alasan untuk menggunakan nama panggilan sistem yang tidak diceritakan seperti timedan creatbukannya getCurrentTimeSecsdan createFileatau, mungkin lebih cocok di Unix get_current_time_secsdan create_file. Yang membawa saya ke poin berikutnya: mengapa seseorang menginginkan sesuatu seperti cfsetospeedtanpa kasing unta atau setidaknya menggarisbawahi agar dapat dibaca? Tentu saja panggilan akan memiliki lebih banyak karakter tetapi kita semua tahu bahwa keterbacaan kode lebih penting bukan?

Benjoyo
sumber
42
Karena mereka diciptakan beberapa dekade sebelum notasi Hungaria, kasing unta, kasing ular, dan sejenisnya menjadi modis. Juga karena saat itu kompiler memiliki sumber daya yang sangat sedikit, dan nama pengenal terbatas pada (IIRC) 8 karakter.
lcd047
3
@phrnelnel Tidak yakin hubungan apa yang Anda lihat antara nama file dan ID variabel, tapi ya, saya ragu-ragu antara 8, 12, dan 14. Mungkin batasnya juga 14 untuk ID variabel. Jelas bukan 256+. Adapun notasi: silakan tentukan "selalu". Apakah Arminius menggunakan kata-kata CamelCase? Mungkin tidak. AFAIR, notasi Hongaria diperkenalkan untuk Windows pada awal 1990-an. CamelCase dan sneak_case adalah variasi selanjutnya. Keduanya tentu saja digunakan sebelum itu. Apa yang saya katakan adalah bahwa mereka menjadi populer sekitar pertengahan 1990-an.
lcd047
6
@phrnelnel: Perhatikan bahwa tautan Anda berbicara tentang batasan sistem file Unix pertama . Ketika Thompson, Richie et al. sedang merancang Unix, mereka harus mem - bootstrap Unix pada mesin yang belum menjalankan Unix , yaitu di lingkungan yang mungkin bahkan lebih terbatas.
DevSolar
11
Anda mungkin juga bertanya mengapa mereka tidak ditulis dalam bahasa Jerman, karena itu tentang perkiraan bahasa alami terdekat yang dapat saya pikirkan untuk keburukan yang terlalu lama yang telah diajarkan Java kepada para programmer untuk menerima ...
R ..
12
Saya sangat senang seperti ini. Bayangkan bagaimana ls -la | grepakan terlihat seperti: listAllHiddenAndNormalFiles() | globallySearchARegularExpressionAndPrint().
Pouya

Jawaban:

61

Itu karena kendala teknis saat itu. Standar POSIX dibuat pada 1980-an dan disebut UNIX, yang lahir pada tahun 1970. Beberapa kompiler C pada waktu itu terbatas pada pengidentifikasi yang panjangnya 6 atau 8 karakter, sehingga memenuhi standar untuk panjang variabel dan fungsi nama.

Pertanyaan-pertanyaan Terkait:

dr01
sumber
5
Saya tidak berpikir kendala teknis berlaku. Anda dapat memiliki file yang lebih besar dari 6 byte, Anda dapat memiliki program yang mencakup ribuan baris kode; pohon sintaksis abstrak jauh lebih dalam dari hanya enam level, dan dengan lebih banyak node per level. Hanya karena alasan, batas 6 karakter tidak bisa teknis, melainkan yang dirancang. Dan itu tidak menjelaskan mengapa "creat" lebih baik daripada "create". Juga, dapatkah Anda menyebutkan beberapa kompiler C yang Anda bicarakan? Jawaban Anda benar-benar berbunyi seperti "terdengar di suatu tempat".
phresnel
41
@phrnelnel: Dia tidak berbicara tentang ukuran file, jumlah baris, atau kedalaman pohon sintaksis. Versi lama bahasa C tidak memerlukan kompiler dan penghubung untuk menyimpan lebih dari 31 karakter pengidentifikasi pertama dengan tautan internal, atau lebih dari 6 untuk pengidentifikasi eksternal . Dengan demikian, get_current_date()dan get_current_time()tidak dapat dipisahkan oleh beberapa rantai alat awal ini. Alasannya adalah bahwa sistem ini bekerja pada jejak kaki kecil beberapa kilobyte.
DevSolar
34
Tapi kamu benar creat(). Ken Thompson pernah ditanya apa yang akan dia lakukan secara berbeda jika dia mendesain ulang sistem UNIX. Jawabannya: "Saya akan mengejanya dengan e."
DevSolar
8
@ fresnel: Hanya memiliki memori terbatas bukan batas yang sulit. Memiliki hanya dijamin panjang didukung terbatas pengidentifikasi adalah . Jika Anda hanya dijamin 6 karakter penting, itulah yang Anda kerjakan jika Anda layak mendapat garam.
DevSolar
6
FWIW, standar Fortran lama terbatas mengidentifikasi hingga 6 karakter. Dari buku ini : "Aturan Fortran dari enam karakter dalam satu pengidentifikasi berasal dari fakta bahwa enam karakter dapat diwakili dalam satu kata IBM 704." Saya tidak dapat berbicara untuk C, tapi saya membayangkan batasannya memiliki asal yang sangat mirip (atau mungkin, asal yang identik)
tpg2114
26

dr01 benar, tetapi ada juga alasan lain - kegunaan. Kembali pada hari itu, Anda tidak memiliki sesuatu yang senyaman keyboard untuk mengetik. Jika Anda beruntung, Anda memiliki sesuatu yang mirip dengan mesin tik jadul. Jika Anda kurang beruntung, Anda harus berurusan dengan sistem yang membutuhkan pekerjaan fisik yang sebenarnya untuk beroperasi (seperti, butuh banyak kekuatan untuk menekan "kunci"), atau Anda secara manual menekan lubang pada kartu.

Ini berarti bahwa bahkan dalam batas 6-8 karakter, Anda mencoba untuk menjaga perintah Anda sesingkat mungkin. Itu sebabnya Anda memiliki lsalih - alih list, dan creatbukannya create. Kode dari era itu penuh dengan variabel seperti a, xdan i- dan tentu saja, x2dan teman-teman. Mengetik adalah pekerjaan yang berat - hari ini, Anda tidak terlalu giat mengetik listIndexdaripada mengetik "mengetik" i- dan bahkan tidak lagi lebih lambat (terutama dengan teknologi tambahan seperti pelengkapan otomatis).

Pertanyaan sebenarnya adalah - mengapa begitu banyak idiom Unix bertahan meskipun mereka tidak lagi diinginkan?

Luaan
sumber
23
Pada hari kernel saya berubah dari timemenjadi getCurrentTimeSecsatau sesuatu seperti itu, saya akan berhenti memutakhirkannya. Bahkan dengan keyboard saya yang nyaman dan perangkat keras terbaru, nama-nama ini tetap sangat nyaman dan sederhana (kesederhanaan menjadi salah satu dasar UNIX). Saya benar-benar tidak merasa perlu membawa penamaan gaya Java / C # ke dalam bahasa C, apalagi di kernel Linux. IMO, dari perspektif pengembang kernel, atau pengembang UNIX secara umum, idiom ini tidak mendekati yang tidak diinginkan .
John WH Smith
11
@Benjoyo unRootlyLongNamed.Packaged.nonsensicalFunctionadalah jelek bagi saya, dan saya lebih suka menjadi yakin apa yang dilakukannya dengan melakukan man 2 timedaripada menebak apa yang tampaknya melakukan.
muru
7
@ Benjoyo Yah, siapa pun yang tidak terbiasa dengan lingkungan ini tidak seharusnya menggunakan panggilan sistem sejak awal, karena mereka secara khusus diperuntukkan bagi mereka yang melakukannya. Perpustakaan (standar) ada di sini untuk yang lain. UNIX tidak mengikuti "aturan" desain modis yang akan membuatnya mudah dimengerti pada pandangan pertama. Mereka yang menggunakannya tanpa melihat dokumen apa pun berada dalam banyak masalah, dan sedikit orang di komunitas UNIX akan menganggap bahwa masalah harus diselesaikan.
John WH Smith
4
@JohnWHSmith yakin pengembang mode kernel akan mengetahui sistem mereka dan dokumen-dokumennya, tetapi itu bukan alasan untuk tidak memiliki nama yang ringkas dan memberi tahu.
Benjoyo
7
@JohnWHSmith Sebagai seorang pengembang rendahan yang hanya pernah menulis driver kernel dan lebih suka nama-nama bermakna yang tidak penuh dengan singkatan saya harus tidak setuju. Tapi tidak apa-apa, karena jika Anda mencari contoh pada kode sumber git asli, Anda akan menemukan setidaknya satu dev kernel setuju dengan saya. Meskipun jika Anda memberitahu Linus bahwa nya get_Xatau remove_file_from_cache(mungkin saya mengusulkan rmfc?) Yang tidak diinginkan kernel pengembang, silakan lakukan publik - saya akan senang untuk melihat reaksinya.
Voo
22

Selain jawaban lain, saya ingin menunjukkan bahwa Unix dikembangkan sebagai reaksi terhadap Multics, CTSS, dan sistem operasi kontemporer lainnya, yang secara signifikan lebih bertele-tele tentang konvensi penamaan mereka. Anda bisa merasakan OS ini di http://www.multicians.org/devdoc.html . Misalnya, http://www.multicians.org/mspm-bx-1-00.html memberikan change_nameperintah untuk mengganti nama file; bandingkan Unix mv.

Juga, alasan utama mengapa nama panggilan sistem yang paling singkat tetap ada adalah kompatibilitas. Anda akan melihat bahwa API yang lebih baru cenderung lebih eksplisit; misalnya gettimeofdaydan clock_gettimebukannya adil time.

(Bahkan hari ini, menggunakan whateverIndexalih-alih iuntuk indeks lingkaran adalah kegagalan tinjauan kode otomatis dalam buku saya ;-)

zwol
sumber
2
Ya. Lucu mendengar argumen teknologi tentang kemampuan perangkat keras ketika Mesin LISP mendahului UNIX. Tentu, mesin UNIX lebih murah untuk dibeli , tetapi hanya itu saja. Menambahkan biaya perawatan (yang tentu saja tidak masuk hitungan di * * nix land) membalikkan meja bahkan saat itu, tapi itu bukan argumen yang cukup persuasif. (Dan ya, itidak masalah untuk indeks ketika Anda, katakanlah, iterasi array. Koordinat? Gunakan xdan y. Menelusuri beberapa ordinal? Jadilah deskriptif.)
Luaan 9'15
Mesin @Luaan LISP TIDAK mendahului Unix. Kamu gagal.
pizdelect
@pizdelect Itu benar secara teknis, tetapi kebenaran teknis bukan alasan yang cukup untuk membentak seseorang.
zwol
@pizdelect Maaf, saya maksud Lisp mendahului UNIX (dan C). Tetapi mesin-mesin LISP pada dasarnya kontemporer, jika Anda membandingkan dampak komersialnya (UNIX memiliki permulaan sekitar tiga tahun, tetapi pada saat mesin-mesin LISP datang, mesin-mesin UNIX komersial masih sedikit dan jarang terjadi; sebagian besar UNIX ada di akademia atau tanpa dukungan). Bagaimanapun, itu adalah tanggapan terhadap argumen teknologi umum pada saat itu, yaitu tahun 80-an, ketika orang-orang benar-benar memutuskan antara mesin UNIX dan LISPM, dan mereka salah. Itu berubah dengan komputer mikro yang bisa menjalankan LISP lebih cepat.
Luaan
10

Dennis Ritchie menetapkan batasan pada dirinya sendiri bahwa C tidak akan bergantung pada fitur tautan yang tidak diperlukan oleh Fortran. Oleh karena itu batas 6 karakter pada nama eksternal.

pengguna207421
sumber
@ downvoter Anda mungkin tidak setuju dengan Denni Ritchie tentang ini, tetapi itulah yang dia lakukan. Membawa jawaban ini sia-sia.
user207421