一個編程語言有可能自己解釋自己嘛?

比方說有一門新的語言叫p語言,p語言是由p語言編寫出來的


能不能用一種語言實現自己的語義,這跟語言能表達的計算能力有關係。

@霧雨魔理沙 的答案是從這個角度回答的。

一種語言能否自主的實現自己的語義——也就是說,能否脫離宿主環境而獨立(standalone)的實現自己,這跟這種語言(的實現)能否自舉(bootstrap)有關係。

@mysqto 的答案是從這個角度回答的。

俺就來打個醬油放個傳送門:

用 JavaScript 寫成的 JavaScript 解釋器,意義是什麼? - RednaxelaFX 的回答

還有這個回答下我的評論 無宿主的腳本語言有沒有實現的可能呢? - 馮東的回答

用一種語言實現自身的語義,這種思路叫做「元循環」(metacircular)。例如說用Java實現的JVM就是元循環JVM。

元循環的實現要能自舉,最關鍵的一點還是得有編譯器。

Sun Labs在1997年左右做過一個JavaInJava項目,使用純Java來編寫一個Java位元組碼解釋器,然後在項目的總結論文里提到這種做法無法實現自舉,限制了項目的實用性。

然後IBM做的Jalape?o項目也是用純Java寫的JVM,但它的執行引擎就不是通過用Java實現一個Java位元組碼解釋器,而是通過用Java實現一個Java位元組碼-&>機器碼的編譯器的方式來做的。該編譯器同時承擔起讓該JVM自舉(當作AOT編譯器)以及在自舉後運行時編譯新載入的Java程序(當作JIT編譯器)使用。

這個項目後來改名為Jikes RVM,官網在這裡:Jikes RVM Home

在Jikes RVM之後,還出現過好幾個實用的元循環JVM。Joeq和Maxine VM是最出名的兩個。Intel Labs的Moxie VM本來也有希望,但最終胎死腹中。

這些元循環JVM都吸取了Jikes RVM的經驗,內含用Java實現的Java位元組碼-&>機器碼的編譯器

另外就是,如果一個語言需要帶有運行時系統(runtime system)或者叫運行時庫(runtime library)的話,這部分也要用自己來實現才可以算是真的自舉了。

舉例說,Java的Java源碼-&>Java位元組碼的編譯器javac從最初的JDK 1.0.x系列就是用Java自己實現的,但是大家會習慣性把Java叫做能自舉的語言(實現)么?不會,因為常見的JVM都不是用Java自身實現的。

而像GCC(在轉為使用C++之前的版本)的C編譯器是用C來實現的,大家就覺得它是一種自舉的實現,因為不但編譯器是用C實現的,其配套的運行時庫libc也是用C(和少量彙編)實現的。

像Go 1.5大家說它現在可以自舉了,那也不但是因為Go的源碼-&>機器碼編譯器是用Go自身實現的,而且Go的運行時系統(包括GC在內)也都是用Go(和少量彙編)實現的。


自舉(bootstrap)嘛,很常見的

簡單來說就是你用 a 語言(比如 C++)寫了一個 p 語言的編譯器 c1

然後你再用 p 語言寫一個編譯器 c

用 c1 編譯一遍 c 得到一個 p 語言的編譯器 c2

再用 c2 去編譯一遍 c

你就得到了一個自舉的編譯器


大多數語言都可以

圖靈不完備的不行,比如沒法用 coq 寫自己的解釋器。


自舉, 概念在這 Bootstrapping (compilers)

可以看一下這兩個問題

編譯器的自舉原理是什麼? - 編譯原理

計算機編程語言必須能夠自舉嗎? - 計算機科學

能夠自舉的語言很多,比如C, C++, JAVA, Go, Python等


可以,LISP。


所有圖靈完備的語言都可以,並且很多常見的語言的interpreter都是以本種語言寫的,如python,java?,scheme。

題主可能會想問,那這個recursion豈不是無限循環下去么摔!(比如GNU的full name 是GNU Not Unix,是的就是這麼繞口)

但是其實不是,在self interpret裡面有個概念叫Bootstrapping(不是那個前端庫),意思是在新發明一種語言時,第一個有關他的interpreter是用別的語言寫的。但一旦這第一個完成之後,就可以用這個語言寫一個有關自己的解釋器程序了,之後就可以一直使用語言本身寫的interpreter來解釋自己了。


Common Lisp只需(loop (print (eval (read)))) 解釋器搞定!


lisp就是自解釋


pypy就是這樣乾的,python實現的python解釋器


通用語言大多能自舉,不過一提到自舉第一個想到的還是LISP


推薦閱讀:

突然想到,如果新手們像職業電競選手一樣學編程的話,即使天賦不行是不是也能超越大部分人?
設計一個新的編程語言後,如何實現它?
如何解決代碼中難以重現的BUG?
習得一種編程語言後如何高效地學習其他語言?
一個簡單C語言編程問題?

TAG:編程語言 | 編程 | 編程語言理論 |