2013-06-25 68 views
4

我一直在考慮this writing (apparently) by Mark Twain,他開始用英文寫作,但整篇文章都改變了拼寫規則,最終他最終得到了一些可能被最好地描述爲僞德語的東西。是否有任何解釋語言可以在其中動態修改解釋器?

這讓我想知道是否有一些既可以訪問解釋器本身的既定語言的解釋器,以便隨時隨地更改語言的語法和結構。例如,if子句通常是一個關鍵字;有沒有一種語言可以讓你在飛行中改變或重新定義這種語言?想象一下,用一種語言開始一個控制檯會話,最後在另一種語言中工作。

很明顯,人們可以寫一個解釋器並運行它,也許在做這件事和修改解釋器之間沒有具體的區別。我不確定這一點。對於任何給定的解釋器動態修改可能有限制嗎?

除了這些更開放的問題,我只想知道是否有任何已知的解釋器允許這樣做?或者,也許這種能力只是一個問題,我的問題很糟糕。

回答

5

在語言語法層面本身可能存在這種自修改行爲的語言肯定存在。其中允許在運行中創建新的控制結構,以至於依賴於廣泛的宏編程的兩個Lisp程序看起來幾乎就像用兩種不同的語言編寫的程度一樣。 Forth在某種程度上類似於a Forth interpreter provides a core set of just a dozen or so primitive operations,其中一個程序必須以問題領域的語言構建(通常是某種真實世界的交互,必須通過工業機器人來精確和程序化地完成)。 Forth程序員創建了一個解釋器,用於理解特定於他或她正試圖解決的問題的語言,然後用該語言編寫更高級的程序。

一般來說,這裏的共同思想是對待code and data as equivalent的語言或系統,併爲用戶提供相同的修改功能。例如,每個Lisp程序都是一個Lisp數據結構。這與Java等語言形成鮮明對比,在這種語言中,程序代碼與其操作的數據之間存在明顯的區別。

一個相關的主題是self-modifying low-level code,它在minicomputers with complex instruction sets的日子裏是彙編語言程序員中相當常見的技術,並且在某些早期的8位和16位微處理器領域有所發展。在這種編程習慣用法中,爲了節省速度或節省內存,編寫一個程序的時候應該知道它的編譯或解釋指令將被存儲在內存中的位置,並且可以改變實際的機器級指令字節以字節爲單位來影響其在飛行中的行爲。

2

Forth是我能想到的最明顯的事情。它是連續的和基於堆棧的,基本原子是一個單詞。所以,你寫的話流,他們在其中他們與棧明確地操縱效果參數傳遞,結果等書寫順序進行這樣一個簡單的程序福斯可能是這樣的:

6 3 + . 

這是詞6,3,+.。這兩個數字將它們的值推入堆棧。加號從堆棧中彈出最後兩項,並添加它們並推送結果。完全停止輸出堆棧頂部的任何內容。

Forth的一個基本部分是您定義自己的單詞。由於所有單詞都是運行時的第一類成員,因此實際上可以構建特定於應用程序的語法。在定義了相關詞後,您可能會得到如下代碼:

red circle draw 

那將繪製一個紅色圓圈。

當它遇到它們時,它會對每個單詞序列進行解釋。但是,它區分編譯時和普通單詞。編譯時間的單詞就像是將一系列單詞編譯並存儲爲一個新單詞。所以這相當於以經典的過程語言定義子程序。它們也是控制結構實施的手段。但是你也可以定義你自己的編譯時單詞。

作爲一個淨結果,Forth程序通常定義其整個語法,包括相關的控制字。您可以閱讀basic introduction here

+0

[因子](http://factorcode.org/)是另一種具有可塑語法的連接語言。不過,它的語義更像是Lisp而不是Forth。 –

2

Prolog是homoiconic language,允許以各種方式拒絕元譯員(MI)。元解釋器 - 解釋解釋器 - 是Prolog中常見且有用的本地構造。

請參閱this page瞭解這個論點。示出的一個有趣的和實用的技術是部分執行

通過使用多邊實施這些事情發生的開銷可以使用部分的評估技術被編譯程。

+0

爲什麼地球上這是低調? –