Penterjemah Lisp yang ditulis dalam 99 baris kod C telah mencetuskan perbincangan hangat dalam komuniti pengaturcaraan mengenai sama ada pemampatan kod yang melampau datang dengan kos yang terlalu tinggi. Projek ini, dipanggil tinyLisp , cuba untuk memasukkan penterjemah Lisp yang berfungsi dengan 21 primitif terbina dalam, pengumpulan sampah, dan REPL ke dalam kurang daripada 100 baris kod C .
Ciri-ciri TinyLisp :
- 99 baris kod C (purata 55 baris sumber)
- 21 primitif Lisp terbina dalam
- Pengumpulan sampah yang mudah
- REPL (Read-Eval-Print Loop)
- Sokongan skop statik
- Aritmetik titik terapung ketepatan berganda
- Lebar maksimum 120 kolum untuk penyuntingan
![]() |
---|
Contoh sesi dalam penterjemah seperti Lisp, mempamerkan penggunaan fungsi lambda dan currying, mencerminkan kefungsian tinyLisp |
Kebimbangan Kualiti Kod Mendominasi Perbincangan
Pelaksanaan ini telah menarik kritikan tajam daripada pembangun yang berhujah bahawa mengejar keringkasan telah mengakibatkan amalan kod yang bermasalah. Pengkritik menunjukkan beberapa isu teknikal termasuk penyalahgunaan jenis data double, masalah kebergantungan endian, dan pelanggaran aliasing ketat yang mungkin menghalang kod daripada berfungsi pada pengkompil moden. Sesetengah pembangun bahkan telah menemui ralat sintaks dalam versi semasa, dengan kurungan tutup tambahan pada baris 81 yang menghalang kompilasi.
Pengarang menggunakan teknik yang dipanggil NaN-boxing , di mana maklumat jenis disimpan dalam bait pertama nombor titik terapung ketepatan berganda. Walaupun pendekatan ini digunakan dalam sistem pengeluaran seperti enjin JavaScript dan Ruby , pelaksanaannya dalam tinyLisp telah dikritik kerana mengutamakan saiz berbanding kejelasan.
Isu Teknikal Yang Dikenal Pasti:
- Ralat sintaks pada baris 81 (kurungan tutup berlebihan)
- Penyalahgunaan jenis data double untuk penandaan jenis
- Masalah kebergantungan endian
- Pelanggaran strict aliasing
- Kekurangan pengoptimuman panggilan ekor (TCO)
- Isu keserasian dengan pengkompil moden
Pertukaran Antara Kebolehbacaan dan Keringkasan
Ramai ahli komuniti telah menyatakan keutamaan untuk kod yang lebih panjang dan lebih mudah dibaca berbanding pendekatan yang dimampatkan. Pelaksanaan alternatif telah diserlahkan, termasuk versi 700 baris yang dipanggil fe yang mengutamakan kejelasan dan struktur dokumentasi yang betul. Konsensus di kalangan pengkritik nampaknya ialah menggandakan atau metigakan kiraan baris akan berbaloi jika ia menghasilkan kod yang boleh diselenggara dan difahami.
Saya sangat lebih suka 200 baris kod yang benar-benar boleh dibaca dengan baik.
Pelaksanaan Alternatif:
- fe: Pelaksanaan C yang jelas dengan 700 baris kod dan dokumentasi yang lebih baik
- Versi Python: ~100 baris dengan pelaksanaan lispy.html oleh Norvig
- tinylisp-extras.c: Versi lanjutan dengan sokongan TCO
Keupayaan Teknikal dan Had
Walaupun mendapat kritikan, tinyLisp memang menawarkan fungsi yang besar untuk saiznya. Penterjemah menyokong skop statik, aritmetik titik terapung ketepatan berganda, dan termasuk operasi Lisp yang penting. Walau bagaimanapun, pelaksanaan ini nampaknya tidak mempunyai pengoptimuman panggilan ekor ( TCO ), yang mengehadkan keupayaannya untuk melaksanakan fungsi rekursif seperti Y-combinator tanpa mengrisiko limpahan tindanan.
Projek ini termasuk versi yang dioptimumkan untuk kelajuan yang diperbaiki dan penggunaan memori yang dikurangkan, dan pengarang telah menyediakan contoh sambungan untuk menambah ciri Lisp tambahan.
Kesimpulan
Projek tinyLisp berfungsi sebagai kajian kes yang menarik dalam perdebatan berterusan antara pencapaian golf kod dan pembangunan perisian praktikal. Walaupun pencapaian teknikal melaksanakan penterjemah Lisp yang berfungsi dalam 99 baris adalah mengagumkan, respons komuniti menunjukkan bahawa pemampatan yang melampau sedemikian mungkin tidak berbaloi dengan cabaran penyelenggaraan dan kebolehpercayaan yang terhasil. Perbincangan ini menyerlahkan kepentingan mengimbangi inovasi dengan kualiti kod dalam projek pengaturcaraan dunia sebenar.
Rujukan: Lisp in 99 lines of C and how to write one yourself