Saya telah melihat banyak kurikulum CS dan saran pembelajaran untuk programmer baru yang meminta calon programmer untuk mempelajari juru bahasa lisp yang secara khusus ditulis dalam lisp. Semua situs ini mengatakan hal-hal yang mirip dengan, "ini wahyu intelektual", "ini adalah pengalaman pencerahan yang harus dimiliki oleh setiap programmer serius," atau "ini menunjukkan kepada Anda hubungan perangkat keras / lunak," dan pernyataan tidak jelas lainnya, terutama dari artikel ini yang diambil dari how-to yang bereputasi baik ini .
Sentimen umum dari pertanyaan saya adalah, bagaimana cadel mencapai tujuan di atas dan mengapa cadel? Mengapa tidak menggunakan bahasa lain?
Saya menanyakan hal ini karena saya baru saja selesai menulis skema juru bahasa dalam skema (diambil dari SICP http://mitpress.mit.edu/sicp/ ) dan sekarang saya sedang menulis juru bahasa python dalam skema dan saya berjuang untuk memiliki pencerahan legendaris ini. yang seharusnya datang khusus dari yang pertama. Saya mencari detail teknis spesifik antara kedua bahasa yang dapat saya manfaatkan dalam juru bahasa skema mereka untuk mendapatkan pemahaman tentang bagaimana program bekerja.
Lebih spesifik:
Mengapa studi tentang seorang penerjemah yang ditulis dalam bahasa yang ditafsirkannya begitu ditekankan - apakah itu hanya latihan mental yang bagus untuk menjaga bahasa asli dan bahasa yang dibangun tetap atau ada masalah khusus yang solusinya hanya dapat ditemukan dalam sifat bahasa asli?
Bagaimana interpreter lisp menunjukkan konsep arsitektur yang baik untuk desain perangkat lunak masa depan seseorang?
Apa yang akan saya lewatkan jika saya melakukan latihan ini dalam bahasa yang berbeda seperti C ++ atau Java?
Apa takeaway atau "alat mental" yang paling sering digunakan dari latihan ini? **
** Saya memilih jawaban yang saya lakukan karena saya telah memperhatikan bahwa saya telah diperoleh dari latihan ini lebih keterampilan dalam merancang alat parsing di kepala saya daripada alat tunggal lainnya dan saya ingin menemukan metode yang berbeda dari parsing yang dapat bekerja lebih baik untuk skema interpreter dari interpreter python.
Jawaban:
Dengan risiko memberikan jawaban "saya juga", jika Anda mencobanya Anda akan melihat ...
Jika Anda mempelajari bahasa komputer, Anda mungkin mendapat kesan bahwa setidaknya setengah tentang penguraian. Jika Anda mempelajari Lisp, Anda akan menyadari bahwa menguraikan sintaks permukaan tidak lebih dari kenyamanan bagi orang-orang (seperti kebanyakan dari kita) yang tidak menyukai Banyak Tanda Kurung Tunggal yang Mengiritasi.
Maka Anda dapat menyadari bahwa harga besar dibayarkan untuk kenyamanan itu. Dalam Lisp itu sepele untuk sebuah program untuk membangun program lain dan menjalankannya. Dalam bahasa lain itu adalah teknik canggih, seperti melakukan perkalian angka romawi.
Tentu saja, hampir semua orang akan bertanya "siapa yang perlu melakukan itu?" Ya, Anda bisa melihat bahwa itu membuka banyak hal yang bahkan tidak pernah Anda sadari sebelumnya. Anda dapat melakukannya dalam bahasa lain, tetapi tidak dengan mudah.
Dimasukkan untuk menjawab komentar Izkata:
... itu hanya beberapa ...
Kemudian Anda menyadari beberapa hal yang dianggap "modern" saat ini telah usang di Lisp selama 40-tahun. Suka pemrograman fungsional. Seperti pengumpulan sampah. Seperti penutupan.
Itu bukan untuk mengatakan bahasa modern tidak memiliki ide-ide bagus yang baru, seperti OOP, dll. Tetapi jika Anda belajar Lisp itu akan memperluas perspektif Anda.
sumber
You can do it in other languages, but not nearly so easily.
- Suka? (Pertanyaan bagi saya tampaknya karena pernyataan seperti ini sering dibuat, tetapi hampir tidak pernah menjadi lebih spesifik)Jawaban sederhana untuk pertanyaan Anda adalah mencoba Lisp, lebih disukai dalam hubungannya dengan SICP . Maka Anda akan tercerahkan.
Yang mengatakan ...
Kode adalah Data
Sebagian besar bahasa membuat perbedaan tajam antara kode dan data; Gangguan tidak. Hal ini memungkinkan untuk, misalnya, dengan mudah menulis parser Lisp di Lisp, dan untuk memanipulasi kode Lisp dalam Lisp. Deskripsi terbaik pencerahan yang saya temukan adalah The Nature of Lisp .
Ini benar sebagian karena sintaks untuk bahasa sangat sederhana. Itu memungkinkan hal-hal dalam Lisp (seperti metaprogramming) yang tidak praktis dalam bahasa lain karena sintaks menghalangi.
Bacaan Lebih Lanjut
Mengalahkan Rata-Rata
sumber
Secara umum, mempelajari juru bahasa memberi Anda wawasan tentang bahasa dan fiturnya. Secara umum, mempelajari kode dalam bahasa pemrograman seperti mempraktikkan bahasa lisan dengan mendengarkan dan membaca: itu membiasakan Anda dengan apa yang bisa dilakukan oleh bahasa itu, bagaimana menggunakannya, dan "idiom" umum. Lebih khusus lagi, Lisp adalah bahasa homoikonik, yang artinya sintaksisnya untuk ekspresi sama dengan sintaksisnya untuk data. Menulis kode dalam Lisp tampak sangat buruk seperti Anda sedang menulis daftar, dan sebaliknya. Dengan demikian, menafsirkan kode Lisp dengan kode Lisp semudah menjalankan daftar dengan
car
dancdr
.Pikirkan tentang bagaimana penerjemah akan menafsirkan dirinya sendiri - dalam banyak implementasi penerjemah meta-sirkuler (di mana bahasa homoiconic menafsirkan sendiri) hanya bisa "melewati" fungsi. Misalnya, Untuk menerapkan
car
, cukup ambilcar
argumen. Ini menghilangkan penekanan dari mekanisme penyimpanan data dan berfokus pada fungsionalitas.Penerjemah bisa sangat rumit, yang mendorong arsitektur yang baik dalam mendesainnya. Dengan mengingat hal itu, yang satu ini lebih tergantung pada masing-masing juru bahasa.
Bahasa-bahasa ini bukan homoikonik, jadi mereka tidak mendapat manfaat dari keanggunan dan kesederhanaan seorang interpreter Lisp meta-bundar. Ini membuat latihan lebih sulit, dan mungkin kurang umum, tetapi saya tidak akan mengatakan itu benar-benar kurang bermanfaat.
Saya tidak yakin saya punya jawaban yang bagus untuk yang satu ini; hanya karena itu membantu untuk melihat bagaimana penerjemah bekerja dan, mungkin lebih penting, bermain-main dengannya untuk melihat bagaimana perubahan kecil pada bahasa dapat dengan mudah diimplementasikan.
sumber
LISP sendiri terstruktur dengan cara yang membuatnya sangat mudah untuk diuraikan. Jika Anda mencoba menulis kompiler, Anda akan melihat bahwa jauh lebih mudah jika segala sesuatu dalam bahasa Anda adalah ekspresi dan memiliki tingkat ambiguitas yang rendah. LISP memaksa tanda kurung di mana-mana untuk menghilangkan ambiguitas dan tidak memiliki pernyataan, hanya ekspresi.
Fakta bahwa LISP sangat mudah diurai mendorong pengguna untuk mengurai kode sumber mereka sendiri dan melakukan trik sulap dengannya. Garis antara data dan kode menjadi kabur dan Anda dapat dengan mudah melakukan hal-hal yang biasanya membutuhkan sedikit usaha, seperti refleksi, penulisan ulang kode dinamis, plugin dan serialisasi.
Itulah intinya. Latihan ini mungkin dimaksudkan untuk memberi Anda beberapa wawasan tentang apa yang mungkin terjadi ketika kode mudah diurai dari dirinya sendiri.
sumber
Saya tidak yakin ini sangat penting untuk semua orang. Anda bisa menjadi pengembang yang sukses tanpa mengetahui cara kerja seorang juru bahasa Lisp. Saat mempelajari Ilmu Komputer, ide dasar Lisp harus dipelajari.
Penerjemah Lisp penting bagi programmer Lisp. Mereka perlu memahami cara kerja seorang Penerjemah ([dan kompiler] 1 ), untuk sepenuhnya memahami cara menggunakan bahasa tersebut.
Seorang interpreter Lisp sering digunakan sebagai alat dalam ilmu komputer untuk mengajarkan kepada siswa beberapa hal:
memahami definisi bahasa yang ringkas dan minimal melalui implementasi: Alan Kay menyebutnya Persamaan Perangkat Lunak Maxwell .
pengertian pemrograman tingkat bahasa , dengan mengubah dan memperluas penerjemah
memahami pemrograman tingkat-meta dan dampaknya pada desain dan penggunaan bahasa pemrograman. Misalnya memahami apa artinya 'mengutip' dan mengapa itu perlu
memahami interpretasi bahasa pemrograman Lisp dan hubungannya dengan Kalkulus Lambda
Sebagai alat pengajaran, seorang juru bahasa Lisp sangat membantu, karena dapat dipelajari dan dipahami dalam waktu singkat. Karena sedikit siswa yang sudah tahu tentang Lisp, para siswa berada pada level yang sama ketika mempelajari konsep-konsep di atas.
sumber