Gelar sarjana saya adalah Ilmu Kognitif dan Kecerdasan Buatan. Dari situ saya punya intro satu arah ke Lisp. Saya pikir bahasanya menarik (seperti dalam "elegan") tetapi tidak terlalu memikirkannya sampai saya menemukan Peraturan Kesepuluh Greenspun jauh kemudian:
Setiap program C atau Fortran yang cukup rumit berisi implementasi ad hoc, dispesifikasikan secara informal, ditanggulangi, lambat dari separuh Common Lisp.
Poin Greenspun adalah (sebagian) bahwa banyak program kompleks memiliki penafsir bawaan. Daripada membangun penerjemah menjadi bahasa yang ia sarankan, mungkin lebih masuk akal untuk menggunakan bahasa seperti Lisp yang sudah memiliki interpreter (atau kompiler) bawaan.
Pada saat itu saya sedang mengerjakan aplikasi yang agak besar yang melakukan perhitungan yang ditentukan pengguna menggunakan penerjemah khusus untuk bahasa khusus. Saya memutuskan untuk mencoba menulis kembali intinya di Lisp sebagai percobaan skala besar.
Butuh sekitar enam minggu. Kode asli adalah ~ 100.000 baris Delphi (varian Pascal). Di Lisp dikurangi menjadi ~ 10.000 baris. Yang lebih mengejutkan adalah fakta bahwa mesin Lisp 3-6 kali lebih cepat. Dan perlu diingat bahwa ini adalah karya seorang Lisp neophyte! Seluruh pengalaman itu cukup membuka mata saya; untuk pertama kalinya saya melihat kemungkinan menggabungkan kinerja dan ekspresif dalam satu bahasa.
Beberapa waktu kemudian ketika saya mulai mengerjakan proyek berbasis web saya mengikuti audisi sejumlah bahasa. Saya memasukkan Lisp dan Skema ke dalam campuran. Pada akhirnya saya memilih implementasi Skema-- Skema Chez . Saya sangat senang dengan hasilnya.
Proyek berbasis web adalah "mesin seleksi" berkinerja tinggi . Kami menggunakan Skema dalam sejumlah cara berbeda, mulai dari pemrosesan data hingga permintaan data hingga pembuatan halaman. Di banyak tempat kami sebenarnya memulai dengan bahasa yang berbeda tetapi akhirnya bermigrasi ke Skema karena alasan yang akan saya jelaskan secara singkat di bawah ini.
Sekarang saya dapat menjawab pertanyaan Anda (setidaknya sebagian).
Selama audisi kami melihat berbagai implementasi Lisp dan Skema. Di sisi Lisp kami melihat (saya percaya) Allegro CL, CMUCL, SBCL dan LispWorks. Di sisi Skema kami melihat (saya percaya) Bigloo, Chicken, Chez, Gambit. (Pemilihan bahasa sudah lama sekali; itu sebabnya saya agak kabur. Saya bisa menggali beberapa catatan jika itu penting.)
Langsung dari kelelawar kami sedang mencari a) utas asli dan b) dukungan Linux, Mac dan Windows. Gabungan kedua kondisi tersebut membuat semua orang tertekan, tetapi (saya pikir) Allegro dan Chez keluar - jadi untuk melanjutkan evaluasi kami harus melonggarkan persyaratan multi-threading.
Kami mengumpulkan serangkaian program kecil dan menggunakannya untuk evaluasi dan pengujian. Itu mengungkapkan sejumlah masalah. Sebagai contoh: beberapa implementasi memiliki cacat yang mencegah beberapa tes dari berjalan sampai selesai; beberapa implementasi tidak dapat mengkompilasi kode pada saat run-time; beberapa implementasi tidak dapat dengan mudah mengintegrasikan kode kompilasi run-time dengan kode pra-kompilasi; beberapa implementasi memiliki pemulung yang jelas lebih baik (atau jelas lebih buruk) daripada yang lain; dll.
Untuk kebutuhan kami, hanya tiga implementasi komersial - Allegro, Chez dan Lispworks - yang lulus tes utama kami. Dari ketiganya hanya Chez yang lulus semua tes dengan warna terbang. Pada saat itu saya pikir Lispworks tidak memiliki utas asli pada platform apa pun (saya pikir mereka lakukan sekarang) dan saya pikir Allegro hanya memiliki utas asli pada beberapa platform. Selain itu, Allegro memiliki biaya lisensi run-time "hubungi kami" yang sangat saya sukai. Saya percaya Lispworks tidak memiliki biaya run-time dan Chez memiliki pengaturan langsung (dan sangat masuk akal) (dan itu hanya menendang jika Anda menggunakan kompiler saat run-time).
Setelah menghasilkan potongan kode yang agak signifikan di Lisp dan Scheme, berikut adalah beberapa titik perbandingan dan kontras:
Lingkungan Lisp jauh lebih matang. Anda mendapatkan banyak bang untuk uang. (Karena itu, lebih banyak kode juga sama dengan lebih banyak bug.)
Lingkungan Lisp jauh lebih sulit untuk dipelajari. Anda membutuhkan lebih banyak waktu untuk menjadi mahir; Common Lisp adalah bahasa yang sangat besar - dan itu sebelum Anda sampai ke perpustakaan yang ditambahkan implementasi komersial di atasnya. (Karena itu, kasus sintaksis Skema jauh lebih halus dan rumit daripada hal apa pun di Lisp.)
Lingkungan Lisp bisa jadi agak lebih sulit untuk menghasilkan binari. Anda perlu "mengguncang" gambar Anda untuk menghapus bit yang tidak dibutuhkan, dan jika Anda tidak menjalankan program dengan benar selama proses itu, Anda bisa berakhir dengan kesalahan run-time nanti. . Sebaliknya, dengan Chez kami mengkompilasi file tingkat atas yang mencakup semua file lain yang dibutuhkan dan kami selesai.
Saya katakan sebelumnya bahwa kami akhirnya menggunakan Skema di sejumlah tempat yang pada awalnya tidak kami maksudkan. Mengapa? Saya dapat memikirkan tiga alasan dari atas kepala saya.
Pertama, kami belajar untuk mempercayai Chez (dan pengembangnya, Cadence). Kami banyak bertanya dari alat, dan itu disampaikan secara konsisten. Sebagai contoh, Chez secara historis memiliki sejumlah kecil cacat, dan manajer memorinya sangat, sangat baik.
Kedua, kami belajar untuk mencintai kinerja yang kami dapatkan dari Chez. Kami menggunakan sesuatu yang terasa seperti bahasa scripting - dan kami mendapatkan kecepatan kode asli dari itu. Untuk beberapa hal yang tidak masalah - tetapi tidak pernah sakit, dan kadang-kadang itu banyak membantu.
Ketiga, kami belajar untuk mencintai Skema abstraksi yang bisa diberikan. Ngomong-ngomong, saya tidak hanya bermaksud makro; Maksud saya hal-hal seperti penutupan, lambda, panggilan ekor, dll. Begitu Anda mulai berpikir dalam istilah-istilah itu, bahasa lain tampaknya agak terbatas dengan perbandingan.
Apakah Skema sempurna? Tidak; itu adalah trade-off. Pertama, ini memungkinkan masing-masing pengembang menjadi lebih efektif - tetapi lebih sulit bagi pengembang untuk saling memahami kode masing-masing karena rambu-rambu yang dimiliki sebagian besar bahasa (misalnya untuk loop) tidak ada dalam Skema (misalnya, ada sejuta cara untuk melakukan a for loop). Kedua, ada sekelompok pengembang yang jauh lebih kecil untuk diajak bicara, disewa, dipinjam, dll.
Singkatnya, saya pikir saya akan mengatakan: Lisp dan Skema menawarkan beberapa kemampuan yang tidak tersedia secara luas di tempat lain. Kemampuan itu adalah trade-off, jadi sebaiknya itu yang masuk akal dalam kasus khusus Anda. Dalam kasus kami, faktor-faktor penentu antara apakah akan menggunakan Lisp atau Skema lebih terkait dengan fitur-fitur yang sangat mendasar (dukungan platform, utas platform, kompilasi run-time, lisensi run-time) dibandingkan dengan fitur-fitur bahasa atau perpustakaan. Sekali lagi, dalam kasus kami itu juga merupakan trade-off: dengan Chez kami mendapatkan fitur inti yang kami inginkan tetapi kami kehilangan perpustakaan luas yang dimiliki lingkungan Lisp komersial.
Juga, hanya untuk mengulangi: kami telah melihat berbagai Lisps dan Skema sejak lama; mereka semua telah berevolusi dan membaik sejak saat itu.