這可能是一種基本的但是......在這裏。將語言嵌入到另一個語言中是做什麼的?
如果我決定通過鏈接它的解釋器將Lua或Ruby之類的腳本語言嵌入到C++程序中,那麼我可以在C++中做什麼呢?
我能將Ruby或Lua代碼寫入cpp文件嗎?或者直接調用程序中的腳本?
如果後者是真的,我該怎麼做?
這可能是一種基本的但是......在這裏。將語言嵌入到另一個語言中是做什麼的?
如果我決定通過鏈接它的解釋器將Lua或Ruby之類的腳本語言嵌入到C++程序中,那麼我可以在C++中做什麼呢?
我能將Ruby或Lua代碼寫入cpp文件嗎?或者直接調用程序中的腳本?
如果後者是真的,我該怎麼做?
因爲他們是腳本語言,代碼總是會被「解釋」。實際上,你不是在程序中「調用」腳本代碼,而是當你達到那個點時,你在那個線程的上下文中執行解釋器(到達腳本部分的線程),然後讀取腳本語言並在解釋它之後執行適用的機器代碼(JIT編譯類型,但不是真的,不涉及編譯)。
由於這個原因,它與分解解釋器並運行腳本基本相同,除非您想從編譯的程序中訪問已編譯程序中的變量/腳本中的變量。爲了訪問值,因爲你使用的是具有已編譯程序上下文的線程,所以你應該能夠將腳本變量存儲在堆棧中,並在線程停止運行解釋器時訪問它們(假設你存儲了變量在堆棧上)。
編輯:回覆:
你必須自己寫。這樣想一想:如果你想在C++中使用匯編,你可以使用asm關鍵字。然後在C++編譯器中,需要解析源文件,轉到asm關鍵字,然後切換到彙編編譯器。然後程序集編譯器需要直到asm區域的結束括號並編譯該代碼。
如果你想這樣做,它會有點不同,因爲程序集被編譯,而不是解釋(這是你想要做的)。你需要做的是改變你使用的編譯器(可以說C++),以便它能識別你自己的用戶定義的關鍵字。可以說這個關鍵字是scriptX {}。您需要更改C++的解析器,以便當它看到scriptX {}時,它會將編譯程序的只讀數據部分中括號內的所有內容存儲起來。然後,您需要在編譯後的程序集文件中添加一個鉤子以將線程的上下文切換到腳本解釋器,並在腳本部分的開始處啓動程序計數器(將其放入目標文件的只讀數據部分) 。
與好運...
一個常見原因嵌入的腳本語言到程序是爲控制與最終用戶提供的腳本程序的能力。
這種腳本的最簡單的例子可能是配置文件。假設你的程序有選項,並且需要記住從運行到運行的選項。您可以將它們作爲選項結構的二進制圖像寫入文件,但這會很脆弱,不易檢查或編輯,並且可能無法跨系統移植。用純文本編寫選項,其中某些標籤可解決大多數投訴,但現在需要解析該文本並恢復選項。然後一些用戶在星期二想要不同的選項,想做簡單的算術來計算另一個選項,或者編寫一個可以在Windows和Linux上使用的配置文件,很快你會發現自己發明了一種小語言來表達所有這些想法和機制與。在這一點上,有一個更好的方法。
語言Lua和TCL都基本上是由這種情況發展而來的。較大的系統需要由最終用戶進行配置和控制。最終用戶希望編輯一個簡單的文本文件並立即獲得滿意,即使(特別是)處理可能需要數小時才能成功編譯的大型系統時。
這裏的一個優勢是,不是隨着用戶需求的變化一次創造出一種功能的編程語言,而是從一個完整的語言和文檔開始。語言設計人員已經爲您做出了許多艱難的決定(我怎麼表達字符串和數字,列表如何,列出了什麼,名稱值如何,if
是什麼樣子等等),並且通常還帶來了精心設計和調試執行到表格。
Lua特別容易集成。讀取簡單的配置文件並從Lua狀態中提取設置可以使用C API的一小部分來完成。一旦你有Lua可用,將它用於其他目的是有吸引力的。在很多情況下,你會發現只用C編寫最內層的循環會更有效率,並使用Lua將這些函數粘合在一起,並提供應用程序的所有「業務邏輯」。這就是Adobe Lightroom的實施方式,以及從簡單的機頂盒到iOS設備甚至個人電腦的各種平臺上的許多遊戲。
所以我基本上讓我的程序既是程序又是解釋器?我猜測從這樣的設置調用腳本的函數會在腳本語言doc中的某處? – benbot