Saya baru-baru ini melakukan tugas menulis bahasa pemrograman berbasis stack. Sebelum saya mulai mendesain bahasa saya, saya pikir akan lebih baik untuk membaca dan bereksperimen dengan bahasa berbasis stack yang ada.
Ini membawa saya ke topik posting ini. Saya membaca artikel Wikipedia tentang Forth , bahasa berbasis tumpukan yang menggunakan ekspresi gaya postfix. Dalam artikel itu, saya melihat pernyataan berikut:
Fleksibilitas Forth membuat tata bahasa BNF statis tidak pantas, dan tidak memiliki kompiler monolitik. Memperluas kompiler hanya membutuhkan penulisan kata baru, alih-alih memodifikasi tata bahasa dan mengubah implementasi yang mendasarinya.
Dari pemahaman saya, dalam istilah Forth, istilah "kata" tampaknya pada dasarnya identik dengan "subrutin". Mengingat hal ini, pernyataan di atas tampak aneh. Mengapa tepatnya kemampuan untuk membuat fungsi-fungsi baru di Forth membuat tata bahasa formal untuk Forth tidak pantas? Mengapa Anda perlu menulis ulang tata bahasa untuk setiap subrutin baru yang Anda tentukan? Bagaimana cara menulis kata baru di lingkungan merupakan perpanjangan dari kompiler? Pernyataan di atas tampaknya mirip dengan mengatakan bahwa tata bahasa formal tidak pantas untuk Python karena Anda dapat mendefinisikan fungsi baru.
Bahkan, saya memutuskan untuk mencoba menulis tata bahasa gaya BNF untuk bagian sederhana dari Forth di bawah ini:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
Tata bahasa di atas tampaknya mencakup subset yang valid dari pernyataan Forth, dan tampaknya tidak sulit untuk diperluas untuk mencakup semua pernyataan yang valid dalam bahasa Forth. Lebih jauh, jika parser kompiler mengimplementasikan tata bahasa di atas, saya gagal melihat bagaimana kompiler akan diperluas. Kompiler hanya akan menambahkan kata-kata baru ke lingkungannya . Hanya lingkungan yang diubah. Hampir tampak seolah-olah kutipan di atas dari Wikipedia menyatukan kode garis bawah yang menyusun kompiler (yang tidak berubah) dengan lingkungan kompiler (yang memang berubah).
Singkatnya, mengapa kebohongan Forth untuk mendefinisikan kata-kata baru (subrutin) membuat tidak pantas untuk tata bahasa tertulis?