Manakah dari kritik lama terhadap cadel umum yang masih berlaku saat ini?

29

Dalam A Critique of Common Lisp yang ditulis oleh Rodney A. Brooks dan Richard P. Gabriel dari Stanford pada tahun 1984, beberapa keputusan desain dipertahankan oleh komite normalisasi Common Lisp dibahas. Sementara sebagian besar diskusi tetap valid, ada dua pernyataan yang merujuk pada teknologi yang tersedia pada saat itu dan mungkin salah hari ini.

Dua pernyataan ini adalah:

Terlalu banyak biaya bahasa dihilangkan dengan peringatan bahwa 'kompiler yang baik' dapat mengurusnya. Belum ada yang menulis — tidak mungkin tanpa usaha yang luar biasa — sebuah kompiler yang melakukan sebagian kecil dari trik yang diharapkan darinya.

Karena saya seorang pemula Common Lisp, atau bahkan seorang magang, saya tidak dapat lebih spesifik daripada penulis. Mereka tampaknya menyatakan bahwa generalisasi dan fleksibilitas yang besar telah dibangun ke dalam beberapa aspek bahasa, yang membuat menulis kompiler yang baik cukup sulit.

Dalam LISP UMUM, sedikit terlalu banyak kontrol ditempatkan pada aritmatika floating-point. Dan tentu saja, meskipun perilaku yang benar dari program intensif titik-mengambang dapat dicapai, kinerja dapat sangat bervariasi.

Sejauh yang saya mengerti, tampaknya menulis kode numerik yang efisien dalam Common Lisp adalah mungkin tetapi lebih menantang daripada yang seharusnya.

Ini tiga puluh tahun yang lalu. Bagaimana saya harus menganggap pernyataan ini hari ini jika saya bersedia untuk menulis program Common Lisp untuk salah satu implementasi perangkat lunak bebas umum (CLISP, SBCL et al.)?

pengguna40989
sumber
Pertanyaan bagus! Senang mendengar dari seseorang yang berpengetahuan tentang Common Lisp tentang topik ini. Ketakutan saya adalah bahwa mereka masih berlaku, berdasarkan popularitas relatif umum Common Lisp saat ini.
1
Titik mengambang sulit untuk diperbaiki. Beberapa bahasa menentukan model yang ketat dan menderita karena kinerja, yang lain menggunakan model yang longgar dan sulit untuk dipikirkan. Sebagai contoh, alasan tentang program floating point sederhana di C # terlalu sulit bagi saya. Jadi saya cenderung berpihak pada perancang bahasa yang ketat dengan floating point, bahkan jika biaya kinerja.
CodesInChaos
2
Di sisi lain, perangkat keras modern umumnya menerapkan floating point IEEE, jadi itu mungkin jauh lebih dapat diprediksi dalam perilakunya daripada implementasi yang tersedia pada tahun 1984.
microtherion

Jawaban:

31

Makalah ini menarik dalam banyak hal.

Bagian yang paling menarik adalah ini: penulis memalsukan kertas dari tahun 1984 hanya dua tahun kemudian pada tahun 1986 sendiri. Brooks dan Gabriel mengembangkan kompilator Lisp yang sangat mengoptimalkan dan menjualnya secara komersial sangat sukses selama beberapa tahun: Lucid Common Lisp (PDF).

Pemeliharaan untuk kompiler Lisp ini masih tersedia dari LispWorks : sekarang disebut Liquid Common Lisp .

Optimalisasi kompiler Liquid CL didokumentasikan dalam Bab 3 dari Panduan Pengguna Lanjutan : Mengoptimalkan Program Lisp .

Beberapa aplikasi komersial telah ditulis dan digunakan dalam Lucid CL. Sebagai contoh di kota asal saya, sistem informasi transportasi umum pertama untuk HVV (Hamburger Verkehrsverbund) dikerahkan menggunakan Lucid CL pada SUN SPARCstation. Itu tersedia untuk umum di stasiun kereta menggunakan layar sentuh besar dan di pusat panggilan.

Lucid CL berhasil karena kompiler mode produksinya menciptakan aplikasi Common Lisp yang cepat, terutama untuk platform Unix / RISC.

Brooks dan Gabriel menulis tentang Lucid Common Lisp pada tahun 1986:

Kompiler yang dapat ditargetkan ulang secara dinamis telah terbukti sebagai sarana yang memudahkan kompilasi untuk berbagai implementasi Lisp dapat dilakukan; sarana porting sistem Lisp ke berbagai komputer; dan alat untuk menghasilkan kode berkualitas tinggi dan berkinerja tinggi untuk berbagai komputer dari sumber yang sama.

Jadi mereka baru saja mengimplementasikan apa yang menurut Critique of Common Lisp sulit atau tidak mungkin.

Saat ini implementasi yang lebih maju sedang melakukan banyak optimasi, tetapi perangkat kerasnya juga 1000+ kali lebih cepat dari yang kami miliki pada tahun 1984. VAX 11/780 kemudian memiliki satu MIPS (juta instruksi per detik) dan Mesin Lisp juga dalam kisaran itu. Motorola 68000 memiliki clock rate 8 MHz.

Kritik tentang kinerja floating point dan umumnya beragam kinerja masih valid, tetapi ini mencerminkan pilihan implementor. Beberapa implementasi tidak dikembangkan sebagai kompiler berkinerja tinggi. Fokus utama mereka bisa portabilitas, kekompakan atau sesuatu yang lain dan karenanya mereka memiliki tujuan implementasi yang berbeda.

Sebagai pengguna / pengembang, seseorang tidak dipaksa untuk menulis kode portabel dan menggunakan semua + sepuluh sistem Common Lisp yang saat ini didukung. Gunakan implementasi yang paling cocok untuk masalah aplikasi.

Rainer Joswig
sumber
Jawaban Anda sangat tepat dan terperinci, itu pasti layak untuk hadiah!
user40989
1
"Sangat dioptimalkan" tidak berarti kompiler "cukup pintar". Kata-kata "cukup pintar" menimbulkan pertanyaan "untuk tujuan apa?". Masih ada aplikasi (terutama untuk platform tertanam yang sangat terbatas) yang tidak akan Anda tulis di Common Lisp karena optimasi masih tidak dapat menghilangkan semua overhead run-time dari pengetikan dinamis, alokasi tumpukan, dan pengumpulan sampah. Tentu saja Common Lisp sama sekali tidak unik dalam "kegagalan" itu. Belum ada bahasa yang diamati di alam liar yang benar-benar cocok untuk semuanya.
Steve314
@ Steve314: Target Lucid CL adalah pasar untuk sistem AI berbasis Lisp besar, sistem CAD, dll di workstation dan server Unix. Target CL Lucid bukan sistem tertanam. Lucid CL membahas overhead waktu pengetikan dinamis, alokasi heap, dan banyak area optimisasi lainnya - termasuk pengumpul sampah yang berkinerja tinggi. Tetap saja, GC sangat dibutuhkan. Biasanya aplikasi menggunakan teknik khusus untuk menghindari persetujuan dan dengan demikian mengurangi tingkat GC, seperti kumpulan 'sumber daya'.
Rainer Joswig
21

Ketika makalah ini ditulis pada tahun 1984, komputer yang memiliki 1 megabyte RAM dan hard drive 20 megabyte, yang mampu duduk di meja Anda, adalah masalah besar. Tentu saja, perselisihan akan timbul karena kepraktisan bahasa setinggi tingkat Lisp pada perangkat keras yang sederhana. Kemajuan teknologi perangkat keras dan kompiler yang telah terjadi sejak saat itu telah membuat program Lisp lebih mudah untuk ditulis dan dieksekusi, terlepas dari segala inefisiensi numerik yang mungkin ada dalam bahasa tersebut.

Pemrogram sering berdagang efisiensi komputasi untuk efisiensi pemrograman. Lisp dapat menjadi bahasa yang lambat (dalam beberapa implementasi, tetapi demikian juga bahasa lainnya), tetapi juga memiliki reputasi yang baik untuk pengembangan cepat, dan banyak program tidak memerlukan infrastruktur yang sangat optimal untuk menunjukkan kinerja yang memadai.

Pilihan implementasi Lisp dapat sangat memengaruhi profil kinerja program Anda. Misalnya, CLISP dengan mudah mengakui bahwa "Jika kode Anda sangat numerik, Anda mungkin lebih suka CMUCL." Beberapa implementasi Lisp (dan Skema) modern memungkinkan Anda menentukan petunjuk tipe numerik, yang akan meningkatkan kinerja numerik.

Singkatnya, situasinya jauh lebih baik hari ini daripada sebelumnya.

Robert Harvey
sumber