Projek hujung minggu bekas CTO Stripe untuk membina pengkompil BASIC-ke-Go telah mencetuskan perbincangan meriah dalam komuniti pengaturcaraan mengenai pendekatan terbaik untuk membina parser bahasa dan apa yang benar-benar membentuk sebuah pengkompil.
David Singleton berkongsi pengalamannya mencipta toybasic, versi ringkas TinyBASIC yang mengkompil kepada kod Go . Projek ini hanya mengambil masa beberapa jam pada hari Sabtu yang hujan, menunjukkan bagaimana alatan moden boleh menjadikan pembinaan pengkompil sangat mudah diakses. Pengkompilnya mengikuti pendekatan tiga peringkat klasik: lexing, parsing, dan penjanaan kod.
Komponen Seni Bina Pengkompil:
- Lexer: Menukar aksara kod sumber kepada token bermakna menggunakan Deterministic Finite Automata
- Parser: Membina pokok sintaks daripada token dan mengesahkan struktur program
- Code Generator: Melintasi pokok sintaks dan mengeluarkan kod Go yang setara
Perdebatan Parser Yang Hebat
Projek ini telah mencetuskan perpecahan menarik dalam komuniti pembangunan mengenai kaedah pembinaan parser. Sesetengah pembangun berpengalaman sangat menyokong parser tulis tangan, dengan hujah bahawa ia lebih mudah ditulis dan dinyahpepijat daripada yang disangka ramai orang. Mereka menegaskan bahawa parsing manual membolehkan mesej ralat yang lebih baik dan memberikan pembangun lebih kawalan ke atas proses tersebut.
Walau bagaimanapun, yang lain membantah bahawa apabila anda bereksperimen dengan idea bahasa baru, penjana parser menjadi sangat berharga. Keupayaan untuk berulang dengan pantas pada sintaks tanpa menulis semula kod parsing secara manual boleh menjimatkan masa pembangunan yang ketara. Seorang pembangun menyatakan bahawa mereka menghabiskan 80% masa reka bentuk bahasa mereka hanya menulis dan menyahpepijat parser apabila melakukan semuanya secara manual.
Ketegangan antara kawalan dan kemudahan ini mencerminkan tema yang lebih luas dalam pembangunan perisian - sama ada menggunakan alatan automatik atau mengekalkan kawalan langsung ke atas setiap aspek kod.
Apa Yang Menjadikan Sebuah Pengkompil?
Perbincangan yang tidak dijangka muncul mengenai terminologi. Sesetengah ahli komuniti mempersoalkan sama ada menterjemah BASIC kepada Go patut dipanggil pengkompil berbanding transpiler, kerana ia tidak menghasilkan kod mesin secara langsung. Ini mencetuskan perdebatan yang menarik mengenai definisi dalam sains komputer.
Konsensus nampaknya ialah mana-mana program yang menterjemah dari satu bahasa kepada bahasa lain layak sebagai pengkompil, tanpa mengira bahasa sasaran. Lagipun, banyak pengkompil moden mengeluarkan perwakilan perantaraan atau bytecode berbanding arahan mesin langsung. Perbezaan antara pengkompil dan transpiler nampak lebih akademik daripada praktikal.
Daya Tarikan BASIC Yang Berterusan
Pilihan BASIC sebagai bahasa sumber bergema dengan ramai pembangun yang dengan penuh nostalgia mengingatinya sebagai bahasa pengaturcaraan pertama mereka. Walaupun reputasi BASIC dalam sesetengah kalangan, ahli komuniti menyerlahkan kebolehcapaiannya yang luar biasa - bahasa yang boleh dipelajari oleh jurusan kemanusiaan dalam satu petang, namun kekal cukup berkuasa untuk pengaturcaraan serius.
Varian BASIC moden bergerak jauh melampaui kod bernombor baris dan berat GOTO yang memberikan bahasa itu reputasi buruk. Ramai pembangun berkongsi pengalaman positif dengan dialek BASIC berstruktur yang merangkumi aliran kawalan yang betul dan ciri pengaturcaraan modular.
Projek ini berfungsi sebagai perjalanan nostalgia dan demonstrasi praktikal bahawa pembinaan pengkompil tidak semestinya menakutkan. Dengan alatan yang betul dan pemahaman yang jelas mengenai asas-asas, malah tugas yang kelihatan kompleks seperti membina pengkompil boleh menjadi projek hujung minggu yang menyeronokkan.
Rujukan: I wrote a compiler