2012-11-05 76 views
8

我現在在學習C++,並且我聽說過很多關於嵌入式腳本語言的知識。我想象它完全不同。爲什麼要嵌入腳本語言?

我以爲我會寫我所有的性能有很高的功能在C++,並呼籲他們出來的腳本語言,如Lua中或Python的。

但現在看來,這是周圍的其他方式。 - >在Lua/Python中編寫函數並用C代碼調用它們。

什麼是嵌入在C++語言,而不是在C++編寫的API,並在另一種語言調用這些函數的優勢在哪裏?

例子:

// function in c++ 
int expensiveFunction(){ 
    return 1; 
} 

然後在Python我會調用該函數,我將不得不從C++的性能,但可以在運行時由於Python的運行時解釋的變化。

+0

另一個原因是您可以讓用戶編寫自己的腳本來擴展程序。這是Unix所做的。 –

+2

你在說什麼語境?在視頻遊戲中,引擎在C++中是「封閉的」,但通常情況下,事情是通過腳本語言來控制的,以允許修改。對於像服務器這樣的東西,或者任何想要保持核心關閉但允許用戶創建的擴展的軟件都是如此。但是反過來說,在科學軟件中,Python這樣的編寫起來很簡單,但速度很慢,所以核心函數應該在C/Fortran中。 – tpg2114

+0

@ tpg2114:這正是我所說的。什麼時候應該考慮在C++中嵌入一種語言,而不是用C++編寫核心,並在python/lua中使用它?也許你可以給我一些優點/缺點。 –

回答

4

其實,很多遊戲引擎都喜歡通過嵌入的Lua或Python打造的發動機接口。有這樣的優點:

  • 非程序員可以與引擎接口。
  • 你不需要重新編譯腳本的輕微變化。
  • 腳本中的錯誤可能不會導致整個系統崩潰。

對於希望腳本語言具有彈性但希望獲得C++性能的項目,C++作爲後端非常有用。我還沒有聽說過使用C++作爲前端的項目,並將腳本語言作爲後端。

API風格

我們使用這種風格在我公司的軟件。我們通過一個可以被大多數語言很容易調用的Windows DLL公開一個API。我們特別支持VB和VBA。當後端來自劇本製作者的控制之外時,這非常棒。但是,從腳本製作者的角度來看,很難調試出現的問題。

優勢

  • 強脫鉤從不同的語言
  • 殘疾人專用

缺點

  • 難以調試2個進程

嵌入式風格

該軟件實際上將腳本解釋器嵌入到軟件中。通過這種方式,您可以像使用本機功能一樣公開功能。在這種風格下,腳本製作者和後端程序員通常在同一家公司。傳統軟件也可以使用它來允許其他人擴展應用程序的功能。如果他們共享源代碼,您可以更容易地調試腳本產生的問題。該應用程序還負責處理何時以及如何啓動腳本。但是,爲了支持其他語言,應用程序開發人員必須嵌入其他解釋器。

優勢

  • 更強的耦合
  • 容易調試一個過程

缺點

  • 只有經過批准的語言訪問
+1

我認爲大多數python庫都是用C++編寫的。 –

+1

這就是我所說的。 C++作爲其他語言的後端。這聽起來像他對C++使用腳本作爲後端好奇。 –

+1

對不起,我誤解了你的答案。因爲我想用C++編寫一個簡單的圖形引擎,並在引擎之上構建一個框架(使用「scriping語言」)。所以其他人可以用python/lua編程,但仍然可以獲得C++的性能。我只是感到困惑,因爲我看到了嵌入在C++中的代碼。 –

1

腳本在運行時編譯,而主要的語言會在編譯時被編譯。這將使得使用大型代碼庫相對容易,因爲您不必編譯整個項目來更新簡單的腳本。

+0

我添加了一個例子。我也可以在運行時進行更改,但不添加語言到C++。 –

+0

@MaikKlein我從來沒有見過有人從Python調用C++代碼,它通常是另一種方式,比如從C++調用Lua腳本。 – Rapptz

+0

是的,我只想知道爲什麼?在C++中編寫一個API似乎更合理。 –

1

其中一個原因可能是你想使用一個C++框架,它帶有它自己的主要功能(並且強制你使用它作爲你程序的主要功能)。

在我看來,這是經常的框架的一個不好的設計 - 這是不容易在一個程序中使用不止一個這樣的框架...

這同樣適用於多種腳本語言中的一個程序:只有一個語言可以提供主要功能。所有其他語言都必須嵌入。

注意:使用線程,你可以得到像「多個主要功能」的東西。那麼,不是真正的多個主要功能。但多個事件處理循環。

3

真的,任何一種方法都可以正常工作。問題是哪種方法更適合您的特定應用。

例如,將性能巨大的代碼編寫爲語言的擴展,對於希望其感覺像某人正在使用腳本語言中的較小庫的應用程序來說,效果很好。如果您想爲包含在Python應用程序中的圖形渲染提供一個性能良好的API,這是一條可行的路線。另一方面,如果你有一個幾乎完全用C++編寫的引擎 - 就像一個遊戲引擎 - 並且你想提供一個簡單的方法來掛鉤遊戲引擎而不需要重新編譯,你可以嵌入口譯員。這就是爲什麼吉姆發動機經常寫例如人工智能或腳本語言中的行爲鉤子:例如,改變機器人的「響應時間」,您可以立即看到差異,有時甚至不需要重新啓動遊戲。我相信,這一切都取決於哪一方是「更大」的意圖,但是你可以用Lua或Python做這兩種方法。

1

我曾經將Python嵌入到機器人控制器中。該控制器管理一個處理計算機芯片晶片的機器人,並控制其他各種設備。客戶可以編寫一個Python程序,用於跟上晶圓的位置,打開門,打開和關閉燈,讀取開關等等。或者它可以讀取來自串行線或以太網的指令並將它們轉換爲動作。當然,機器人的精細控制是在C++級別處理的,在實時操作系統上處於最緊急的優先級。

1

除了性能,重新編譯,可維護性之外,另一個原因是代碼安全性。

編譯語言如C/C++是更難(沒有不可能)別人知道你沒有源代碼的精確算法,而腳本(顯然)容易以瞭解它的邏輯,因爲他們在那裏在運行時編譯。