Mengapa mempelajari juru bahasa dalam bahasa Inggris sangat penting?

30

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.

Ma-at
sumber
4
@gnat Bukan nasihat karier, lebih dari pertanyaan "apa yang hebat tentang Lisp".
Robert Harvey
1
@RobertHarvey tautan itu tidak hanya untuk karir tetapi juga untuk saran pendidikan , maksud saya ini. Tapi, yah, Lisp-is-so-great mungkin juga cocok
nyamuk
1
Anda sepertinya bertanya apa yang akan Anda pelajari dari latihan tertentu. Sikap diam Anda merupakan tanda kemalasan, kunci bagi setiap programmer yang baik, tetapi terlepas dari satu-satunya cara untuk mengetahui apa yang akan Anda pelajari dari latihan adalah dengan melakukannya dan melihatnya. Tidak ada yang bisa memberi tahu Anda apa yang akan Anda pelajari dari melakukan itu, Anda hanya perlu melakukannya.
Jimmy Hoffa
2
Meskipun pertanyaan ini terkait dengan pendidikan secara keseluruhan, saya tidak akan mengklasifikasikannya sebagai "nasihat pendidikan" dengan cara "Bahasa apa yang harus saya pelajari?" aku s. Artinya, ini tidak spesifik untuk jenis kursus atau pekerjaan tertentu. Bahkan, jika Anda memangkas beberapa kata kunci pendidikan, ini adalah pertanyaan tentang bahasa pemrograman secara keseluruhan, yang jawabannya membahas fitur bahasa. Ini benar-benar tidak spesifik untuk Lisp, juga, tetapi dapat diterapkan ke bahasa homoikonik lainnya seperti xslt. Jadi saya tidak akan mengatakan ini adalah pertanyaan yang sempurna, hanya saja itu bukan sekadar "nasihat karier".
TheRubberDuck

Jawaban:

17

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:

  • Program pemahaman bahasa alami SHRDLU bekerja dengan menerjemahkan pernyataan atau pertanyaan dalam bahasa Inggris ke dalam program dengan dialek Lisp yang disebut MICRO-PLANNER dan menjalankannya.
  • Program yang memanipulasi program, misalnya untuk menyederhanakannya atau membuktikannya benar secara alami ditulis dalam Lisp.
  • Saya menggunakan pembuatan program dalam suatu program untuk memahami pemandangan visual, di mana ia harus berurusan dengan semua simetri yang mampu dalam objek 3 dimensi, tanpa mengalikan kode.
  • Apa pun yang berhubungan dengan logika dan kesepakatan teorema dalam memanipulasi ekspresi logis, yang merupakan bentuk program.
  • Matematika simbolik, seperti integral simbolik atau kalkulus diferensial, melibatkan manipulasi ekspresi matematika, yang seperti program miniatur.
  • Setiap masalah yang melibatkan pembuatan kode, atau istilah "evaluasi parsial" yang lebih highbrow, adalah wajar di Lisp. Saya melakukan ini untuk program jembatan database sejak lama. Saya melakukannya di C, yang tidak semudah Lisp, tapi saya mendapat ide dari Lisp. Itu dianggap sebagai teknik yang hampir tidak ada yang bisa dilakukan pada saat itu (terutama kepala COBOL). Mungkin lebih sekarang, saya harap.

... 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.

Mike Dunlavey
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)
Izkata
Saya pertama kali berpikir bahwa dunia telah mengalami revolusi ketika saya menyadari bahwa javascript dapat mencetak kode sumbernya sendiri dan objek-objek dapat dilintasi untuk mendapatkan string literal yang dapat dimasukkan ke dalam objek literal. Kemudian saya menyadari Perl memiliki ini bersama dengan $ Data :: Dumper :: Deparse, dan kemudian saya menyadari bahwa lisp memiliki ini selamanya. Memahami penerjemah membuka kekuatan ini yang selalu ada untuk membangun modul hidup, dan di Lisp ini lebih mudah diakses daripada bahasa lain.
Dmitry
lucunya adalah seorang programmer Lisp yang menyadari Lisps internal selalu dapat membuat antarmuka Lisp mereka sendiri ke bahasa dinamis apa pun dari javascript ke bash atau perl atau python; lisp bootstraps dengan baik dari lingkungan yang tersedia.
Dmitry
19

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

Robert Harvey
sumber
3
Paragraf ke-2 tidak masuk akal: homoiklikis! = Sintaksis sederhana; sintaks sederhana membuatnya mudah untuk menulis parser Lisp dalam bahasa apa pun (lihat ini ). Paragraf ke-3 tidak jelas, perlu contoh.
@MattFenwick memang benar bahwa homoiconicity dapat dilakukan dengan sintaks yang kompleks, tetapi itu akan sangat sulit. Adalah adil untuk berasumsi bahwa jika Anda berurusan dengan sintaks homoikonik, itu akan menjadi sederhana, jika tidak ada alasan lain selain konsistensi yang diminta yang akan membuatnya lebih mudah diikuti daripada sintaksis non-homoikonik. Meskipun poin kedua Anda bagus, LISP mudah diurai karena sintaksisnya sederhana, bukan karena homoiconicity (bahkan jika homoiconicity adalah penyebab kesederhanaan itu)
Jimmy Hoffa
1
Bagaimanapun, ada sedikit overhead untuk mengambil nilai data dan menafsirkannya sebagai program. Ini hal yang baik. Pemrograman dengan konfigurasi sangat mudah ketika yang harus Anda lakukan adalah menulis juru bahasa untuk data konfigurasi. Transformasi matematika tingkat lanjut (yang sulit untuk diimplementasikan dalam bahasa yang stateful) sering "direduksi" menjadi transformasi sintaksis belaka dari fragmen murni Lisp.
nomen
1
@MattFenwick: Saya telah menghapus kata "Homoiconicity" dari jawaban saya.
Robert Harvey
1
Saya berharap bisa memberi lebih dari +1 untuk The Nature of Lisp; Saya belum pernah melihat penjelasan yang bagus.
Doval
9

Mengapa studi tentang seorang juru bahasa yang ditulis dalam bahasa yang ditafsirkannya demikian ditekankan?

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 cardan cdr.

Bagaimana saya bisa memanfaatkan latihan ini untuk mendapatkan hasil maksimal dari itu secara konseptual?

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 ambil carargumen. Ini menghilangkan penekanan dari mekanisme penyimpanan data dan berfokus pada fungsionalitas.

Bagaimana interpreter lisp menunjukkan konsep arsitektur yang baik untuk desain perangkat lunak masa depan seseorang?

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.

Apa yang akan saya lewatkan jika saya melakukan latihan ini dalam bahasa yang berbeda seperti C ++ atau Java?

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.

Apa takeaway atau "alat mental" yang paling sering digunakan dari latihan ini?

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.

TheRubberDuck
sumber
5

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.

Alexander Torstling
sumber
Ini bukan Lisp yang mudah diurai. S-Ekspresi mudah diurai. Selain itu Anda MAKA perlu mengurai Lisp.
Rainer Joswig
@Rainer: Bukankah itu hanya nitpicking? Dalam dunia saya parsing berarti pergi dari teks ke AST, yang tidak mengatakan apa pun tentang menafsirkan perintah.
Alexander Torstling
Dalam C ++ parser akan mendeteksi deklarasi fungsi yang salah secara sintaksis. Dalam Lisp tidak. Pembaca tidak tahu apa-apa tentang bahasa pemrograman Lisp. Parser C ++ mengetahui sintaksis C ++ lengkap. Pembaca Lisp hanya tahu ekspresi-s.
Rainer Joswig
Ah, kalau begitu aku mengerti maksudmu. Benar, meskipun saya masih berpikir evaluator cadel sederhana akan lebih mudah untuk membangun daripada c ++ sederhana. Itu yang mereka lakukan di SICP, bukan (sudah lama sejak saya membacanya)?
Alexander Torstling
bahasa yang digunakan dalam SICP sangat sederhana, bahkan Skema penuh. Seorang juru bahasa untuk bahasa seperti C kecil juga harus sederhana. C ++ besar. Beberapa kesulitannya berasal dari jumlah sintaks bawaan yang relatif tinggi. Dalam sistem Lisp yang khas, banyak sintaks yang dibuat dengan makro - di luar interpreter. Macro menerapkan sintaks dan mekanisme ekstensi untuk transformasi sumber. Ini membuat inti lebih kecil. Tapi makro bisa sangat besar. Misalnya implementasi untuk konstruk LOOP memiliki lebih dari 2000 baris kode makro yang kompleks.
Rainer Joswig
4

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:

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.

Rainer Joswig
sumber