Lingkungan Pemrograman UNIX (teks klasik) menyatakan bahwa pendekatan UNIX untuk pemrograman adalah membangun alat kecil yang terdefinisi dengan baik yang dapat dikombinasikan untuk memecahkan masalah yang lebih kompleks. Dalam mempelajari C dan Bash shell, saya telah menemukan ini sebagai konsep yang kuat yang dapat digunakan untuk menangani berbagai masalah pemrograman.
Hanya menggunakan platform Linux, konsepnya cukup jelas dan digunakan setiap saat. Ekspresi apa pun yang terbentuk pada baris perintah yang mengalihkan I / O, menghubungkan alat sistem seperti ls, grep, more, dan seterusnya menunjukkan betapa kuatnya konsep ini.
Hal yang membingungkan saya adalah bahwa banyak dari program-program ini ditulis dalam C, menggunakan gaya pemrograman imperatif / prosedural, namun cara mereka digunakan dan bergabung bersama pada baris perintah sepertinya lebih mirip pemrograman fungsional bagi saya, di mana setiap program adalah fungsi terisolasi yang tidak tergantung pada keadaan program lain yang mungkin diikuti.
Apakah ini akurat, memahami filosofi pemrograman UNIX pada dasarnya pemrograman fungsional menggunakan alat yang mungkin dibangun menggunakan gaya pemrograman imperatif?
sumber
Jawaban:
Saya pikir Anda punya titik di sana, tapi
cp
,rm
,cd
dan banyak orang lain mengubah keadaan, sehingga mereka tidak benar-benar fungsi. Filosofi UNIX lebih tentang melakukan hanya satu hal tetapi melakukannya dengan baik; sering melakukannya dengan baik berarti memungkinkan penggunaan fungsional, tetapi tidak selalu.sumber
Jawabannya ada di "Pemrograman shell i / o dan UNIX Monadic" oleh Oleg Kiselyov.
sumber
Yah, saya kira Anda bisa melihat seperti itu jika Anda mengabaikan masalah efek samping secara keseluruhan. Perintah Unix sering TIDAK berfungsi karena selalu mengembalikan set data yang sama dengan input yang sama. Namun, seperti yang Anda sebutkan, aspek perpipaan mirip dengan bagaimana pemrograman fungsional dapat dilakukan.
sumber
Sampai taraf tertentu Anda bisa mengatakan itu. Tapi itu belum tentu benar. Saya pikir Anda harus membacanya lebih sebagai 'kemampuan untuk mencapai lebih' dengan pendekatan desain yang sederhana. Dan agar sederhana, Anda harus membagi tugas menjadi bagian-bagian yang mudah dipahami dan mudah dirakit. Filosofi UNIX untuk berterus terang kepada Anda, dapat dijelaskan dengan contoh berikut.
Semua pemrograman adalah semacam manipulasi data! Dan dalam beberapa kasus pemrograman juga merupakan manipulasi program itu sendiri (pemrograman Meta). Sekarang cara kerja filsafat UNIX adalah, Bayangkan memproses teks. Apa itu teks? Teks adalah semacam data. Ketika berkumpul menjadi definisi teks yang terorganisir juga menjadi XML dan JSON. Teks juga bisa berupa daftar angka, Teks juga bisa csv, tsv dan apa yang tidak! Di Teks atau string lain dapat mewakili area data pemrograman yang sangat besar, hanya karena konteksnya dapat diputar dan diubah menjadi apa yang kita inginkan!
Semua pemrograman membutuhkan semacam organisasi data. Pengorganisasian membutuhkan pencarian ...
Sebuah. Di sana Anda pergi dengan hanya memiliki 'grep', 'fgrep' dan keluarganya untuk melakukan itu.
Setelah Anda mencari, Anda perlu melakukan beberapa penyortiran ..
b. Sekarang kita memiliki perintah 'semacam' untuk melakukan itu.
Anda baru saja mengurutkan dua file, sekarang Anda ingin membandingkannya.
c. Sekarang kita memiliki 'diff', 'cmp' et al untuk melakukan itu.
Anda baru saja menemukan tidak ada perbedaan antara file. Anda membutuhkan lebih banyak data terorganisir sekarang.
d. Anda memiliki 'cat', pipa dan operator pengalihan untuk menulis ke file.
Anda perlu parsing yang lebih spesifik ..
e. Anda memiliki kepala, ekor, lebih banyak, lebih sedikit, potong dkk untuk melakukan itu ...
Semua ini menjahit bersama menggunakan '|' untuk menghasilkan hal-hal yang sangat kuat nyata waktu tanpa menulis kode sama sekali. Untuk lebih banyak pencarian dan menjahit yang Anda miliki ..
f. awk, shell dan sed.
awk, shell, dan sed memberi Anda lebih banyak kontrol atas teks daripada apa yang dapat dipotong, berbeda dengan yang lain. Pernahkah Anda bertanya-tanya perintah itu1 | command2 | command3 ... series adalah semacam mekanisme alur kerja. Ketika dikombinasikan dengan If, ini menjadi lebih kuat.
Sekarang lebih menyenangkan.
Pernahkah Anda mendengar tentang utilitas bernama 'Perl' , hal ini sangat kuat sehingga Anda dapat melakukan tugas apa saja dengan pekerjaan sesedikit mungkin. Menjahit bersama dengan utilitas seperti DBM, Anda dapat melakukan bahkan tuntutan persistensi waktu kecil untuk aplikasi Anda. Ingat kita bahkan belum keluar dari dunia teks tetapi belum berhasil menutupi sebagian besar aspek lingkungan pemrograman.
Jadi saya pikir UNIX lebih dari sekedar sistem operasi. Ini adalah kumpulan alat dan lingkungan yang dirancang untuk memecahkan masalah dengan cara yang paling sederhana. Cara sederhana tidak selalu menyiratkan kesederhanaan implementasi solusi. Tetapi kesederhanaan itu sendiri tidak membawa Anda terlalu jauh.
Saya membaca ini di reddit.
"Jika satu-satunya tujuan desain Anda adalah kesederhanaan, Anda akan mendapatkan pengguna sebanyak Plan9"
sumber
Cara mereka bergabung bersama pada command-line dan berinteraksi satu sama lain sangat fungsional. Namun, saya akan mengatakan bahwa ini lebih berkaitan dengan desain shell, dan kurang berkaitan dengan apakah program-program yang mendasarinya ditulis secara imperatif atau fungsional. Sebagian besar bahasa fungsional yang baik mendukung konsep imperatif / prosedural, meskipun desain keseluruhannya cocok untuk pemrograman fungsional. Ya banyak fitur shell UNIX menggunakan konsep fungsional tetapi, sekali lagi, ini lebih disebabkan oleh desain shell daripada implementasi khusus dari program yang mendasarinya.
Semoga ini membantu,
-tjw
sumber