2010-10-13 34 views
13

我需要爲編程語言實現一個解釋器,作爲我正在開發的一個項目的一部分。我不認爲這個項目的細節太相關,除了它需要我從頭開始實施一個解釋器,我不能使用現有的編程語言(要求包括支持可移植定界延續,並且能夠編寫一個解釋器在Javascript中,也在Java中)。哪些編程語言擁有最容易實現的解釋器?

很顯然,我真的寧願避免發明了一種全新的編程語言,所以我希望有一些非常簡單的語言,我可以複製,或至少從中汲取靈感。

我首先想到的是第四或一個基本類似Lisp的語言,但我真的很喜歡語言有語法更接近像使用Java,Python或Ruby更流行的編程語言。特別是,這意味着支持中綴運算符(a + b),並且還需要a = b賦值變量。

換一種方式,我想這種語言的感覺相當熟悉的人誰今天PHP程序的人,我不相信無論是第四或Lisp的滿足這個標準。

任何人都可以提供這樣的語言的任何建議嗎?

+5

-1因爲想做出一個類似PHP的東西;)將它扼殺在萌芽狀態。 – ocodo 2010-10-13 23:06:23

+1

我不想做一個類似於PHP的東西,我只是想對使用PHP編程的人員合理地熟悉一些東西。 – sanity 2010-10-14 06:21:24

回答

10

這聽起來像是一份Lua的工作。

  • 這是一個小語種,設計簡單實現
  • 目前已經在Java中的幾個implementations和進步,至少工程的JavaScript。
  • 其語法符合您的要求(任務,中綴操作符)。

你留下的工作是實現分隔延續,但你知道已經排除了Lisp/Scheme。

14

我認爲Lisp和Forth有一些最簡單的天真解釋器。

你可以選擇一個簡單的動態語言,最難的部分是建立解析器。例如,JavaScript的一個子集可能工作。解釋器基本上遍歷了AST並且執行了每個節點的操作。

在任何情況下,可以嵌入在你的開發環境,並避免使用您自己不惜一切代價研究現有的腳本語言。實現編譯器(廣義上)非常有趣,但從長遠來看,維護起來可能會很昂貴。

+0

由於在我的問題中描述的原因,我已經排除了不顧一切的左右傾斜。 – sanity 2010-10-14 06:22:39

+2

爲什麼不用中綴語法做一個lisp?這並不難。 – nickik 2010-10-18 09:46:13

3

Brainfuck?我的意思是它只有8個命令,每個映射到一個字符。

+0

幾個星期前做過其中的一個......這很有趣。還有一些像pbrain這樣的擴展也可以添加到項目中。我認爲爲它編寫一個優化的JIT編譯器會很有趣,但後來我被工作分心...... – 2010-10-13 23:16:00

+0

是的,我想當你考慮「試圖爲人們設計一種語言時,它不能完全回答這個問題以實際使用「部分;) – 2010-10-14 14:12:08

+0

@sanity,它不是。它旨在允許儘可能最小的編譯器爲圖靈完整的編程語言。 – 2011-10-19 21:54:18

2

建立一個LISP解釋第一,這將是相對簡單。

您將獲得大量語言解析經驗,而不會受到附加功能要求的限制。

+0

我已經排除了Lisp的原因在我的問題中解釋。 – sanity 2010-10-14 06:23:10

+2

我知道,但是我仍然希望鼓勵你這樣做,因爲我假設這將是你的第一語言翻譯,而且我認爲從構建相對容易解析的語言中可以獲得更多的東西,取而代之的是您希望其他人使用的語言。現階段不要擔心,建立一些可以學習的東西。更不用說,在Reddit和YCombinator周圍快速發現,Lisp目前幾乎不受歡迎。 – ocodo 2010-10-14 09:44:31

+0

您是否認爲Paul Graham可能與LISPers聚集在YCombinator周圍有什麼關係? = P – 2010-10-16 03:35:24

2

我想這既是對自己的薰陶,作爲一個有用的最終產品的願望的練習。

在這種情況下,我必須同意那些推薦Lisp-like語言變體的人,至少在第一遍時,尤其是如果你以前沒有這樣做的話。

Lua是一種非常流行的腳本語言,它需要很小的,而不是特別的用戶腳本。

您可能還會考慮javascript本身(或子集)是否符合您的要求。

而且,這裏諮詢清單: http://en.wikipedia.org/wiki/Continuation#Programming_language_support

0

我建議你開始口齒不清的一個子集 - 基本車,CDR,缺點和報價。確保你有一個基本的掃描器來處理無效的字符,然後無效的類型(比如cons需要2個參數,第二個必須是一個列表)。你可以通過基本數據結構的知識來完成這項工作(鏈接列表本身可以做到,但雙向鏈接或循環更好)。

8

Tcl。語法和Lisp一樣簡單,它有一個用於中綴算術的expr proc。它甚至使用{}作爲塊,所以如果你恰好眯起來,你可以告訴人們它是一種C語言。

它沒有中綴分配a=b,但是一旦你開始走下通用中綴記法的道路,語言變得非常複雜,真的很快,所以我不確定它是如何與你的其他要求兼容的。

+1

我想給+1一個TCL答案,但寫一個完整的TCL解釋器並不是那麼容易。您可以非常簡單地獲得該語言的適度核心,但TCL包含許多子語言,例如,您提到的expr命令。任何真正的程序都必須支持expr,因爲它出現在if命令中,所以你實際上必須在shell之上實現類似C的語言,就像TCL使用的語言 – SingleNegationElimination 2010-10-13 23:44:47

+0

那麼,他確實說過「或者至少需要繪製靈感來自「,而Tcl的兼容性並不是一個硬性要求。另外,由於'expr'看起來與其他任何proc類似,所以不需要像大多數(更復雜)的語言那樣立即完全實現。我想你甚至可以用Tcl寫它,並在他需要寫的兩位翻譯之間分享它! – Ken 2010-10-14 00:51:48

+0

@Token:我還會補充一點,那些子語言是特定於有問題的命令的。實現語言的解析器/解釋器很容易。實現所有的核心命令...少之又少。儘管如此,如果你看看wiki,你可能會發現使用其他更簡單的命令來執行許多命令。 – RHSeeger 2010-10-14 15:27:58

0

您可以使用Lisp的子集,仍然有一個更自然的符號,如果你使用的甜美表情,或至少捲曲,中間符號:

  • 捲毛,綴加綴,通過讀{a + b}爲(+ ab),並且支持像f(x)這樣的傳統函數表示法。請參閱SRFI-105。

  • Sweet-expressions基於卷積中綴,並添加語法相關的縮進。在SRFI-110中查看更多。它的URL是http://srfi.schemers.org/srfi-110/(對於SRFI-105,用「105」替換「110」)。

兩人都被讀Lisp的S-表達式項目實施: http://readable.sourceforge.net/

享受!

相關問題