Lisp jelas merupakan keuntungan untuk hal-hal AI , tetapi tidak tampak bagi saya bahwa Lisp lebih cepat daripada Java, C #, atau bahkan C. Saya bukan penguasa Lisp, tetapi saya merasa sangat sulit untuk memahami keuntungannya orang akan menulis perangkat lunak bisnis di Lisp.
Namun itu dianggap sebagai bahasa peretas.
Mengapa Paul Graham menganjurkan Lisp? Mengapa Perangkat Lunak ITA memilih Lisp daripada bahasa tingkat tinggi lainnya? Nilai apa yang dimilikinya atas bahasa-bahasa ini?
Jawaban:
Ada beberapa alasan mengapa saya berupaya untuk menjadi kompeten dengan Common Lisp.
Arguably satu-satunya alasan nyata untuk memilih terhadap Common Lisp adalah bahwa perpustakaan standar diberi tanggal.
Saya akan mengambil risiko dan mengatakan bahwa dalam kasus umum, sintaksis seharusnya tidak menjadi masalah bagi pekerja perangkat lunak profesional.
sumber
Saya suka Lisp untuk itu
Pemrograman adalah memerangi kompleksitas. Abstraksi adalah satu-satunya alat yang efektif untuk memerangi kompleksitas yang semakin meningkat (dengan ukuran tengkorak kami yang sangat terbatas dan konstan). Mengelola abstraksi dengan Lisp seperti memiliki jin dengan keinginan n +1.
sumber
(+ 1 n)
keinginan, atau lebih praktis lebih bijaksana(incf n)
?Saya percaya jawaban Lisp yang benar lebih gnomic. Sesuatu seperti: "Jika Anda harus bertanya, Anda belum siap."
Lalu jika ada yang bertanya lebih lanjut, jawaban yang benar adalah "ya" jika itu adalah pertanyaan "baik" atau "Anda belum siap."
sumber
Saya pikir bahwa keuntungan Lisp dalam bidang kecerdasan buatan (AI) yang semua orang sebutkan adalah kecelakaan historis ... Lisp dimulai untuk / dalam AI, tetapi ini adalah bahasa tujuan umum.
Saya percaya kecepatan eksekusi bukan satu-satunya aspek penting dari sebuah bahasa (saya pernah melakukannya sekali). Namun, salah satu aspek yang saya sukai tentang Lisp adalah bagi saya, itu menggabungkan Python dan C dalam satu. Saya dapat mulai kode tanpa deklarasi dan prototipe segera dan sangat cepat (runtime dan REPL sangat penting untuk ini). Setelah saya menjalankan sesuatu, saya menambahkan deklarasi tipe dan "mengoptimalkan" kode saya, sedikit demi sedikit. Mengagumkan untuk menekan tombol SLIME dan menonton bahasa mesin yang dihasilkan untuk fungsi yang saya minati. Dengan Python, tidak ada deklarasi tipe, jadi saya tidak bisa mendapatkan lebih banyak kecepatan, tetapi dalam C, menyelesaikan apa pun dengan cepat adalah jauh lebih menyakitkan. Lisp sangat berguna dalam hal ini.
Karena itu, saya suka Lisp terutama karena makro . Ketika Anda akhirnya mengerti apa yang bisa dicapai makro, saya pikir Anda dengan mudah memasang tanda kurung. Juga, editor seperti Emacs mengelola tanda kurung sendiri sehingga Anda tidak perlu melakukannya. Saya akui, bagaimanapun, bahwa saya tidak menemukan tanda kurung seburuk itu pada awalnya, dan saya tahu beberapa orang tidak tahan. Tetapi karena seluruh tujuan makro adalah untuk menghasilkan kode pada waktu kompilasi, kode dalam Lisp menggunakan struktur data standar, dan tanda kurung hanyalah representasi kode sebagai daftar, yang diperlukan untuk membuat makro mudah ditulis.
Saya tidak tahu bahasa lain di mana Anda bisa menulis sedikit bahasa kecil untuk menggambarkan masalah Anda lebih baik dengan kemudahan Lisp. Itulah keuntungan yang dibicarakan oleh Paul Graham dalam Beating the Averages . Ini adalah modularitas ekstrim dan keringkasan. Di Jawa saya harus menulis banyak teks mentah untuk mengekspresikan satu ide. Di Lisp saya bisa menulis beberapa makro yang menghasilkan kode itu secara otomatis, dan setelah itu gunakan saja. Bagaimanapun, Anda harus memahami beberapa contoh dari ini dan kemudian menilai sendiri. Ketika saya "melihatnya", saya terpesona, dan saya masih berpikir Lisp adalah bahasa terbesar untuk alasan ini saja. Saya selalu mencari makro dalam bahasa umum untuk melihat apakah mereka cocok dengan kekuatan Lisp macro, tetapi sampai saat ini saya tidak menemukannya. Keempat dekat kedua.
Saya akan menyelesaikan dengan beberapa kritik, terkait dengan perangkat lunak bisnis:
Perangkat lunak bisnis membutuhkan perpustakaan, dan yang bagus, dan Lisp tidak pandai dalam hal ini. Saya biasanya tidak membutuhkannya, tetapi ketika saya melakukannya, saya harus memilih dari beberapa pilihan perangkat lunak tidak lengkap yang digunakan beberapa orang. Saya harus berkontribusi untuk memperbaiki ini, saya kira ...
Perangkat lunak bisnis biasanya dibangun oleh kelompok besar orang, dan saya pikir komunikasi dapat terhambat dengan makro, karena mereka pada dasarnya mengubah bahasa. Banyak pemrogram lebih nyaman mendeteksi pola-pola tertentu dalam kode, bahkan jika teks program lebih panjang dan lebih berulang. Saya kira di ITA mereka memiliki beberapa aturan tentang makro atau mereka memiliki perpustakaan makro besar yang membuat kolaborasi mudah (atau, lebih sederhana, semua programmer adalah pakar Lisp).
sumber
Saya tidak suka Lisp.
(Saya suka banyak konsep yang digunakannya, bagaimana itu membuat teknik yang kuat tersedia secara asli, dan sebagainya.
Tetapi saya tidak pernah yakin untuk benar-benar menggunakannya, ((walaupun beberapa orang telah mencoba ) karena manfaat dari bahasa tersebut dapat dicapai dengan bahasa pemrograman lain (beberapa secara langsung, beberapa secara tidak langsung), jadi tidak ada cukup manfaat untuk membuat saya menghabiskan waktu mempelajarinya dan bertahan dengan sintaks yang mengerikan.)))
Tapi ya, untuk alasan beberapa orang menyukainya, lihat pertanyaan Stack Overflow ini:
Mungkin ada beberapa lagi dalam pertanyaan terkait untuk itu juga.
sumber
Saya akan menafsirkan "Lisp" sebagai " Common Lisp "; Saya tidak ragu jawaban lain akan mengatakan " Skema ". (Petunjuk: Lisp adalah keluarga bahasa.)
Apa artinya "lebih cepat"? Dalam hal waktu yang dibutuhkan untuk menjalankan patokan, tidak, ini tidak lebih cepat dari C ( tapi bisa jadi ).
"Cepat" dalam jangka waktu berapa lama Joe Random Hacker menulis program kerja, atau memperbaiki bug di sistem perangkat lunak besar? Hampir pasti.
Adapun peretas ini , saya menggunakannya karena saya ingin menulis kode, bukan boilerplate. Saya ingin menulis sesuatu sekali , dan tidak mengulangi diri saya sendiri. Dan saya ingin berinteraksi dengan program sementara saya menulisnya.
sumber
M-x eval-region
(ataueval-buffer
), tapi hanya itu.C-j
(yang secara moral setara untuk masuk) dan itu akan segera berlaku.Saya suka Lisp karena ini adalah media yang sangat baik untuk mengekspresikan pikiran saya. Predikat untuk bahasa favorit saya adalah "Jika saya dapat memilih sesuatu untuk mengekspresikan ide, apakah itu?". Saat ini Lisp * ( Skema lebih spesifik), sampai-sampai saya menemukan diri saya menulis catatan pemrograman di dalamnya. Seperti IRL , kertas dan pulpen. Bahkan ketika saya sedang berpikir tentang program saya perlu menerapkan dalam PHP atau Ruby atau Python.
Ini bukan trik yang saya pelajari sendiri, atau sesuatu yang saya lakukan untuk kredibilitas culun (tidak ada yang bisa melihat bagian dalam buku catatan saya); hanya saja Lisp jauh lebih alami bagi saya untuk berpikir daripada salah satu alternatif, dan bahasa apa pun yang beresonansi dengan Anda yang mendalam adalah yang Anda hargai.
* Sama seperti catatan kaki, Haskell menutup celah dengan cepat ketika saya belajar lebih banyak tentang itu.
sumber
Masalahnya adalah kekuatan. Daya = Bekerja (fungsionalitas program) / Waktu
Plot semacam kurva antara C ++ dan Java. Terus berjalan, dan pada titik tertentu Anda akan menemukan Lisp.
sumber
Paul Graham semacam menjawab sendiri pertanyaan ini dalam What Made Lisp Different .
Perlu diingat dia menggunakannya untuk startupnya selama pertengahan 1990-an, jadi Python dan Ruby tidak benar-benar matang pada saat itu (atau mungkin bahkan tidak dilahirkan).
Lisp pada dasarnya memiliki semua keunggulan bahasa dinamis, dan saya pikir untuk sebagian besar aplikasi web saat ini, Python dan Ruby cukup mengagumkan, dan mereka memiliki keunggulan kerangka kerja dan dokumentasi serta komunitas yang dinamis.
Fitur pembunuh mungkin seluruh program dibuat dari ekspresi. Ini berarti Anda dapat menyortir blok kode ke fungsi (atau makro ...), karena satu blok kode tidak lebih dari ekspresi.
Python sebenarnya tidak memiliki fitur ini; Anda harus mendefinisikan fungsi dan menyebarkannya. Ruby tampaknya memiliki blok, mungkin agak terbatas dibandingkan dengan apa yang dapat dilakukan Lisp (saya tidak yakin).
sumber
Saya telah memiliki reaksi spontan terhadap Skema di masa lalu, tetapi sekarang saya siap untuk memberikan Lisp ( Clojure , sebenarnya) tembakan.
Anda tahu, selama bertahun-tahun saya mengambil sedikit bahasa seperti Java, C #, C ++, Python, dan banyak hal tidak lagi menantang.
Clojure memiliki banyak janji, tampaknya sangat bersih, dan dapat menyelesaikan banyak masalah di dunia nyata. Kasus kuat untuk bahasa yang bersih seperti Clojure adalah munculnya komputer multi-core.
Yay LISP!
EDIT: Perangkat Lunak ITA didirikan oleh lulusan MIT, dan Skema / Lisp adalah satu-satunya bahasa yang dipelajari banyak lulusan MIT. Agar adil, orang dapat hot-swap algoritma Lisp pada sistem produksi yang berjalan, yang merupakan nilai tambah besar.
sumber
INTERCAL
. Tantangan bukan satu-satunya kriteria; itu harus mampu menyelesaikan masalah nyata dengan cepat juga. Setidaknya Haskell digunakan dan dicintai oleh banyak orang.PLEASE
?Hal yang saya sukai tentang Lisp adalah bahwa ia melampaui paradigma. Beberapa orang akan mengatakan bahwa Lisp fungsional, yang lain akan mengatakan itu deklaratif, dan yang lain akan mengatakan itu multi-paradigma. Saya pikir semua ini melewatkan intinya. Saat Anda menggunakan Lisp, paradigma tidak lagi menjadi kendala.
Ingin benda? Kamu bisa memilikinya. Ingin pemrograman fungsional? Kau bisa memilikinya. Ingin pemrograman logika gaya- Prolog ? Tulis beberapa makro. Ingin pemrograman deklaratif gaya-SQL? Lakukan untuk itu. Ingin menggunakan beberapa paradigma yang belum ditemukan? Saya yakin itu bisa dilakukan di Lisp.
Selain bahasa-bahasa yang mirip- Keempat , saya belum melihat bahasa lain menawarkan tingkat fleksibilitas ini.
sumber
"Lebih cepat" bukan hal yang mudah untuk diukur - itu benar-benar tergantung pada aspek mana yang Anda tolak. Bergantung pada tugas dan implementasi Lisp, kecepatan dapat mendekati C. Lihat Great Benchmarking Shoot-Out untuk melihat detailnya. Implementasi SBCL dari Lisp setara dengan Java 6 Server dan secara signifikan lebih cepat daripada Ruby atau Python.
Tapi, kecepatan murni bukan alasan utama untuk memilih bahasa pemrograman - jika ya, kita semua masih akan pemrograman dalam bahasa assembly , kan? Bagi saya, kegembiraan sehari-hari Lisp adalah bahwa kode tersebut dikompilasi, tetapi saya tidak harus menghapus aplikasi, mengkompilasi ulang semuanya, dan kemudian mulai berlari dari awal. Sebagai gantinya, saya dapat mengubah satu fungsi dan perubahan itu akan berpengaruh di mana-mana, dan saya dapat segera melihat efeknya di aplikasi saya. Selain itu, pendekatan "tulis, tes, tulis lebih banyak, tes lebih" yang sangat cepat membuatnya lebih mudah untuk menguji segera di depan saat menulis kode (dan kemudian Anda dapat mengubah probe interaktif menjadi unit test nanti).
Bayangkan menulis email di mana setelah setiap baris, Anda harus menekan tombol untuk mengkompilasi output email Anda ke layar sebelum melanjutkan pemikiran Anda. Itulah yang menulis di Jawa atau bahasa lain seperti itu bagi saya. Terkadang ada alasan untuk melakukan itu, dan saya suka Java baik-baik saja, tetapi Lisp lebih responsif, dan lebih mudah menyelesaikan pekerjaan.
sumber
Saya belajar Lisp ( newLisp ) karena beberapa alasan.
Alasan nomor satu: Lisp membuat saya berpikir secara berbeda, yang membuat saya menjadi pembuat kode Ruby yang lebih baik.
Tampaknya sangat canggung untuk melakukan hal-hal dengan cara tertentu di Lisp, misalnya iterasi bersarang untuk melewati beberapa daftar. Jadi itu memaksa saya untuk menggunakan hal-hal lain, seperti
map
. Bahasa favorit saya, Ruby, memiliki metode peta yang sama, tetapi saya tidak selalu menggunakannya, karena itu tidak dikenal: Saya belajar melakukan hal-hal menggunakan teknik yang buruk, dan ketika bahasa mendukung teknik itu, saya terus menggunakannya.Alasan kedua: Lisp praktis dan memiliki perpustakaan modern yang bagus.
Ada kerangka kerja web yang sangat bagus dan ringan untuk newLisp yang disebut capung . Ini memungkinkan saya untuk menggunakan kode newLisp alih-alih PHP untuk beberapa tugas. Saya tidak terlalu suka PHP, dan newLisp sepertinya lebih menyenangkan untuk tugas khusus ini daripada Ruby.
Alasan nomor tiga: Lisp secara sintaksis dan konseptual konsisten.
Bagi saya, ini adalah perbedaan besar antara Ruby dan Python, konsistensi.
sumber
Bisakah Anda mengatakan "Loyalitas Merek"?
Saya mulai di Fortran. Saya menyukainya.
Saya beralih ke Lisp. Awalnya saya membencinya. Kemudian saya belajar untuk menyukainya, dan membenci Fortran.
Kemudian Pascal, C, C ++, berbagai assembler, C #. (Sebenarnya saya tidak suka C #.)
Saya kira saya berubah-ubah?
sumber
Ketika Lisp dibuat mereka mulai dari matematika, bukan ilmu komputer (yang belum benar-benar ada). Dan tim Lisp melakukan beberapa hal yang BENAR-BENAR benar. Lisp memiliki pengumpulan sampah pada tahun 1960 atau lebih! Mereka benar-benar melakukan pekerjaan dengan baik.
Saya pikir lagu The Eternal Flame menutupinya.
sumber
Yang menarik adalah komunitas. Lisp memiliki hasil imbang untuk pengembang yang paling ambisius dan cerdas sejak bahasa diciptakan. Di mana pun periset berusaha memecahkan masalah yang belum pernah dipecahkan, Anda mungkin akan menemukan Lisp, seperti dalam penelitian kecerdasan buatan (AI), visi komputer, perencanaan, representasi pengetahuan, dan optimalisasi heuristik yang kompleks. Bahasa ini cocok untuk memecahkan masalah baik dari bawah ke atas dan dari atas ke bawah pada saat yang sama, yang tampaknya membantu dalam menghadapi tantangan paling hairiest.
Sintaks yang layak melalui makro berarti bahwa jarang ada kebutuhan untuk memperluas definisi bahasa. Sebagian besar dari apa yang membutuhkan ekstensi bahasa dalam bahasa yang lebih terbatas hanyalah makro dari Lisp. Jadi programmer Lisp bebas untuk menggunakan konsep bahasa yang baru ditemukan tanpa standar bahasa baru dan tanpa harus penalti kecepatan nyata. Pada tingkat dasar, rim kode boilerplate dibuat tidak perlu oleh ekstensi kecil. Seluruh ide baru dalam aliran kontrol, seperti penyatuan gaya Prolog, diimplementasikan secara efisien dan kompak sebagai ekstensi.
Sistem OOP, CLOS , berada dalam kelas tersendiri dalam hal fleksibilitas. Sangat sulit untuk kembali ke dasar C ++ / Java / C # OOP setelah merasakan. Pola desain GoF 5 menjadi tidak perlu karena dapat diekspresikan secara sederhana dan langsung.
Bahasa tidak memiliki pemilik perusahaan tunggal dan tidak ada implementasi definitif tunggal, meskipun bahasa tersebut memiliki standar ANSI dengan banyak implementasi yang sesuai. Implementasi besar baru datang setiap dekade dan yang lama masih cukup aktif. Para ahli dapat merencanakan untuk menggunakan pengetahuan khusus mereka untuk waktu yang lama. Ini memang menyebabkan beberapa gesekan anarkistik dan fragmentasi komunitas, tetapi itu juga berarti karpet tidak dapat ditarik keluar dan bahasa tidak dapat menjadi hampir mati karena alasan politik perusahaan atau proyek. Selalu ada beberapa implementasi komersial dan open source yang sedang dikerjakan. Semakin fokus pada kinerja, secara teratur patokan dalam faktor 2x dari implementasi bahasa imperatif yang paling cepat didanai.
Tumit Achilles dari komersialisasi Lisp awal adalah jejak memori untuk mengakomodasi fitur keamanan jenis bahasa dan lingkungan pengembangan perangkat lunak canggih yang mereka sertakan, dengan fitur luar biasa seperti dokumentasi online lengkap termasuk gambar. Mesin Lisp Symbolics 64 MB tidak layak secara biaya terhadap workstation Sun 8 MB. Saat ini, harga RAM telah runtuh dan ada minat yang luar biasa pada bahasa Lisp terutama mengingat bahwa bahasa utama Java, C #, PHP saat ini hanya maju sedikit dibandingkan dengan 30 tahun yang lalu.
Ada bahasa modern sekarang dalam persaingan dengan Lisp untuk berbagi pikiran dengan pengembang cerdas: Python, Lua , Erlang , Haskell , dan OCaml . Tetapi tidak ada yang menawarkan campuran kematangan, adaptabilitas, implementasi dan kecepatan yang memenuhi standar yang sama.
sumber
Saya sebenarnya tidak melakukan Lisp. Tapi tempat saya bekerja membuat elemen hingga dengan jutaan garis terutama Fortran. Orang di sini yang paling saya hormati tentang hal-hal komputasi (kode mekanika fluida komputasi ) menganggap kombinasi ideal adalah Lisp di luar (terutama karena Anda menghindari masalah berantakan dengan manajemen memori), dan Fortran untuk algoritme tingkat rendah (Fortran yang terbaik untuk mengeksploitasi kemampuan vektor SSE / AVX , dan kami pikir petunjuk ini tidak mungkin ditutup).
sumber