Apakah Anda menggunakan (dialek) LISP untuk aplikasi dunia nyata? Di mana dan mengapa? [Tutup]

31

LISP (dan dialek seperti Skema, Common LISP dan Clojure) belum mendapatkan banyak dukungan industri meskipun bahasa pemrogramannya cukup baik. (Saat ini tampaknya mereka mendapatkan daya tarik).

Sekarang, ini tidak berhubungan langsung dengan pertanyaan, yang akan Anda gunakan dialek LISP untuk program produksi? Program apa dan mengapa? Penggunaan jenis yang diintegrasikan ke dalam beberapa kode lain (misalnya C) juga disertakan, tetapi perhatikan bahwa itulah yang Anda maksud dalam jawaban Anda. Konsep luas lebih disukai tetapi aplikasi spesifik juga oke.

Anto
sumber
6
Apakah emacs dianggap sebagai aplikasi "dunia nyata"? gnu.org/software/emacs/emacs-lisp-intro
S.Lott
1
@ S.Lott: Ya. Jika Anda menggunakan elisp untuk membuat ekstensi untuk Emacs, itu bagus dan aplikasi dialek LISP
Anto
GNU Guile ditujukan untuk tujuan ini.
1
Meskipun menarik, saya tidak berpikir pertanyaan ini cocok untuk situs ini lagi. Berbagai alasan: 1- terlalu luas, 2- mengundang daftar jawaban, 3- tidak ada cara yang jelas untuk memutuskan mana yang merupakan jawaban "benar", 4- terlalu terlokalisasi dalam waktu ("belum mendapatkan banyak dukungan industri"), 5- mengundang diskusi dan debat.
Andres F.

Jawaban:

18

Apakah Anda akan menggunakan dialek LISP untuk program produksi?

Benar

Program apa dan mengapa?

Lisp adalah bahasa dinamis tujuan umum. Saat ini, ia memiliki kesulitan dasar yang sama dengan bahasa dinamis tujuan umum lainnya yang tidak diterbitkan oleh Microsoft: Utas asli, integrasi GUI, operasi deterministik GC, dan jejak memori kecil.

Utas asli diraih oleh LispWorks dan SBCL, saya percaya. Mungkin orang lain Saya belum menyelidiki sepenuhnya.

LispWorks dan Franz Common Lisp - produk komersial - terintegrasi ke dalam GUI hingga tingkat keberhasilan. Tidak memiliki $$ untuk membelinya, saya tidak tahu seberapa baik kerjanya. Saya menduga mereka bekerja dengan sangat baik ...

Operasi GC deterministik dapat dilakukan (dilakukan di Jawa untuk beberapa tingkat keberhasilan), tetapi saya tidak tahu apakah sistem Lisp yang ada (yang dikelola) memiliki kode untuk melakukan itu.

Jejak memori kecil saya percaya dicapai oleh beberapa Lisps.

Poin dasar saya adalah, Common Lisp secara teknis siap membuat sistem produksi. Dan itu benar .

Sebagian besar pengembang takut dengan (memilih satu) bahasa dinamis, makro, tanda kurung, kurangnya IDE favorit, pengalaman buruk di perguruan tinggi, tidak banyak pekerjaan di dalamnya, dan kemudian tidak menggunakannya.

Secara pribadi saya akan melompat membangun sistem produksi penuh di Common Lisp dari awal di lingkungan tim.

sunting: Saya tidak benar-benar menjawab mengapa Lisp dibandingkan dengan bahasa lain.

Dalam pengalaman Lisp saya - tidak signifikan, tetapi jauh lebih dari 'hello world' - saya telah menemukan bahasanya sangat berguna setelah rasa sakit "bahasa baru Argh" pertama. Mayoritas bahasa cocok dalam mode yang sangat teratur dan cukup jelas sehingga saya tidak benar-benar menemukan bahasa lain untuk dioperasikan. Bagian dari ini adalah penggabungan ekspresi dan pernyataan. Bagian dari ini adalah tipe data daftar inti. Bagian dari ini adalah sistem tipe. Bagian dari ini adalah sistem makro. Tapi jangan salah paham, ada beberapa poin yang menyakitkan. Tapi mereka tidak menendang wajah saya sebanyak poin rasa sakit bahasa lain.

Salah satu contoh sederhana adalah rutin daftar panjang Python. Pendekatan Python adalah memanggil len(mysequence). Tetapi, jika kita memikirkannya, panjang adalah properti dari suatu urutan. Jadi, mysequence.len()itu ide yang lebih tepat. Lisp pada dasarnya menghilangkan perbedaan sintaksis itu. (length thing)adalah sintaks pemanggilan fungsi dan sintaks metode. Tentu saja, beberapa orang merasa frustasi dan menginginkan perbedaan sintaksis. Saya lebih suka memiliki keteraturan.

edit2: Saya mengonversi bagian dari tesis MS saya yang berjalan di desktop ke Common Lisp dan sangat menyenangkan untuk bekerja dengan sejauh ini.

Paul Nathan
sumber
2
Dari apa yang saya dengar, LISP memang digunakan dalam sistem produksi penuh, tetapi biasanya hanya untuk pemrosesan logika tertentu yang lebih mudah untuk dikodekan dalam LISP daripada bahasa lain. Video game AI dan pra-pemrosesan data statistik adalah contoh yang pernah saya kutip. Saya pernah punya manajer yang mengatakan "Setiap sistem yang cukup kompleks memiliki implementasi LISP setengah-setengah yang terintegrasi". Pepatah serupa adalah "Setiap sistem yang membengkak memiliki pembaca email bawaan".
FrustratedWithFormsDesigner
4
@ Frustasi: Ya, itu adalah Hukum ke-n Greenspun dan Hukum jwz.
Paul Nathan
2
Banyak dari ini diselesaikan oleh Clojure, hanya berdasarkan dirancang khusus agar kompatibel dengan dan pengganti Java. Tapi tentu saja, ada juga implementasi Skema dan CL untuk JVM juga (misalnya Kawa, ABCL).
Jörg W Mittag
4
Clojure agak menyebalkan bagi saya karena itu adalah fragmentasi lain.
Paul Nathan
fragmentasi bukanlah hal yang buruk. Yang benar-benar menyebalkan di Clojure adalah kurangnya pasangan bertitik. Bisakah itu dihitung sebagai bahasa seperti Lisp tanpa hal mendasar seperti itu?
SK-logic
11

Saya pribadi tahu orang yang menggunakan Lisp dalam bentuk Clojure di beberapa bank investasi dan perusahaan pemula di London. Saya juga memilih Clojure sebagai bahasa pengembangan utama untuk startup saya sendiri, jadi saya bersedia untuk menaruh uang saya di tempat mulut saya :-)

Saya telah menemukan itu menjadi pengalaman yang sangat mencerahkan untuk belajar Clojure selama setahun terakhir (setelah banyak pengalaman dengan Java dan C #). Alasan utama untuk ini adalah:

  • Ini memiliki penekanan yang cukup kuat pada pemrograman fungsional (lebih dari kebanyakan Lisps lainnya). Penulis dan BDFL Rich Hickey telah sering mengutip Haskell sebagai salah satu inspirasinya untuk desain bahasa yang berarti Anda mendapatkan hal-hal seperti struktur data yang sepenuhnya tidak berubah dan urutan tak terbatas yang malas, dll.
  • Metaprogramming makro - filosofi "kode adalah data" Lisp sulit untuk dipahami kecuali Anda benar-benar mengalaminya, tapi itu salah satu alasan mengapa Lisps sangat ekspresif dan produktif. Pada dasarnya Anda memiliki kekuatan untuk memperluas bahasa agar sesuai dengan domain masalah Anda.
  • Dukungan luar biasa untuk konkurensi multi-core - Saya sebenarnya berpikir Clojure adalah bahasa terbaik untuk pemrograman bersamaan saat ini. Lihat http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey untuk presentasi yang mencerahkan tentang ini
  • Pengembangan interaktif di REPL adalah cara yang hebat dan produktif untuk membangun aplikasi. Ini memberi Anda perasaan nyata kekuatan untuk secara dinamis mengubah kode aplikasi Anda yang sedang berjalan dan secara sistematis memeriksa struktur data hidup .....

Ini juga tampaknya menjadi pilihan praktis untuk penggunaan produksi nyata karena alasan berikut:

  • Berjalan di JVM dengan interoperabilitas Java yang sangat mudah memberi Anda akses ke semua perpustakaan dan alat di ekosistem Java
  • Anda menjalankan JVM yang merupakan platform yang telah dicoba dan diuji untuk aplikasi enterprise. Clojure mendapat manfaat dari semua fitur JVM yang bagus seperti kompilasi GC dan JIT yang sangat baik secara gratis.
  • Ini adalah bahasa yang dinamis secara default, yang membuatnya sangat nyaman untuk pengembangan dan pembuatan prototipe cepat dengan hampir tidak ada boilerplate. Namun Anda dapat menambahkan petunjuk tipe statis untuk mendapatkan kinerja yang cukup bagus di mana Anda membutuhkannya.
  • Ini adalah komunitas pragmatis dan membantu - jenis budaya di mana orang menyelesaikan sesuatu dan fokusnya adalah pada solusi yang dirancang dengan baik yang memecahkan masalah nyata
  • Ada dukungan alat di beberapa IDE . Saya pribadi menggunakan Eclipse dengan plugin Counterclockwise (karena saya memerlukan integrasi Java) tetapi ada banyak pilihan lain.
mikera
sumber
8

Saya akan menggunakan LISP jika itu adalah pilihan terbaik untuk pekerjaan itu. Hanya beberapa hal yang memengaruhi "pilihan terbaik":

  • dukungan vendor. Implementasi LISP yang kami gunakan - jika terjadi kesalahan dan mengganggu perkembangan kami dan dengan demikian tenggat waktu kami, akankah vendor bekerja menuju solusi bersama kami?
  • dukungan perpustakaan. Perpustakaan apa yang tersedia? Manipulasi string, matematika, akses data, servlets web (atau yang setara dengan LISP), windowing toolkit, dll ... Saya tidak ingin harus menulis hal ini dari awal.
  • dukungan alat - Seberapa baik IDE? Padat / stabil atau bersisik? Dukungan editor yang bagus? Debugger terintegrasi? Jika saya perlu melakukan dev GUI di LISP, apakah ada IDE visual atau apakah saya harus kode tata letak GUI dengan tangan (saya benci melakukan itu).
  • buy-in developer (saya benar-benar tidak ingin harus menghabiskan terlalu banyak waktu mengajar rekan tim saya bahasa baru)

Semua faktor ini harus dipertimbangkan ketika memutuskan apakah LISP sesuai untuk suatu proyek. Di dunia korporat, saya belum pernah mengalaminya.

FrustratedWithFormsDesigner
sumber
Saya setuju dengan Anda bahwa produktivitas seringkali lebih dipengaruhi oleh alat dan perpustakaan yang tersedia daripada oleh bahasa itu sendiri (asalkan bahasa tersebut menawarkan fungsionalitas dasar).
Giorgio
6

Benar. Paul Graham menjelaskannya dengan baik .

... Kembali pada tahun 1995, kami tahu sesuatu yang menurut saya tidak dipahami oleh pesaing kami, dan hanya sedikit yang mengerti sekarang: ketika Anda menulis perangkat lunak yang hanya perlu dijalankan di server Anda sendiri, Anda dapat menggunakan bahasa apa pun yang Anda inginkan. ..

Kami memilih Lisp. Untuk satu hal, jelas bahwa perkembangan yang cepat akan menjadi penting di pasar ini. Kami semua mulai dari awal, sehingga perusahaan yang bisa menyelesaikan fitur-fitur baru sebelum para pesaingnya memiliki keuntungan besar. Kami tahu Lisp adalah bahasa yang sangat baik untuk menulis perangkat lunak dengan cepat, dan aplikasi berbasis server memperbesar efek perkembangan yang cepat, karena Anda dapat merilis perangkat lunak begitu itu selesai.

Jika perusahaan lain tidak ingin menggunakan Lisp, itu jauh lebih baik. Itu mungkin memberi kita keunggulan teknologi, dan kami membutuhkan semua bantuan yang bisa kami dapatkan ...

Jadi bisa dibilang menggunakan Lisp adalah percobaan. Hipotesis kami adalah bahwa jika kami menulis perangkat lunak kami di Lisp, kami akan dapat menyelesaikan fitur lebih cepat daripada pesaing kami, dan juga untuk melakukan hal-hal dalam perangkat lunak kami yang tidak dapat mereka lakukan. Dan karena Lisp sangat tinggi, kami tidak perlu tim pengembangan besar, sehingga biaya kami akan lebih rendah. Jika demikian, kami dapat menawarkan produk yang lebih baik dengan uang lebih sedikit, dan tetap menghasilkan untung. Kami pada akhirnya akan mendapatkan semua pengguna, dan pesaing kami tidak akan mendapatkan apa-apa, dan akhirnya keluar dari bisnis. Lagipula itulah yang kami harapkan akan terjadi.

Apa hasil percobaan ini? Agak mengherankan, ternyata berhasil. Kami akhirnya memiliki banyak pesaing, dengan urutan dua puluh hingga tiga puluh dari mereka, tetapi tidak satu pun dari perangkat lunak mereka yang dapat bersaing dengan kami. Kami memiliki pembuat toko online wysiwyg yang berjalan di server dan terasa seperti aplikasi desktop. Pesaing kami memiliki skrip cgi. Dan kami selalu jauh di depan mereka dalam hal fitur. Terkadang, dengan putus asa, pesaing akan mencoba untuk memperkenalkan fitur yang tidak kita miliki. Tetapi dengan Lisp, siklus pengembangan kami sangat cepat sehingga kami terkadang dapat menduplikasi fitur baru dalam satu atau dua hari dari pesaing yang mengumumkannya dalam siaran pers. Pada saat wartawan yang meliput siaran pers menelepon untuk menghubungi kami, kami akan memiliki fitur baru juga.

Tampaknya bagi para pesaing kami bahwa kami memiliki semacam senjata rahasia - bahwa kami sedang memecahkan kode lalu lintas Enigma mereka atau sesuatu. Sebenarnya kami memang memiliki senjata rahasia, tetapi itu lebih sederhana dari yang mereka sadari. Tidak ada yang membocorkan fitur mereka kepada kami. Kami hanya dapat mengembangkan perangkat lunak lebih cepat dari yang diperkirakan orang ...

kevin cline
sumber
8
"... Paul Graham awalnya menulis reddit, dalam bahasa Inggris, di belakang serbet ketika dia sedang menunggu kopi. Itu sangat kuat sehingga harus ditulis ulang dengan python hanya agar komputer biasa dapat memahaminya. Karena itu ditulis dalam lisp hampir tidak ada upaya untuk menulis ulang seluruh hal, dan menulis ulang diselesaikan di antara dua siklus prosesor Paul Graham sendiri sepenuhnya ditulis dalam lisp, oleh versi sebelumnya dari dirinya, juga ditulis dalam lisp, oleh versi sebelumnya dari lisp. Ini lisp, paul graham, lisp, paul graham, semuanya. "
John Cartwright
5

Di mana: Emacs adalah aplikasi dunia nyata yang menggunakan LISP.

Mengapa: Ini adalah cara yang bagus untuk mengekspresikan pemetaan antara penekanan tombol dan tindakan. Ini ditafsirkan dan cepat dan didefinisikan dengan baik dan sederhana.

S.Lott
sumber
Saya akan memperluas jawaban ini dengan mengatakan mengapa itu baik untuk mengekspresikan pemetaan antara ketstrokes dan tindakan
Anto
@Anto: Dalam pengalaman saya, Lisp membuatnya sangat mudah untuk membuat abstraksi yang kuat yang dapat secara transparan mewakili setiap tindakan yang dapat Anda lakukan dalam editor dengan cara yang sangat konsisten - setelah menggunakan Emacs sebentar, Anda dapat menebak bagaimana hampir semua hal dilakukan . Hal ini memungkinkan untuk memetakan apa pun yang dapat Anda lakukan di editor ke stroke kunci, dengan masing-masing penjilidan tampak sangat mirip dengan penjilidan lainnya sehingga membuatnya lebih mudah untuk ditulis dan lebih mudah untuk dipelihara.
Tikhon Jelvis
4

Baik Macsyma dan Autocad didasarkan pada dialek Lisp. Saya akan mengklasifikasikan mereka sebagai 'dunia nyata' serta Emacs.

Joris Geer
sumber
Mathematica tidak didasarkan pada Lisp.
Rainer Joswig
2
AutoCAD menawarkan AutoLISP sebagai API tetapi ditulis dalam kode yang dikelola C ++ & .NET.
CAD kokang
1
@RainerJoswig Macsyma mungkin dimaksudkan sebagai ganti Mathematica.
user40989
2

Tentu saya akan mempertimbangkannya. Terutama untuk pekerjaan pengembangan baru yang memiliki beberapa potensi komputasi paralel. Itu tampaknya menjadi titik manis untuk jenis bahasa fungsional ini.

Dave Kincaid
sumber
2

Lisp adalah salah satu pilihan terbaik untuk mengimplementasikan kompiler. Dan, karena penggunaan DSL dan eDSL meningkat sekarang, Lisp menjadi lebih berharga. Saya menggunakan dialek Lisp untuk semua tugas terkait DSL saya.

Logika SK
sumber
0

Saat ini saya sedang mencoba menggunakan newLisp sebagai pengganti Php di situs web pribadi saya melalui Dragonfly kerangka . Jika saya bisa mencari cara untuk membuat Apache bermain bagus, saya akan menggunakannya (server web bawaan bekerja dengan sangat baik, tetapi saya lebih suka bekerja melalui Apache). Dan begitu itu terjadi, saya akan menggunakan newLisp di mana saja saya akan menggunakan Php, karena saya datar tidak suka Php dan saya suka newLisp.

Saat ini, Clojure bukan pilihan yang baik untuk aplikasi Android, tapi saya tahu orang-orang sedang mengerjakannya. Jadi jika itu diketahui, itu akan menjadi tempat lain untuk saya akan menggunakan dialek Lisp untuk aplikasi dunia nyata ... tapi sekali lagi, ini karena saya hanya tidak suka Java.

Tapi jujur, saya lebih suka Ruby daripada Lisp ... tapi ini sebagian besar masalah komunitas dan dokumentasi.

philosodad
sumber
0

Saya menerapkan aplikasi komersial berpemilik di Common Lisp yang disebut Tankan yang berjalan pada Microsoft Windows sebagai executable asli.

Ini adalah program untuk melatih diri Anda untuk menghafal karakter kanji Jepang.

Program ini berjalan sebagai server HTTP latar belakang. Eksekusi server ini dan menavigasi ke halamannya, dikoordinasikan oleh aplikasi ikon area notifikasi sistem kecil (alias "Baki") yang saya kembangkan menggunakan Visual C ++.

Aplikasi ikon baki kecil ini memulai, memantau dan menghentikan server berbasis Lisp, dan berkomunikasi dengannya menggunakan pipa Win32 yang terikat pada input dan output standarnya. Melalui pipa, server Lisp menginformasikan aplikasi ikon baki dari URL yang tepat dengan nomor port yang tepat, dan aplikasi ikon baki itu dapat meluncurkan browser melalui API Shell untuk menelusuri URL itu. Pengguna hanya mengklik dua kali pada ikon untuk membuka UI.

Program Lisp mempertahankan dalam memorinya keadaan sesi yang cukup kompleks yang berisi riwayat masukan pengguna dan berbagai hubungan di antara berbagai objek. Notasi objek melingkar Lisp (diaktifkan oleh *print-circle*variabel) dan cara kerjanya di custom CLOSprint-object metode adalah bantuan luar biasa dalam menerapkan kegigihan: pengguna dapat menyimpan status ke disk dan melanjutkan di mana mereka tinggalkan. Semuanya disimpan, termasuk keadaan UI. Ada banyak substruktur bersama dalam grafik objek, serta siklus. Plus, banyak cruft statis yang tidak harus bertahan, seperti konten objek entri kamus. Dengan metode ANSI Common Lisp custom print object, Anda dapat membuat representasi tercetak kental untuk objek yang dapat dibaca dengan mesin,

Hampir tidak ada JavaScript yang digunakan di UI web. Bahkan kontrol untuk menyembunyikan dan menampilkan bagian-bagian UI dilakukan dengan mengirimkan formulir dan merender ulang HTML. Setiap detail dari keadaan UI karenanya di server dan bertahan saat pengguna menyimpan. Pembuatan ulang HTML sangat cepat. Ini dilakukan oleh ekspresi backquote Lisp raksasa yang memberi makan makro penghasil HTML. Kode yang dikompilasi oleh Clozure Common Lisp (CCL) membuat ini terjadi begitu cepat sehingga Anda hampir tidak menyadari bahwa ketika Anda mengklik tombol [+] pada UI untuk membuka sesuatu, Anda mengirimkan permintaan ke server yang membuat ulang seluruh halaman darn, dan tidak hanya menjalankan beberapa JavaScript lokal untuk mengubah visibilitas elemen dokumen lokal.

Program ini awalnya dikembangkan dengan CLISP. Berkat ANSI CL menjadi bahasa standar, dengan implementasi yang sesuai dengan baik dan tidak terlalu banyak jebakan licik dalam bahasa (perilaku "tidak terdefinisi" atau "ditentukan-implementasi") dengan mudah dipindahkan ke CCL.

CLISP belum ditinggalkan; masih digunakan untuk menyalakan ujung belakang lisensi, menggunakan banyak basis kode umum yang sama.

Saya mengembangkan sistem lisensi asli untuk program, menggunakan cryptto curve eliptik yang disediakan oleh perpustakaan IronClad, yang digunakan oleh server lisensi untuk menandatangani lisensi untuk mengesahkannya. (Sepertinya saya ingat saya mungkin telah menggunakan program command line OpenSSL untuk menghasilkan parameter EC untuk kunci server.)

Lisensi direpresentasikan sebagai objek Lisp. Ini adalah penghargaan untuk portabilitas Lisp yang program Windows yang disusun oleh Clozure Common Lisp dapat menghasilkan lisensi berbasis ekspresi-S, program CLISP yang berjalan pada server Debian dapat mengisi bidang tanda tangan digital yang hilang di objek itu, dan mengirimkannya kembali ke program Windows yang dapat memvalidasi tanda tangan.

Di server, selain layanan lisensi berbasis CGI, saya menggunakan API baris perintah sederhana untuk mengelola lisensi. Anda dapat membuat daftar lisensi, menemukan yang spesifik, dan mengedit atributnya: seperti misalnya mengedit tanggal kedaluwarsa lisensi sementara untuk memberikan pengecualian kepada pengguna. Back-end lisensi juga menghasilkan email. Saya tidak menggunakan pustaka untuk penanganan CGI di sisi server: hanya linting kode tangan untuk berurusan dengan variabel lingkungan Apache dan argumen baris perintah. (Meskipun kode perpustakaan digunakan untuk menangani penyandian URL dan pembuatan HTML.) Tidak ada database yang digunakan untuk penyimpanan; lisensi dipatenkan menjadi file yang dipanggil licenses.lispdan hanya itu.

Kaz
sumber
-1

Jika seseorang membayar saya, tentu saja.

Mereka mungkin akan lebih tertarik membayar seseorang yang tahu bahasa itu. Saya hanya bermain dengan elisp dan skema beberapa kali.

Edward Strange
sumber