Apakah pemrograman dalam filosofi UNIX sama dengan pemrograman Fungsional?

30

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?

dvanaria
sumber
5
Saya tidak berpikir penting apakah analogi itu akurat atau tidak. Pertanyaannya adalah, apakah ini analogi yang berguna bagi Anda? Apakah memikirkannya dalam istilah-istilah itu membantu Anda menulis program dan menyelesaikan pekerjaan?

Jawaban:

19

Saya pikir Anda punya titik di sana, tapi cp, rm, cddan 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.

dancek
sumber
9

Jawabannya ada di "Pemrograman shell i / o dan UNIX Monadic" oleh Oleg Kiselyov.

Ini adalah esai yang terinspirasi oleh makalah Philip Wadler "How to Declare an Imperative" [ Wadler97 ]. Kami akan menunjukkan kesamaan luar biasa antara i / o monadik di Haskell, dan komposisi filter UNIX berdasarkan pipa dan pengalihan. Pipa UNIX (diperlakukan secara semantik seperti menulis ke file sementara) sangat mirip dengan monads. Selanjutnya, pada tingkat pemrograman UNIX, semua i / o dapat dianggap monadik ...

horsh
sumber
6

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.

Brian Knoblauch
sumber
1
Apakah Anda benar-benar mendapat pesawat terbang ?? ;) (maaf untuk komentar offtopic)
BlackBear
@ BlackBear Bukan pribadi saya sendiri. Saya berada di sebuah klub di mana sekitar 50 dari kita secara kolektif memiliki 4 pesawat. Sedikit lebih terjangkau dengan cara itu. :-)
Brian Knoblauch
@Brian Knoblauch: Saya ingin memiliki pesawat terbang di masa depan .. uang memungkinkan: P
BlackBear
5
Pemrograman fungsional tidak menyiratkan "tidak ada efek samping". Konsep di mana fungsi yang sama selalu menghasilkan hasil yang sama disebut "idempotence" dan bukan syarat yang diperlukan untuk suatu program untuk berfungsi. Ini juga dikenal sebagai "fungsional murni".
2

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"

kamaal
sumber
1

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

Travis Webb
sumber