Memilih bahasa pemrograman fungsional [tertutup]

48

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

Semester [kursus] terakhir, saya telah diperkenalkan dengan Skema. Saya menyukainya. Mencintai kesederhanaan yang ekstrim dari sintaksis, prinsip homoiklikositas , 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 sama.

Beberapa pemikiran tentang beberapa bahasa fungsional lain yang saya pertimbangkan:

  • Clojure: Kedengarannya hebat karena bisa mengakses dunia Jawa, berorientasi pada skalabilitas dan konkurensi, tetapi bukankah dunia Jawa sedang berada di ujung tanduk saat ini? Saya sudah mengenal Java dengan cukup baik, tetapi apakah lebih bijak untuk 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 berorientasi karier terbaik.

Malam ini, aku condong ke arah Lisp. Satu minggu yang lalu, itu adalah Haskell. Sebelum itu adalah 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.

Joanis
sumber
5
Apa pun yang Anda pilih, tulis banyak kode yang Anda gunakan untuk sesuatu di dalamnya.
8
Tidak memikirkan Scala ?
ykombinator
@ykombinator: Saya pernah mendengarnya, tetapi saya belum mencari lebih jauh. Saya tidak tahu apakah itu akan menawarkan sesuatu yang lebih dari yang saya daftarkan, atau mungkin itu akan membawa kombinasi pilihan yang menarik dari masing-masing ... Tidak tahu. Kedengarannya bagi saya seperti bahasa profil yang cukup rendah, meskipun tampaknya mulai populer.
Joanis
1
Saya tidak tahu dari mana Anda mendengar bahwa dunia Jawa "berada di ujung tanduk" - saat ini sedang mengalami kebangkitan besar, sebagian besar berkat a) OpenJDK menjadi implementasi standar b) bahasa JVM baru seperti Scala dan Clojure dan c) The fakta bahwa proyek big data / cloud semakin memilih JVM sebagai platform target dan d) Android. Pada awal 2012, itu mungkin satu-satunya platform paling menarik untuk berada di .....
mikera
1
@ Mikera: Setuju. Ini sudah lebih dari setahun, tepat setelah Oracle mengakuisisi Sun Microsystems dan ada banyak hal yang mengkhawatirkan dan berspekulasi tentang masa depan Jawa yang dikompromikan oleh perusahaan yang lebih mengendalikan mengambil kendali ... JVM tampaknya cukup aman saat ini, untungnya!
Joanis

Jawaban:

35

Karena Anda menginginkan  bahasa praktis :

teks alternatif

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:

teks alternatif

Hmm, tidak terlihat seperti bahasa akademis sekarang, kan?

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

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

teks alternatif

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

Robert Harvey
sumber
Wow, posting yang bagus. Racket adalah persis apa yang saya gunakan ... PLT-Skema adalah namanya ketika saya mulai mempelajarinya. Garis merah di grafik terakhir itu mengganggu saya. Skema tidak pernah bisa digunakan sebanyak itu. Dan Clojure sepertinya akan berangkat. Hmm ...
Joanis
@ M. Joanis: Ambil dua grafik terakhir dengan sebutir garam; tampilan tangga dan volatilitas grafik terakhir menunjukkan bahwa tidak ada banyak titik data dalam grafik, meskipun itu menunjukkan bahwa seseorang berpikir bahasa layak dibayar.
Robert Harvey
@Robert Harvey, apa yang berubah dari grafik kedua ke grafik ketiga?
systemovich
@ Geoffrey: Lihat keterangannya; Saya menambahkan kata "developer" ke istilah pencarian.
Robert Harvey
Perhatikan bahwa Haskell dan Lisp juga homonim dan bahwa data Memang tidak menggeneralisasi ke seluruh dunia. ITJobsWatch mencantumkan 79 pekerjaan Scala, 55 F #, 47 Haskell, 30 Lisp dan 7 pekerjaan Clojure.
Jon Harrop
17

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.

Larry Coleman
sumber
Saya pikir Anda benar tentang memilih bahasa fungsional murni terlebih dahulu. Saya akan sangat tertarik melihat urutan bahasa fungsional dengan murni.
Joanis
@ M. Joanis: dari bahasa yang tercantum dalam pertanyaan Anda, saya akan mengatakan bahwa Haskell adalah yang paling murni, diikuti oleh Clojure, F # dan Lisp.
Larry Coleman
15

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 melakukan wawancara di toko "blub" dan 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 memilih 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 sesekali 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.

Jason True
sumber
2
"Keingintahuan akan membangun karier yang lebih abadi dan memuaskan daripada apa pun." Pernyataan ini sangat menginspirasi. Kamu benar. Saya terlalu terburu-buru. Saya selalu merasa seperti itu semua akan mengambil terlalu banyak waktu untuk belajar ... Jika saya bisa pergi 12 tahun yang lalu, ketika saya mulai, saya akan tahu untuk tidak membuang-buang semua waktu saya di VB dan C ++. Saya merasa tahun-tahun ini terbuang sia-sia. Saya tidak cukup ingin tahu. Saya ingin kode hal. Menggunakan bahasa yang saya tahu sudah cukup. Saya berpikir pada saat itu bahwa saya mengetahui jumlah yang wajar, tetapi itu sama sekali tidak terjadi.
Joanis
10

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 tidak cukup sesuai dengan model, jadi Anda harus berurusan dengan monad. Saya memutuskan bahwa saya harus meluangkan banyak waktu untuk menjadi 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 mau. 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 F # versi mandiri.

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

Erik
sumber
Fakta bahwa F # dan Clojure tidak sepenuhnya berfungsi memainkan peran penting dalam mendukung mereka. Mungkin F # bisa menjadi titik masuk saya dalam keluarga. Net suatu hari nanti ...
Joanis
1
@ Joanis, Anda menyatakan biaya sebagai poin terhadap F #, tetapi seperti yang ditunjukkan Erik, Anda bisa mendapatkannya sepenuhnya gratis.
Benjol
Jika saya membaca persyaratan dengan benar, pada dasarnya Anda mendapatkannya secara gratis dengan syarat tidak menggunakannya (atau membeli lisensi). Tapi saya mengerti itu masih bisa menjadi hal yang sangat baik untuk dipelajari jika saya berakhir di perusahaan yang menggunakan Visual Studio. Saya mungkin akan mencobanya setelah saya fungsional dengan bahasa pemrograman fungsional yang lebih bebas.
Joanis
1
@ M. Joanis: Tidak, F # bahkan merupakan open source dan Anda dapat mencoba menjalankannya di Mono di platform lain.
Jon Harrop
Mungkin waktu telah berubah sejak 2010, tetapi sebagai seseorang yang mulai belajar haskell dalam beberapa bulan terakhir, saya tidak berpikir melakukan IO di haskell sama sekali sulit. Untuk hal-hal dasar, Anda hanya perlu mempelajari beberapa do-sintaks baru. Mendapatkan pemahaman mendasar yang sebenarnya membutuhkan waktu beberapa minggu, tetapi saya benar-benar tidak mengerti apa fuzz tentang monad. Saya tidak berpikir mereka lebih sulit untuk dipelajari daripada kelas, instance, anggota statis dan semua jazz yang berhubungan dengan negara di OOP.
Sara
9

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 sulit 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.

  • Performanya "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 kecepatan Java dengan sedikit usaha (Clojure mendukung primitif Java dan pengetikan statis opsional untuk situasi di mana Anda memerlukannya). Perkiraan saya adalah bahwa Clojure lebih kasar 2-5x lebih lambat dari apa yang dapat Anda capai dengan kode Java atau C ++ yang dioptimalkan, yang konsisten dengan apa yang Anda lihat dalam tolok ukur yang cacat , dan seiring waktu saya berharap celah itu semakin sempit. Juga, cukup mudah untuk hanya menulis kode yang sangat sensitif terhadap kinerja di Java murni dan menyebutnya dari Clojure.

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

  • Desain bahasa - Clojure adalah IMO desain bahasa yang dipikirkan dengan sangat baik. Contohnya 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 kepada programmer berbagai fitur ortogonal untuk menyelesaikan masalah yang berbeda. . Lihat seni abstraksi dan sederhana menjadi mudah .

  • Komunitas - selalu subyektif, 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 yang kuat dengan komunitas Jawa juga penting dalam meyakinkan saya bahwa Clojure tidak akan mengambil risiko terjebak dalam "ceruk".

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

  • Pengetikan dinamis - seringkali ini merupakan keunggulan dalam hal produktivitas, tetapi rata-rata saya pikir saya akan menukarnya dengan pengecekan dan inferensi tipe yang lebih kuat. Sebagian besar ini akan dikurangi dengan memiliki test suite otomatis yang bagus, tetapi jika Anda suka tipe Anda divalidasi secara statis oleh kompiler maka Haskell atau Scala mungkin lebih dari secangkir teh Anda.

  • Canggih - Clojure berkembang sangat cepat dan ada banyak inovasi yang terjadi - sisi negatifnya adalah ada banyak eksperimen, beberapa perpustakaan dan alat masih belum matang, dan kadang-kadang ada pemutusan perubahan antara versi utama Clojure yang Anda perlu mengawasi.

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

mikera
sumber
1
Terima kasih! Pos yang bagus! Saya hanya, akhir-akhir ini, mempertimbangkan untuk menggunakannya untuk proyek internal perusahaan yang akan sangat didasarkan pada pepohonan dan pengulangan. Ditambah lagi, kita memiliki cukup banyak kode Java di sekitar sini yang dapat kita gunakan kembali dengan Clojure.
Joanis
6

Sepertinya Anda sudah mengerjakan pekerjaan rumah Anda, jadi Anda mungkin sudah tahu ini, tetapi Skema adalah dialek Lisp seperti halnya Common Lisp. Jika Anda menyukai banyak hal tentang Skema, tetapi tidak suka sifat akademisnya, cobalah 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.

Zeke
sumber
Terima kasih atas tautan TIOBE, itu referensi yang menarik. Saya kira Anda memilih Haskell karena kemurniannya dalam hal pemrograman fungsional?
Joanis
1
@ M. Joanis: Cukup banyak, meskipun saya berpikir untuk mengambil Lisp juga. Lihat programmers.stackexchange.com/questions/18838/…
Zeke
Jawaban yang dipilih sangat masuk akal. Kemurnian tampaknya menjadi cara untuk pergi sampai saya benar-benar memahami seluruh hal paradigma fungsional.
Joanis