1

這是一個棘手的問題,我不確定它的適當術語(如果有的話)。我很好奇語言允許你在程序執行過程中「建立」一個字符串,然後作爲程序的一部分執行它。我所知道的唯一一種可以讓你做到這一點的語言是Snobol。生成字符串並在運行時將它們作爲程序執行

閱讀Tcl的維基百科條目然而,它聽起來像它也許能夠做到這一點?

我一直認爲這是一個漂亮的功能,即使它可能沒有太多用處。謝謝。 PS:會用Snobol,Spitbol標籤,但沒有聲望去創建新標籤。

回答

5

我很好奇哪些語言允許您在程序執行期間「建立」一個字符串,然後將其作爲程序的一部分執行。

尋找能支持eval語言,或者更一般地說,運行時元編程。幾乎所有的語言都支持eval(即使是強大的靜態類型語言,如Haskell)。針對主要通過字節碼 解釋(如類似Lisp的語言,Erlang或Java)實現的語言構建的許多運行時支持在運行時插入新(字節)代碼的能力。一旦你可以動態地插入新的代碼,你可以寫eval,或做「猴子修補」。

即使在沒有完全支持元編程甚至動態鏈接的語言實現中,通常也有通過反射機制或代碼生成支持庫(如LLVM)在程序員控制下動態生成代碼的方法。

不僅僅是一個簡單的單級eval,更一般地,支持多階段計算允許生成程序從一個階段到下一階段,對階段的任意數目的語言,使其能夠安全地,隨意巢evals

引用塔哈,誰的thesis on multi-stage programming模型介紹了很多理論。

程序生成是一種用於軟件開發的強大且普遍的技術。它已被用於改善代碼重用,產品的可靠性和可維護性,性能和資源利用率,和開發人員的生產力

你要找的通常會提供三個原始的語言,以某種形式:

  • 延遲
  • 拼接
  • 運行

由一個ST延遲計算年齡(例如將片段引用爲字符串),將其拼接成正在運行的程序,並執行該片段(在Lisp,back-quote,逗號和eval中)。

Lisp和EVAL

  • 麥卡錫,約翰,History of LISP,SIGPLAN不是。 1978 - 引入eval

歸納EVAL到多階段編程

在多階段編程:

  • 塔哈Multi-Stage Programming: Its Theory and Applications
  • 尼爾森,弗萊明和Nielson,HANNE Riis,兩級功能語言 - 引入2級語言。
  • Taha,Walid and Sheard,Tim,具有顯式註釋的多階段編程 - 支持所有運行時元編程技術的簡單運算符。

給予類型多階段編程

多級計算的形式化的描述是相當棘手,和涉及異常技術(編程語言)等模態邏輯。

給予類型元方案:

  • Wickline,菲利普和利,彼得和Pfenning,弗蘭克和戴維斯,羅文,模態類型,分期規範運行時代碼生成。

安全問題

formalzing多級的語義的trickiness編程解釋了爲什麼他們經常混淆系統一起工作,爲什麼eval可以開闢這麼多的安全問題:它成爲不清楚什麼時候執行代碼,以及哪些數據正在變成代碼。從一個階段到下一個階段獲取名稱是非常棘手的,導致代碼注入攻擊。這種複雜性不利於安全。

+1

我完全無語,這個答案是驚人的,給我留下了很多調查。在幾年前我涉足Lisp的時候,也許是時候重新打開這些書了。非常感謝Don,你越走越遠。 – jparanich 2011-04-11 18:53:38

3

絕對可以用很多解釋型腳本語言來完成。有些語言是專門爲此設計的。這是可以做到,據我所知,在:

  • 的Perl
  • PHP
  • Lisp語言(方言,如CL,Clojure的,計劃等)
  • 的JavaScript
3

它可以在所有Lisp方言中完成,其中此功能源於名稱eval以及Prolog(call/1)和任意數量的其他語言。大部分保留名稱eval,大部分是動態語言

這就是說,這幾乎不是漂亮功能。我認爲這是一個重大的安全問題,因爲濫用此功能非常容易。如果你想要動態代碼執行,那麼編寫你自己的,受限制的微解釋器(或使用像Lua這樣的東西)幾乎總是一個更好的主意。

相關問題