Haruskah kita lebih banyak menggunakan bahasa pemrograman fungsional dan / atau logika?

8

Saya telah memprogram sedikit Haskell dan Prolog sebagai bagian dari beberapa program uni, tetapi hanya itu saja. Dan saya belum pernah melihatnya digunakan di industri (bukan berarti saya sudah memiliki banyak pengalaman kerja untuk memulai, tetapi saya belum pernah melihat iklan di mana Anda harus mengetahuinya).

Jadi haruskah kita menggunakan bahasa pemrograman fungsional dan / atau logika lebih sering? Apakah ada kelebihan atau kekurangan untuk menggunakan atau tidak menggunakannya?

Gablin
sumber

Jawaban:

9

Saya percaya menggunakan alat yang tepat untuk pekerjaan itu. Bahasa imperatif dan fungsional memiliki tempat masing-masing dan tidak perlu didorong untuk menggunakan satu jenis lebih dari yang lain.

Untuk kelebihan / kekurangan, saya tidak berpikir saya bisa mengalahkan jawaban Eric Lippert untuk "Mengapa pemrograman fungsional belum diambil alih?" SO pertanyaan.

Adam Lear
sumber
Hmm? Mengapa downvote?
Adam Lear
1
Saya belum mengundurkan diri tetapi saya tidak setuju dengan jawabannya (seperti konkurensi dan paralelizm 'keliru' - dalam dunia fungsional istilah-istilah itu berarti 2 hal yang berbeda). Namun bukan berarti saya pikir itu adalah jawaban yang buruk.
Maciej Piechotka
Memang, jawaban Eric Lippert adalah jawaban yang sangat informatif. Terima kasih untuk arahannya.
gablin
5

Pertama-tama - karena kompiler harus melakukan lebih banyak. Jika Anda ingin membuat compiler imperatif, Anda hampir dapat melakukan transformasi 1-1 menjadi assembler dan kode yang dihasilkan akan memiliki kecepatan yang dapat diterima (tentu - mungkin ada banyak yang harus dilakukan tetapi kompilasi 'pada dasarnya' 1-1 kompilasi + optimalisasi). Kompilator fungsional HARUS menangani inlineing berat, optimalisasi panggilan ekor dll. Oleh karena itu implementasi bahasa fungsional jauh lebih lambat daripada C / C ++ / ... di masa lalu (namun mereka mendapatkan kecepatan lebih banyak setiap iterasi karena kompiler semakin baik).

Kedua - programmer sangat terbiasa menyatakan bahwa mereka tidak dapat 'menerima' "tidak ada pendekatan ... menyatakan". Tentu - kurangnya negara tidak berguna di setiap kondisi tetapi kurangnya negara (global) tidak berarti kurangnya negara setempat.

Ketiga - pemrograman fungsional tidak memiliki cerita yang bagus di belakangnya. OOP memiliki cerita yang bagus ketika objek memetakan ke kata benda dan seberapa intuitifnya. Setelah itu Anda tahu bahwa itu tidak begitu sederhana karena Anda tidak dapat membuat kelas Managersebagai subclass dari Employeeyang Employeemungkin akan mempromosikan untuk Managerdan Anda harus bermain-main dekorator. Program-program fungsional memiliki cerita dalam matematika yang IMHO lebih bermanfaat tetapi kurang berharga.

Sebagai internal dari perspektif komputer - tidak ada perbedaan antara komputasi paralel dan bersamaan banyak programmer tidak melihat perbedaan dan banyak bahasa memiliki primitif yang sama untuk menangani keduanya. Berkat kurangnya keadaan lokal dan utas yang ringan dalam bahasa pemrograman fungsional, paralelisasi algoritma jauh lebih mudah. Namun pemrograman konkuren tidak dibuat secara otomatis lebih mudah karena konkurensi adalah tentang keadaan global.

Akhirnya - ada banyak program lama yang ditulis dengan gaya inperatif. Bahkan porting dari bahasa imperatif ke bahasa imperatif jauh lebih sederhana daripada fungsional.

Sejauh yang saya tahu bank investasi mulai merangkul program fungsional secara internal sehingga mereka masuk ke XXI c. (di area yang sangat penting meskipun tersembunyi) - sehingga mereka mendapatkan momentum.

PS. Sementara saya percaya bahwa program fungsional "lebih baik" dalam arti mereka menyembunyikan kompleksitas lebih baik daripada pendekatan lain itu tidak berarti bahwa tidak ada area seperti skrip yang secara inheren penting.

Maciej Piechotka
sumber
2

Bahasa pemrograman adalah bentuk representasi informasi. Dalam hal ini instruksi untuk diikuti komputer. Namun, representasi juga penting bagi audiens target (yaitu para programmer).

Konsep fungsional / logis tidak seperti yang biasa digunakan dalam kehidupan sehari-hari sebagai konsep prosedural. Jika Anda membaca instruksi (yaitu cara menggunakan televisi, pemutar dvd, atau membuat furnitur dari IKEA), sebagian besar ditulis dengan cara prosedural (meskipun dalam bahasa alami).

Oleh karena itu, banyak orang yang tidak terlalu terlibat dalam matematika atau sains sering jauh lebih akrab dengan konsep prosedural seperti itu daripada yang logis atau fungsional.

Saya pikir ini memiliki banyak dampak dalam pemilihan kelas bahasa pemrograman yang digunakan. Pada akhirnya, serangkaian masalah yang dapat dipecahkan dengan bahasa pemrograman seperti itu hampir sama (selama mereka semua turing lengkap).

Namun, banyak bahasa prosedural memperoleh lebih banyak dan lebih banyak aspek dari konsep lain. Python dapat melakukan lambda-kalkulus dan penutupan, ruby ​​juga. Javascript yang sering digunakan dalam industri sebenarnya adalah bahasa fungsional (bahkan kebanyakan orang "menyalahgunakan" adalah dengan menggunakannya lebih dalam cara prosedural). Oleh karena itu, sebenarnya tugas programmer untuk menggunakan fitur-fitur tersebut dengan tepat di tempat yang sesuai.

txwikinger
sumber
1
Sejak kapan JavaScript menjadi bahasa fungsional?
Jonas
1
@Jonas - Ini memang bahasa fungsional dan selalu begitu. Tentu saja bahasa dapat mengikuti banyak paradigma sekaligus seperti halnya JavaScript.
ChaosPandion
1
@ChaosPandion: Hanya karena ia memiliki fungsi penutupan dan pesanan tinggi? :)
Jonas
@Jonas - Memang, jelas kita tidak berbicara Haskell di sini tetapi Anda masih bisa menyebutnya fungsional.
ChaosPandion
2
Saya kira Anda harus mempertimbangkan pendekatan umum terhadap masalah dengan cara idiomatis. Maka dari itu jika bahasa pemrograman menyarankan untuk membagi masalah menjadi fungsi-fungsi murni maka fungsional. Jika itu menyarankan untuk membagi masalah menjadi objek itu berorientasi objek. Jika itu menyarankan untuk "lakukan ini dan kemudian lakukan itu" itu sangat penting. Oleh karena itu lambda, kelanjutan dll. Bukan fitur yang diperlukan hanya untuk bahasa fungsional dan JS bukan bahasa fungsional karena tidak 'menyarankan' untuk berpikir dalam hal fungsi dan data yang tidak dapat diubah.
Maciej Piechotka