Saya mulai belajar Skema dari video SICP, dan saya ingin pindah ke Common Lisp berikutnya.
Bahasa itu tampaknya sangat menarik, dan sebagian besar orang menulis buku-buku yang menganjurkan bahwa ia memiliki kekuatan ekspresif yang tiada banding. CL tampaknya memiliki perpustakaan standar yang layak.
Mengapa Lisp tidak tersebar luas? Jika benar-benar kuat, orang harus menggunakannya di seluruh, tetapi sebaliknya hampir tidak mungkin untuk menemukan, katakanlah, iklan pekerjaan Lisp.
Saya harap ini bukan hanya tanda kurung, karena mereka bukan masalah besar setelah beberapa saat.
programming-languages
lisp
usage
Andrea
sumber
sumber
Jawaban:
Ekspresivitas tidak selalu merupakan sifat bahasa yang positif dalam lingkungan perusahaan. Java sangat populer sebagian karena mudah dipelajari, mudah ditulis, dan mudah dibaca. Pemrogram yang biasa-biasa saja masih bisa sangat produktif di Jawa, bahkan jika kode mereka bertele-tele dan tidak bagus.
Selain itu, mudah untuk menyalahgunakan bahasa ekspresif. Seorang programmer java yang ahli dapat memperbaiki kode yang ditulis dengan buruk dengan cepat. Semakin ekspresif bahasa, semakin sulit memahami dan menjadi refactoring kode yang mengerikan. Makro LISP adalah contoh yang bagus. Macro adalah alat yang ampuh di tangan kanan. Di tangan yang salah, mereka dapat menyebabkan kode membingungkan dan sulit untuk debug.
LISP adalah pilihan berisiko bagi manajemen senior. Jika ada yang salah, tidak ada yang akan menyalahkan manajemen untuk memilih bahasa berorientasi objek populer yang didukung oleh perusahaan besar seperti Oracle atau Microsoft. Jauh lebih mudah untuk merekrut programmer dengan pengalaman dalam bahasa yang populer dan mudah dipelajari.
Bahkan perusahaan progresif yang bersedia menggunakan bahasa yang lebih kuat biasanya tidak memilih LISP. Ini karena banyak bahasa yang lebih baru mencoba dan berkompromi dengan meminjam fitur-fitur canggih dari LISP, sambil tetap mudah dipelajari untuk massa. Scala dan Ruby mengikuti model ini. Pemrogram yang buruk dapat mengambilnya dengan cepat dan terus menulis kode biasa-biasa saja yang sama yang mereka lakukan di Jawa. Pemrogram yang baik dapat memanfaatkan fitur yang lebih canggih untuk menulis kode yang indah.
Kurung bukan masalah. Haskell adalah bahasa yang sangat kuat dan ekspresif dengan sintaksis yang mirip dengan Python atau Ruby dan belum banyak diadopsi karena banyak alasan yang sama seperti LISP.
Terlepas dari semua ini, saya berharap ...
Clojure memiliki peluang untuk menjadi populer. Ini berjalan pada JVM, memiliki interop hebat dengan Java, dan membuat pemrograman bersamaan jauh lebih sederhana. Ini semua adalah hal penting bagi banyak perusahaan.
* Ini adalah perspektif saya sebagai programmer JVM profesional dengan pengalaman di Jawa, Clojure, JRuby, dan Scala.
sumber
Jika Anda percaya bahwa bahasa dipilih karena kelebihan teknisnya, Anda akan mengalami kekecewaan yang menghancurkan jiwa.
Keputusan seperti itu dibuat berdasarkan Penari Telanjang Dan Steaks . Microsoft mampu membelinya. Oracle bisa. Sun menghabiskan begitu banyak uang di Jawa sehingga mereka bangkrut. Dua kali. Komunitas sukarela yang terdesentralisasi, heterogen, tidak dapat bersaing dengan itu.
Lucunya, perusahaan Lisp mengatakan sebaliknya: mereka selalu memiliki lowongan kerja tetapi tidak dapat menemukan cukup banyak orang untuk mengisinya. (Hal yang sama berlaku untuk Haskell, ML, O'Caml, Forth, Smalltalk, ...)
sumber
Saya tidak punya pengalaman bekerja untuk perusahaan yang sebenarnya, tetapi saya tahu mengapa LISP sulit untuk saya gunakan.
Pertama-tama, ini mengingatkan saya pada posting blog ini: http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html
Masalah utama yang saya miliki dengan Lisp adalah pertanyaan "which Lisp". Saya biasanya bekerja di Linux sebagai platform utama saya, tetapi hal-hal yang saya buat harus kompatibel dengan Windows. Itu berarti bahwa ketika saya mengevaluasi suatu teknologi untuk digunakan, itu harus membuat hidup saya mudah ketika bekerja pada dua sistem operasi yang sangat berbeda. Saya tidak suka persyaratan ini, tetapi untuk menggunakannya pada proyek nyata itu adalah persyaratan. Sekarang saya akan menggunakan bahasa yang tidak memiliki dukungan yang sangat baik pada Windows untuk proyek sampingan pribadi saya, tetapi karena saya tidak pernah mendapatkan kesempatan untuk menulis proyek perangkat lunak besar di dalamnya, saya tidak memiliki pengalaman yang diperlukan.
Sekarang ketika saya mencoba untuk belajar bahasa fungsional, saya benar-benar ingin belajar Common Lisp. Sepertinya itu hal yang benar untuk dilakukan. Saya mulai membaca Praktis Common Lisp sebagai titik awal karena saya benar-benar tidak tahu fungsi bawaan dan membutuhkan proyek untuk dikerjakan di Lisp. Ekspresi S itu indah dan mudah. Semua tanda kurung itu sangat indah bagi saya karena jelas hari persis apa yang terjadi dalam kode.
Jadi saya mencoba menulis program pertama saya di Lisp di luar buku. Saya ingin alat baris perintah yang akan menghitung baris kode dan menghapus garis sepele dari jumlah kode. Bukan alat yang paling berguna, tapi menyenangkan untuk dilakukan. Ini melibatkan akses file, sedikit penguraian, dan penghitungan. Saya telah mengimplementasikan alat yang sama dengan Python sekitar seminggu sebelumnya.
Saya perlu mengakses argumen baris perintah. Lalu saya belajar tidak ada cara standar untuk mendapatkan argumen baris perintah. Itu semua fitur yang tidak standar. Ini bukan lintas platform sama sekali. Sebagian besar hanya menjadi lebih buruk dari sana karena bahasa tidak memiliki banyak perpustakaan yang dibangun ke dalamnya. Saya akhirnya beralih ke Haskell dan tidak terlalu jauh ke Common Lisp (jadi keluhan saya mungkin tidak valid).
Hal non-standar semacam ini selalu menyakitkan bagi saya di masa lalu. C ++ memiliki masalah yang sama, tetapi dengan perpustakaan seperti Boost, Anda dapat mengatasi kelemahan itu.
Juga tidak membantu bahwa sintaks Lisp untuk segala sesuatu selain ekspresi S sedikit jelek.
sumber
IMO, sebagian besar disebabkan oleh:
Hal-hal mulai terlihat sedikit lebih baik, terutama dengan Clojure yang ada.
sumber
Saya belajar LISP satu miliar tahun yang lalu di perguruan tinggi.
LISP, seperti FORTH, sangat bagus untuk logika. Tetapi kebanyakan pemrograman bukan tentang logika, ini tentang memanipulasi data dengan cara mekanis yang membosankan. Misalnya, pada saat itu tidak ada cara untuk membenarkan hasil numerik.
LISP adalah tentang fungsionalitas bersarang, dan orang tidak berpikir seperti itu. Mereka berpikir dalam hal DO A, B, C, D, lalu E. Tidak melakukan A, yang melibatkan melakukan B dan C, kemudian D dan E. Ini melibatkan semacam konkurensi yang membingungkan. Kecuali untuk tugas-tugas yang telah ditentukan seperti "mengajukan pengembalian pajak penghasilan", orang tidak berpikir secara bersamaan, mereka berpikir secara berurutan. Inilah sebabnya mengapa bahasa prosedural dominan saat ini.
Akibatnya, kode produral menyukai Java dan C dapat diterjemahkan ke dalam bahasa Inggris dengan mudah. Kode LISP tidak bisa; tidak ada bahasa manusia yang terstruktur dengan cara itu.
Jadi itu bagus untuk pemecahan masalah, tetapi pemecahan masalah tidak terlalu penting dalam pemrograman. Entri data, validasi, pemformatan keluaran, yang semuanya sangat lemah di LISP.
sumber
Saya pikir satu masalah dengan Lisp yang belum disebutkan adalah bahwa untuk programmer yang biasa-biasa saja atau pemula (seperti saya sendiri, saya akui dengan bebas), mungkin sulit untuk melihat bagaimana Anda mengubah kode Lisp menjadi program besar. Sangat mudah untuk menulis tetapi sulit untuk arsitek. Saya tidak berpikir salah satu konsep itu sangat sulit, tetapi mentalitas DIY sangat kuat sehingga saya sering merasa bingung harus mulai dari mana.
Dengan bahasa OOP seperti Java atau C #, Anda bisa menggunakan sistem tipe untuk mendorong diri Anda menuju model yang berfungsi, dan membangun itu. Dengan Lisp (atau Lua, atau Javascript, dalam hal ini) ada anggapan bahwa Anda dapat keluar dan melakukannya dengan cara apa pun yang Anda inginkan. Jika Anda menginginkan OOP, buat saja sistem OOP Anda sendiri! Kecuali membuat OOP Anda sendiri, atau mempelajari milik orang lain, adalah penghalang baru di atas bahasa sebelum Anda mendapatkan program yang dapat digunakan. Ditambah lagi, aku selalu merasa seperti OOP di Lisp atau Lua tidak benar-benar ada, seperti aku bisa mengabaikannya jika aku benar-benar menginginkannya, jadi apa gunanya?
Singkatnya, saya pikir pemrograman dalam Lisp membutuhkan banyak disiplin, dan itu sangat sulit didapat. Bahasa yang sangat diketik dan bahasa OOP keduanya menawarkan semacam disiplin bawaan, sehingga pemrogram dapat memfokuskan cadangan terbatas mereka pada penyelesaian proyek alih-alih mengutak-atik bahasa.
EDIT: Sebagai analogi yang baru saja mengejutkan saya, rasanya seperti jika Anda perlu melakukan pekerjaan kayu dan dua orang menawarkan Anda kotak alat mereka. Alat satu orang agak payah, tetapi pada dasarnya akan menyelesaikan pekerjaan dengan sedikit usaha. Orang lain memiliki tempat sampah yang besar, tetapi menjanjikan bahwa Anda dapat menggabungkan bagian-bagian itu untuk membuat alat terbaik yang pernah Anda gunakan, sangat cocok untuk genggaman Anda dan kualitas terbaik. Anda hanya harus membangunnya terlebih dahulu.
sumber
Saya telah lama bertanya-tanya hal yang sama, dan saya bahkan pergi ke konferensi Lisp untuk mencoba memahami apa "sisi gelap" Lisp yang membuat semua orang tidak mengadopsinya.
Saya tidak menemukan jawaban yang layak dan lengkap.
Ketidaktahuan mungkin menjadi alasan hilangnya popularitas, tetapi yang lebih membingungkan saya adalah bahwa siapa pun yang tahu pasti tentang Lisp (misalnya Google - Peter Norvig bekerja untuk mereka) tidak menggunakannya.
Satu-satunya penjelasan parsial yang saya kemukakan adalah bahwa sebagian besar ide-ide hebat Lisp sekarang sudah umum, satu-satunya yang sangat penting hilang (yang sangat penting IMO) adalah kemudahan metaprogramming.
Sayangnya saya tidak melihat cara mudah untuk mengadaptasi konsep ini untuk bahasa lain karena metaprogramming menjadi lebih baik membutuhkan bahasa homoikonik dan reguler (saya berbicara tentang metaprogramming umum, bukan versi template-only dumbed-down). Dengan kata lain pada dasarnya memerlukan pendekatan Lisp untuk sintaks: kode adalah data dan data adalah kode. Menulis kode dalam bahasa yang kaya sintaksis yang memanipulasi AST lebih sulit karena Anda perlu tahu dua bahasa: cara menulis kode dan cara menulis AST. Ini sangat sulit jika AST Anda diperbaiki dan juga kompleks dan tidak teratur dengan banyak jenis simpul yang berbeda. Sebagai gantinya, Lisp memiliki AST yang cukup teratur (dan dapat diperpanjang!) Dan Anda biasanya sudah membuat kode dengan langsung menulis AST.
Metaprogramming juga secara inheren lebih sulit (dan meta-metaprogramming bahkan lebih dan sebagainya) dan sebagian besar programmer dan manajer tampaknya hanya lebih suka jawaban "tidak ada yang membutuhkan itu".
Saya menemukan sangat sedih bahwa bahasa "baru" seperti
go
akhirnya menggunakan metaprogramming berbasis teks ketika diperlukan (generator kode eksternal menulis file teks) dan "ajaib" (yaitu kompiler dapat melakukan apa yang tidak dapat dilakukan oleh pemrogram).Saya pikir solusi untuk masalah kompleksitas adalah alat dan pendidikan yang kuat. Tren ini tampaknya bukan alat tumpul dan berpura-pura masalah tidak ada.
sumber
Tampaknya bahkan CL tidak memiliki dukungan perpustakaan yang sangat baik. Setidaknya menurut orang yang beralih dari Lisp ke Python:
http://www.redmountainsw.com/wordpress/archives/reddit-switches-from-lisp-to-python
Secara pribadi, saya tahu beberapa Skema dan menikmati bermain dengannya, tetapi tidak bisa membayangkan melakukan proyek non-sepele dalam bahasa itu.
sumber
Menjadi kuat tidak selalu menyiratkan penggunaan luas. Pernahkah Anda mendengar istilah 'Optimalkan untuk kasus umum'? Sayangnya seperti yang banyak diceritakan sebelum mediocrity jika dipastikan secara konsisten jauh lebih baik bagi orang daripada hit besar dengan banyak kegagalan di antara mereka.
Ini bukan hanya kasus dengan lisp, tetapi dengan banyak teknologi. Sentuhan yang baik pada alat pengolah teks Unix, awk, sed, perl dapat menghemat hari pemrograman. Sayangnya saya telah melihat orang membutuhkan waktu berhari-hari melakukan tugas-tugas semacam ini di alat lain dengan buruk apa yang bisa dilakukan dengan alat-alat ini lebih efisien dalam hitungan menit. Tetapi jika seseorang menghabiskan seluruh hidupnya dalam gerhana ia tidak akan pernah menghargai nilai dari hal-hal ini. Anda dapat menulis sebuah program besar dengan keterbacaan dan pemeliharaan dan semua itu, tetapi apa gunanya menulis program seperti itu sementara tidak menulisnya bisa dengan mudah melakukan pekerjaan itu.
Aspek lain saat merancang alat-alat hari ini seberapa berguna di luar kotak mereka menggunakannya secara langsung untuk memecahkan masalah. Anda tidak dapat membangun sesuatu yang terlalu umum dan kemudian mengatakan Anda akan melakukan lindung nilai semua itu melalui perpustakaan dan kerangka kerja. Agak sulit untuk menyelesaikan masalah dengan cara itu. Alat yang bagus cocok dengan lingkungan dan masalah di sekitarnya. Itu sebabnya alat-alat seperti php, perl dan awk terus tetap relevan meskipun tanpa henti-hentinya trolling dan bashing, karena mereka terlalu berguna untuk membuangnya dan seringkali mereka melakukan banyak pekerjaan daripada bahasa umum dengan banyak perpustakaan dan kerangka kerja yang dikunci.
Demikian pula Anda akan melihat bahasa seperti Java / Python sangat baik dan saya akan mengatakan yang terbaik untuk tugas-tugas tertentu. Python khususnya sangat baik dan mudah dipelajari dan ditulis. Bahasa-bahasa ini juga sangat baik jika titik akhir data Anda standar. Semacam database atau XML atau data semacam itu. Data pada dasarnya terstruktur.
Gangguan akan ada di sana untuk waktu yang lama, tetapi belum tentu meluas. Seperti yang akan Anda lihat, setiap alat memiliki ceruknya. Dan mereka memecahkan serangkaian masalah tertentu dengan sangat baik. Saya pikir dan saya yakin CIP melakukan baik di bidang dan masalah yang dirancang untuk menyelesaikan dengan baik.
sumber
Untuk pengembangan web dengan dialek Lisp, mungkin ada sedikit masalah ayam-dan-telur - karena sedikit orang yang menggunakan Lisp, host tidak mengizinkannya atau tidak membuatnya mudah, dan karena itu tidak mudah, beberapa orang Gunakan. Tetapi sebenarnya, menjalankan Lisp pada host bisa lebih mudah dari yang Anda kira, bahkan jika itu membutuhkan kerja lebih banyak daripada layanan PHP out-of-the-box mereka. Baru-baru ini saya mendapat aplikasi tipu daya Skema yang bekerja di sini hanya dengan sedikit usaha.
sumber
IMO, ini sebagian besar masalah waktu yang buruk: Lisp sudah tua (dan hampir secara definisi tidak lagi menarik) jauh sebelum menjadi praktis bagi kebanyakan orang atau pengguna. Clojure (misalnya) memiliki peluang yang jauh lebih baik. Keberhasilannya akan jauh lebih tergantung pada dianggap sebagai baru, modis dan keren daripada apa pun sepraktis interoperasi dengan Jawa (dan segala sesuatu yang berjalan di JVM) sekalipun.
sumber