解釋性語言存在的意義?

為什麼語言要整一個解釋性的語言?不是編譯型的語言效率更好嗎?像php為嘛不寫個編譯器。用解釋器。難道解釋器的編寫比編譯器更容易?


對於軟體來說,性能不代表全部需求。解釋性語言有各種各樣的優勢。舉幾個例子:

1. 很多 PC 遊戲都是 C++ 寫的,但提供的 MOD / CDK 介面都是用 Lua 這樣的解釋性語言。因為 MOD 開發者可能不是很懂 C++ 編程,解釋性語言往往很簡單就能上手,解釋器可以內置在遊戲當中,用編輯器編輯好複製到遊戲的 MOD 文件夾里就能用。而如果用 C++ 和 Java 來做,則要安裝很多東西,編譯器什麼的,甚是麻煩。

2. 網站開發也是經常用解釋性語言。對於中小型網站,並不是那麼追求性能,解釋性語言可以更加快速地進行開發,節約寶貴的人力。解釋性語言通常都支持動態類型,所以 PHP 寫起來比 Java 更容易,更快,更簡潔。用 PHP 可以一個星期就做一個基本系統出來,但是用 Java 或者 C++ 可能就沒這麼快了。

3. 如果編譯成二進位程序,那麼就必然會受制於操作系統和處理器架構。比如 PHP 寫的 WordPress ,同一份下載可以在 Linux 也可以在 Windows Server 上運行,從 ARM 到 X86 甚至 MIPS 都能跑。但是如果 C++ 分發二進位包,那就要提供好幾種了,Windows x86,Windows ARM,Linux PowerPC,Linux MIPS 等等。如果 C++ 分發源代碼,那麼就要費力去編譯了,還不一定能編譯成功。

Facebook 也是用 PHP 的,他們的 PHP 就是編譯型,用他們特製的 PHP 編譯器,提高了執行效率。但是 Facebook 是大公司,所以才有人力做這些事。普通的業務來說,PHP/Ruby/Python 的效率已經足夠他們的需求了,大不了多花幾個錢買個快一點的伺服器。

Ruby 的作者說,解釋型語言的哲學,是節省人的時間,而不是節省機器的時間。


編譯器要面對各種硬體架構,開發工作量肯定要比解釋器大不少.

一些用PHP實現的模板引擎如Smarty,本質上也算是一個解釋器.

理論上用PHP也應該可以參考編譯器的演算法生成程序的機器碼.

解釋型語言開發和部署簡單,而且通用,比如不管什麼平台:

只要有瀏覽器,就能解釋執行HTML/CSS/JS.

只要有PHP解釋器,就能解釋執行PHP,所以Android/iOS上都能跑PHP程序(包括網站).

只要有JVM虛擬機,就能解釋執行Java位元組碼.

有一些解釋型語言為了優化速度,加入了運行時編譯熱點代碼到本地機器碼的機制,比如JVM的HotSpot JIT編譯器,比如Chromium的JS V8 JIT編譯器,比如PHP正在基於LLVM/JIT搞的Zend-JIT編譯器(php-src/Zend/bench.php測試中,PHP JIT計算速度是PHP 5.4的10倍).

為了方便開發,部署和通用,在某些場景犧牲部分性能完全可以接受.


世界上哪有什麼編譯型語言,CPU不就是個解釋器嗎?


其實不用回答太多東西,解釋性語言的一切優點和缺點,都是因為它多了一個「中間層」(翻譯性語言是把字元組成的代碼直接翻譯成機器能看懂的機器碼所以翻譯性語言沒有「中間層」)。所以呢,解釋性語言就可以基於這個「中間層」的存在而構建出語意層面的邏輯 ---- 簡單點說就是用語言去控制語言本身。

比如,Python可以這樣:

if some_module is changed:

reload

一般人把這個叫「熱啟動」之類的名詞,說白了就是「你可以修改代碼而不需要重新編譯」。

更本質地說,解釋性語言就是犧牲一點點性能換取程序員的方便。在一般情況下,這點被犧牲的性能完全可以忽略不計。


解釋性語言就是靠犧牲性能來獲取靈活性和簡潔性,絕大多數應用場景下,性能差一點點並不是什麼大不了的問題。


lz有些東西搞混了。

語言是語言,比如java是靜態類型語言,php是動態類型語言。

解釋和編譯是兩種編譯器實現方式。php也可以編譯成機器碼如facebook的hiphop,當然做的效果不咋地。java官方的實現反而是解釋執行的。但是也有非官方的編譯實現,比如已死的項目gcj等。

我揣測lz聖意其實是想問為毛動態類型語言有存在的意義。建議改下題目。

接下來我就回答下動態語言存在的意義。那就是某個時期的過度。動態語言是非常不健康的發展方向,等未來靜態類型語言越來越不那麼啰嗦後(比如類型推斷,比如完善的開箱可用的庫),動態語言會不再被人需要。


解釋器的編寫比編譯器更容易?

你想的是對的。解釋器有很多是用編譯型語言寫的甚至你可以把他當成翻譯器(translator).一串字元串通過你的解釋器做出一些翻譯變成目標代碼當然性能肯定比不上你直接寫編譯型語言。

但是效率肯定不是解釋型語言存在的意義。你可以增加各種語法糖或魔幻的parser比如ruby,可以加進各種方便的庫比如python。而編譯型語言想要做到隨便的修改功能,比如加個關鍵字,就不那麼容易了。總的來說解釋器就是為了人更方便的使用而不是效率。

我寫的解釋器,歡迎提出意見 GitHub - wangxiaozhi123/Nee


朋友,聽說過ELF解釋器嗎?


編譯型的語言需要大量靜態的細節指導編譯器獲取足夠的信息,如類型提示。但在某些場景下帶來的收益很低。最近幾年,所有的語言似乎又開始匯聚在一起了,可能以後不存在這個問題了


跨平台、易修改、靈活性高、合理利用性能能過剩的資源...


推薦閱讀:

為什麼沒有國產的C/C++的編譯器?
在獨自實現一個小型編譯器中你遇到過哪些困難?
ANTLR涉及編譯原理中的哪些部分?
函數的局部變數在棧中是如何分布的?

TAG:PHP | 程序 | 編譯原理 |