Dalam setiap sistem yang saling tergantung pada dasarnya ada dua pilihan. Abstraksi dan integrasi. (Saya sengaja tidak menggunakan istilah teknis). Dengan Abstraksi, Anda mengatakan bahwa ketika Anda membuat panggilan ke API itu, sementara kode di belakang API dapat berubah, hasilnya akan selalu sama. Sebagai contoh ketika kita memanggil fs.open()
kita tidak peduli apakah itu drive jaringan, SSD atau hard drive, kita akan selalu mendapatkan deskriptor file terbuka yang dapat kita lakukan. Dengan "integrasi" tujuannya adalah untuk menyediakan cara "terbaik" untuk melakukan sesuatu, bahkan jika caranya berubah. Misalnya, membuka file mungkin berbeda untuk berbagi jaringan daripada untuk file pada disk. Kedua cara digunakan cukup luas di desktop Linux modern.
Dari sudut pandang pengembang, pertanyaannya adalah "bekerja dengan versi apa pun" atau "bekerja dengan versi tertentu". Contoh yang bagus untuk hal ini adalah OpenGL. Sebagian besar game diatur untuk bekerja dengan versi OpenGL tertentu. Tidak masalah jika Anda mengkompilasi dari sumber. Jika gim ini ditulis menggunakan OpenGL 1.1 dan Anda mencoba menjalankannya pada 3.x, Anda tidak akan bersenang-senang. Di ujung lain spektrum, beberapa panggilan, diharapkan berfungsi apa pun yang terjadi. Sebagai contoh, saya ingin menelepon fs.open()
Saya tidak ingin peduli dengan versi kernel apa saya. Saya hanya ingin deskriptor file.
Ada manfaat untuk setiap cara. Integrasi menyediakan fitur "yang lebih baru" dengan biaya kompatibilitas ke belakang. Sementara abstraksi memberikan stabilitas atas panggilan "baru". Meskipun penting untuk dicatat ini masalah prioritas, bukan kemungkinan.
Dari sudut pandang komunal, tanpa alasan yang sangat bagus, abstraksi selalu lebih baik dalam sistem yang kompleks. Sebagai contoh, bayangkan jika fs.open()
bekerja secara berbeda tergantung pada versi kernel. Kemudian pustaka interaksi sistem file sederhana perlu mempertahankan beberapa ratus metode "file terbuka" yang berbeda (atau mungkin blok). Ketika versi kernel baru keluar, Anda tidak akan dapat "meningkatkan", Anda harus menguji setiap bagian dari perangkat lunak yang Anda gunakan. Kernel 6.2.2 (palsu) dapat merusak editor teks Anda.
Untuk beberapa contoh dunia nyata OSX cenderung tidak peduli tentang melanggar User Space. Mereka bertujuan untuk "integrasi" lebih dari "abstraksi" lebih sering. Dan pada setiap pembaruan OS utama, banyak hal rusak. Itu bukan untuk mengatakan satu cara lebih baik dari yang lain. Ini pilihan dan keputusan desain.
Yang paling penting, sistem ekologi Linux dipenuhi dengan proyek opensource yang luar biasa, di mana orang atau kelompok bekerja pada proyek di waktu luang mereka, atau karena alat ini berguna. Dengan pemikiran itu, yang kedua berhenti menjadi menyenangkan dan mulai menjadi PIA, para pengembang itu akan pergi ke tempat lain.
Misalnya, saya mengirim tambalan ke BuildNotify.py
. Bukan karena saya altruistik, tetapi karena saya menggunakan alat ini, dan saya menginginkan fitur. Itu mudah, jadi di sini, punya tambalan. Jika rumit, atau rumit, saya tidak akan menggunakan BuildNotify.py
dan saya akan menemukan sesuatu yang lain. Jika setiap kali pembaruan kernel keluar, editor teks saya rusak, saya hanya akan menggunakan OS yang berbeda. Kontribusi saya kepada komunitas (sekecil apa pun) tidak akan berlanjut atau ada, dan seterusnya.
Jadi, keputusan desain dibuat untuk panggilan sistem abstrak, sehingga ketika saya melakukannya fs.open()
hanya berfungsi. Itu berarti mempertahankan fs.open
lama setelah fs.open2()
mendapatkan popularitas.
Secara historis, ini adalah tujuan dari sistem POSIX secara umum. "Ini satu set panggilan dan nilai pengembalian yang diharapkan, kamu tahu tengahnya." Lagi untuk alasan portabilitas. Mengapa Linus memilih untuk menggunakan metodologi itu adalah internal otaknya, dan Anda harus memintanya untuk tahu persis mengapa. Namun jika saya, saya akan memilih abstraksi daripada integrasi pada sistem yang kompleks.