2

我在閱讀以下演示文稿: http://wingolog.org/pub/qc-2012-js-slides.pdf 其中談到(4,10,19)內聯ASM生成作爲Javascript優化中使用的技術。執行生成的彙編程序內聯

在下面的紙張: https://sites.google.com/site/juliangamble/Home/Compilers%20Tutorial%202006-09-16.pdf?attredirects=0&d=1 在第30頁和31只講使用方案來產生,其隨後連接並且在隨後的OS處理中執行ASM。

如果您想要在現有流程中生成ASM並執行它,情況如何? (即沒有後續的鏈接並在單獨的步驟中執行)。這可以歸結爲(例如在C語言中)生成ASM,將字節寫入內存區域(代碼作爲數據)並添加函數頭並返回(與C調用程序兼容(類似於C調用程序到我們在上面的Goloum紙上看到的第3頁),然後我們將該數據指針轉換爲函數指針並將其稱爲(代碼爲代碼 - 代碼爲數據)。 (a)這種內聯代碼生成和執行的術語是什麼?

(b)有沒有一個簡單的「hello world」C例子?

+0

我會稱它爲即時(JIT)編譯。許多Scheme實現都使用它,例如Racket和Larceny。 –

+0

這是非常相似的這個問題http://stackoverflow.com/questions/3073653/can-function-pointers-be-used-to-run-data(但沒有例子) - 他們稱之爲自修改代碼 - 我不確定我是否同意我的案例中的分類 – hawkeye

回答

1

有一個很好的例子here。他們再次使用自修改代碼的術語。其他here

Here他們給它四類(用例):

  • 變質
  • 蹦牀
  • JIT編譯
  • 安全隱患(不安全編碼/惡意軟件)

有關於LISP是否真正自我修改的討論here - 他們最終得出結論,它不是。