it-swarm-id.com

Memilih bahasa pemrograman fungsional

Saya telah membaca banyak utas tentang bahasa pemrograman fungsional belakangan ini (hampir dalam satu tahun terakhir). Saya benar-benar ingin memilih satu dan mempelajarinya secara menyeluruh.

Semester [kursus] terakhir, saya telah diperkenalkan dengan Skema. Saya menyukainya. Mencintai kesederhanaan ekstrim dari sintaksis, prinsip homoiconicity , makro ( higienis dan non-higienis), n-arity prosedur, dll.

Masalah dengan Skema adalah bahasa akademik. Saya tidak berpikir itu benar-benar digunakan di lingkungan produksi. Saya juga tidak percaya bahwa sangat baik untuk memiliki resume kami. Jadi, saya telah mencari-cari alternatif. Ada banyak dari mereka dan entah bagaimana mereka semua tampaknya memiliki tingkat popularitas yang serupa.

Beberapa pemikiran tentang beberapa bahasa fungsional lain yang saya pertimbangkan:

  • Clojure: Kedengarannya hebat karena bisa mengakses dunia Java, ini berorientasi pada skalabilitas dan konkurensi, tetapi bukan dunia Java dunia di Tepi kanan sekarang? Saya sudah tahu Java cukup baik, tetapi apakah lebih baik menambahkan lebih banyak energi tergantung pada JVM?
  • Haskell: Sepertinya bahasa yang sangat dihargai, tetapi dari apa yang saya baca, itu juga lebih merupakan bahasa akademik.
  • LISP: Sudah ada sejak selamanya. Tampaknya memiliki sebagian besar apa yang saya suka dari Skema. Ini memiliki komunitas besar. Untuk apa yang saya [pikir saya] tahu, itu mungkin bahasa pemrograman fungsional yang paling banyak digunakan dalam industri (?).
  • F #: Tidak terlalu mempertimbangkannya. Saya bukan penggemar MS. Saya tidak punya uang untuk membayar perangkat lunak mereka (saya bisa membebaskan mereka dari aliansi universitas, tetapi saya lebih cenderung memilih solusi berbasis komunitas). Meskipun ... Saya kira itu akan menjadi pilihan terbaik yang berorientasi pada karier.

Malam ini, saya condong ke arah LISP. Satu minggu yang lalu, itu adalah Haskell. Sebelum itu Clojure. Pada tahun lalu, saya melakukan beberapa Skema untuk bersenang-senang, bukan memaksanya karena alasan yang Anda tahu. Sekarang saya ingin serius (tentang belajar satu, tentang melakukan proyek nyata dengan itu, tentang mungkin akhirnya secara profesional bekerja dengannya). Masalah saya adalah saya perlu mempelajari semuanya sebelum dapat memilih satu.

49
Joanis

Karena Anda menginginkan bahasa praktis :

alt text

Perhatikan bahwa Haskell dan LISP digunakan lebih dari yang lain dalam industri, meskipun ada minat baru-baru ini di Clojure dan F #.

Tapi lihat apa yang terjadi ketika kami menambahkan Skema ke dalam campuran:

alt text

Hmm, tidak terlihat seperti bahasa akademis sekarang, kan?

Sebenarnya, grafik di atas mungkin bohong; "skema" Word dapat muncul dalam iklan yang diinginkan dalam konteks lain selain bahasa pemrograman. :)

Jadi di sini adalah grafik lain yang mungkin (sedikit) lebih representatif:

alt text

Jika Anda ingin menjelajahi dialek Skema yang benar-benar hebat, lihat Racket.

36
Robert Harvey

Jika Anda ingin mempelajari pemrograman fungsional, Anda mungkin lebih baik dilayani untuk mempelajari Haskell terlebih dahulu, kemudian gunakan bahasa apa pun yang Anda inginkan. Anda dapat mempelajari pemrograman fungsional menggunakan bahasa lain, tetapi mereka masih memungkinkan untuk kode imperatif dan berorientasi objek. Jika Anda menulis program nyata di Haskell, Anda akan belajar pemrograman fungsional lebih cepat karena paradigma lain tidak akan tersedia untuk kembali.

Setelah menulis program Haskell Anda, Anda akan memiliki alat-alat seperti monad dan teknik-teknik seperti pengkodean point-free untuk membawa ke bahasa pilihan Anda. Konsep-konsep tampaknya memetakan dengan sangat baik untuk Skema.

18
Larry Coleman

Sebenarnya, jika Anda dapat menerapkan sistem yang cukup rumit dalam Skema, Anda akan cukup diinginkan di perusahaan tempat Anda mungkin ingin bekerja. Sebelumnya dalam karir saya, saya bertemu dengan beberapa siswa yang telah melakukan cukup banyak pekerjaan di Skema, dan satu-satunya waktu yang merugikan adalah ketika mereka tidak dapat menjelaskan pekerjaan mereka atau tidak benar-benar memahaminya dengan cukup baik untuk mengimplementasikan data dasar struktur dan algoritma dalam jumlah waktu yang wajar. Saya selalu membiarkan kandidat menjawab pertanyaan seperti itu dalam bahasa pilihan mereka; Saya bertemu dengan beberapa orang yang berpikir bahwa mereka adalah yang terbaik di Skema yang berhasil sedikit berjuang dengan hal-hal yang seharusnya mudah, seperti menambahkan elemen ke daftar tertaut, yang membingungkan saya.

Tetapi jika Anda bisa "mendapatkan" Skema dengan cukup baik untuk menulis bahkan aplikasi web biasa, itu akan menjadi nilai jual yang cukup bagus di sebagian besar perusahaan perangkat lunak yang serius.

Jika Anda mewawancarai sebuah toko "blub" dan para pengembang hanya berpikir Anda aneh karena kemampuan Anda di Skema atau Haskell atau F #, Anda mungkin tidak ingin bekerja di sana. Dalam kebanyakan kasus, pengembang yang kompeten mendapatkan pilihan pertunjukan mereka, jadi jangan memusingkan "kepraktisan" kecuali satu-satunya pilihan yang dapat Anda bayangkan di masa depan adalah korporat. Berusahalah untuk menjadi kompeten, fleksibel, dan memecahkan masalah.

Perguruan tinggi bukan tentang kepraktisan. Ini tentang menciptakan lingkungan yang aman untuk dijelajahi dan dipelajari. Itu, pada kenyataannya, berguna, bahkan jika Anda akhirnya menulis perangkat lunak biasa untuk sisa karir Anda.

Yang sedang berkata, saya tidak melihat mengapa Anda ingin membatasi ke salah satu dari pilihan itu begitu cepat. Anda dapat dengan mudah memahami keempat bahasa dalam sekitar 4 minggu, lalu pilih satu untuk berkonsentrasi pada jerat terbaik dengan keinginan Anda saat ini. Kemudian kembali ke opsi Anda yang lain dan cobalah menerapkan sesuatu yang serupa. Pindah ke sesuatu yang lebih kompleks, dan pertimbangkan pilihan Anda lagi. Eksperimen itu baik. Kecuali Anda mencoba mencari nafkah bulan depan, Anda belum perlu menjadi spesialis.

Saya telah menulis beberapa di Skema, F #, Emacs LISP, dan Common LISP, dan membaca setidaknya sedikit Haskell, setidaknya kadang-kadang selama beberapa tahun terakhir. Saya tidak bisa mengatakan saya ahli dalam salah satu dari mereka, tetapi setiap kunjungan ke bahasa-bahasa tersebut telah menguntungkan saya dalam semua bahasa lain yang saya gunakan secara profesional (C #, Java, Ruby, dan kadang-kadang Boo, Perl dan Python). Keingintahuan akan membangun karier yang lebih tahan lama dan memuaskan daripada apa pun.

16
JasonTrue

Saya terjun ke Haskell untuk sementara waktu, tetapi kesimpulan yang saya dapatkan adalah bahwa itu terlalu akademis. Sangat sulit untuk melakukan sesuatu yang praktis. Dalam bahasa fungsional murni, hal-hal seperti IO hanya tidak cukup masuk ke dalam model, jadi Anda harus berurusan dengan monad. Saya memutuskan saya harus meluangkan banyak waktu untuk hanya nyaris tidak kompeten, jadi saya pindah.

Saya melakukan Skema di perguruan tinggi. Mungkin terdengar sepele, tetapi semua orangtua benar-benar mengganggu/mengganggu. Sulit untuk kembali ke itu setelah menggunakan bahasa seperti Python.

Baru-baru ini saya telah menjelajahi F #. Ini fungsional, tetapi juga bisa penting dan berorientasi objek saat Anda menginginkannya. Ini, bersama dengan dapat menggunakan perpustakaan NET., Memungkinkan untuk dengan mudah mencampur bagian fungsional murni Anda dengan hal-hal yang lebih praktis seperti GUI, IO dan jaringan. Anda bisa mendapatkan versi mandiri dari F #.

http://www.Microsoft.com/downloads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en

10
Erik

Saya mengevaluasi semua bahasa fungsional utama satu atau dua tahun yang lalu, dari perspektif menginginkan bahasa pemrograman fungsional yang praktis dan bertujuan umum.

Saya akhirnya memilih Clojure , yang kemudian terbukti menjadi pilihan yang sangat baik.

Secara umum alasan utamanya adalah:

  • Ekosistem perpustakaan - agar suatu bahasa bermanfaat, Anda memerlukan akses ke perpustakaan yang baik. Berada di JVM berarti Anda memiliki akses mudah ke pustaka sumber terbuka terbesar dan ekosistem alat, jadi pergi untuk bahasa JVM adalah hal yang tidak perlu dipikirkan dari perspektif pragmatis. Scala juga mendapat nilai tinggi di sini.

  • Makro-metaprogramming - Aspek LISP ini selalu menarik bagi saya, terutama karena saya mengantisipasi melakukan sedikit pembuatan kode. Saya sangat menghargai argumen yang dibuat dalam esai singkat Paul Graham " Beating The Averages ". Berbagai Lisps semuanya mendapat nilai kuat di sini.

  • Kinerja adalah "cukup baik" - Clojure selalu dikompilasi dan mendapatkan manfaat dari JVM JIT optimizer dan GC yang sangat baik. Seperti biasa, ada beberapa overhead dalam menggunakan bahasa fungsional tetapi dengan Clojure jelas bahwa Anda masing-masing dapat mendekati Java kecepatan dengan sedikit usaha (Clojure mendukung Java primitif dan pengetikan statis opsional untuk situasi di mana Anda memerlukannya) Perkiraan saya adalah bahwa Clojure lebih kasar 2-5x lebih lambat dari yang dapat Anda capai dengan kode Java atau C++ yang dioptimalkan lebih optimal konsisten dengan apa yang Anda lihat di cacat cacat , dan seiring waktu saya berharap kesenjangan itu semakin menyempit. Juga, cukup mudah untuk hanya menulis kode yang sangat sensitif terhadap kinerja di murni Java dan panggil dari Clojure.

  • Concurrency - Clojure memiliki pendekatan concurrency yang cukup unik dan kuat, terutama untuk concurrency yang sangat multi-core. Agak sulit untuk dijelaskan, tapi video ini sangat bagus untuk memberikan rasa prinsip. Saya pikir Clojure saat ini memiliki jawaban terbaik untuk pertanyaan rumit "bagaimana seharusnya Anda mengelola keadaan bersama, berbarengan, dan bisa berubah dalam bahasa pemrograman fungsional?".

  • Desain bahasa - Clojure adalah IMO desain bahasa yang dipikirkan dengan sangat baik. Contohnya adalah memiliki vektor [] dan peta {} literal di samping tanda kurung LISP reguler, penggunaan struktur data persisten yang tidak dapat diubah, mendukung kemalasan di seluruh bahasa melalui abstraksi urutan, dan menyediakan programmer dengan berbagai fitur ortogonal untuk menyelesaikan masalah yang berbeda. . Lihat seni abstraksi dan sederhana menjadi mudah .

  • Komunitas - selalu subjektif, tetapi saya menyukai apa yang saya lihat di komunitas Clojure. Sikapnya sangat membantu, konstruktif dan pragmatis. Ada penekanan "selesaikan" yang kuat, mungkin mencerminkan fakta bahwa banyak orang Clojure (termasuk Rich Hickey sendiri) berasal dari latar belakang membangun sistem perusahaan yang kompleks. Fakta bahwa komunitas Clojure memiliki hubungan kuat ke komunitas Java juga penting dalam meyakinkan saya bahwa Clojure tidak akan mengambil risiko terjebak dalam "ceruk".

Jika saya harus menyebutkan beberapa kelemahan kecil dari Clojure, ini akan menjadi:

  • Pengetikan dinamis - sering kali ini merupakan keunggulan dalam hal produktivitas, tetapi rata-rata saya pikir saya akan memperdagangkan ini untuk pemeriksaan dan inferensi tipe yang lebih kuat. Sebagian besar ini akan dimitigasi dengan memiliki test suite otomatis yang bagus, tetapi jika Anda menyukai tipe Anda yang divalidasi secara statis oleh kompiler maka Haskell atau Scala mungkin lebih merupakan secangkir teh Anda.

  • Canggih - Clojure berkembang sangat cepat dan ada banyak inovasi yang terjadi - kekurangannya adalah ada banyak eksperimen, beberapa perpustakaan dan alat-alatnya masih belum matang, dan ada beberapa perubahan antara versi-versi utama Clojure yang perlu Anda perhatikan.

Secara keseluruhan, saya tidak berpikir Anda bisa salah dengan Clojure jika Anda ingin bahasa fungsional modern yang sangat baik dan pragmatis!

9
mikera

Sepertinya Anda telah menyelesaikan pekerjaan rumah Anda, jadi Anda mungkin sudah mengetahui hal ini, tetapi Skema adalah dialek LISP seperti halnya LISP Biasa. Jika Anda suka banyak hal tentang Skema, tetapi tidak suka sifat akademisnya, coba Common LISP. Menurut indeks TIOBE , ini adalah bahasa ke 13 paling populer vs Skema di posisi 26.

Beberapa bahasa yang Anda sebutkan muncul di deskripsi pekerjaan yang saya lihat baru-baru ini, meskipun itu mungkin hanya kumpulan sampel kecil saya. Saya pribadi akan belajar Haskell, meskipun saya tidak berharap untuk menggunakan bahasa itu secara langsung dalam pekerjaan saya. Konsep pemrograman fungsional lebih berharga bagi saya untuk desain program di masa depan daripada pemasaran langsung bahasa itu sendiri.

6
Zeke