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.
Jawaban:
Karena Anda menginginkan bahasa praktis :
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:
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:
Jika Anda ingin menjelajahi dialek Skema yang benar-benar hebat, lihat Racket.
sumber
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.
sumber
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.
sumber
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
sumber
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!
sumber
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.
sumber