2011-04-18 41 views
11

我正在尋找一種方法來編寫和維護某個算法(實際上是我的代碼的一個圖形渲染子模塊),只有一次。我需要C++,PHP和Javascript中的算法。理論上我可以用C++編寫它,並將其包裝到PHP擴展中;但是它本身有很多問題,並沒有解決Javascript鏈接。元編程到幾種輸出語言

我在找什麼,我認爲是一種從語言(無論哪一個)轉換成三個(或兩個,如果源語言是三種語言之一)輸出語言的工具目標。我發現MetaL(http://www.meta-language.net/)似乎做我想做的,但也看起來死了(自2007年以來沒有更新),只針對我需要的三種語言之一。它需要非常靈活,並允許我更新結果 - 例如,我在C++和PHP渲染中使用Cairo,在Javascript端使用HTML Canvas。所以我需要爲API定製特定的效果。

或者,我會解決一個PHP解析器和詞法分析器,它會給我一個帶足夠信息的AST,以便爲C++和Javascript編寫生成器作爲替代後端。

任何想法?謝謝。

+1

你的問題讓我想起了舊的引用:_有些人在遇到問題時想「我知道,我會用正則表達式。「現在,他們有兩個問題。我明白你的意願來集中維護,但聽起來像你正在採取一個有點煩人但合理的問題,並把它變成一個非常複雜的問題。 (我正在考慮自動構建,翻譯引擎問題以及您即將進入的調試問題) 想想那些在您移動之後必須維護此解決方案的可憐傢伙。 – NightDweller 2011-04-18 13:07:11

+0

如果你最多隻談論幾千行代碼,你最好仔細設計API並簡單地重新編碼它們。在語言中發現的所有奇怪事物(例如,C++:類,多重繼承,命名空間,單獨聲明/定義,宏,模板,重載等)的自動代碼生成是一項艱鉅的任務,不是值得幾千行的努力。如果你想產生100K SLOC,那麼這將是非常值得的,或者你用任意方式編寫代碼片段。但3個固定算法的副本?不要以爲它值得麻煩。 – 2011-04-19 04:02:09

+0

我可以將自己限制在一個語言的小部分中來編寫它。我顯然不需要將C++的所有細微差別翻譯成多種語言。渲染是90%'計算像素,矩形或圓的位置,計算它的顏色,調用繪製API函數'。它不一定是通用的。無論如何,它看起來像haXe會做我所需要的。 – Roel 2011-04-21 16:26:55

回答

5

你可以看看haXe。 haXe是一種開源編程語言。它可以編譯爲JavaScript,Flash/ActionScript,php5,C++,以及將來的Java,C#。

+0

啊哈很好,謝謝,我在Google上沒有找到。 – Roel 2011-04-18 12:02:10

1

也許看看'編碼'您的原始算法在XML和使用各種XSLT模板輸出到您的目標語言?或者可能是antlr(http://www.antlr.org/ http://www.amazon.com/Definitive-Antlr-Reference-Domain-Specific-Programmers/dp/0978739256/ref=sr_1_1?s=books&ie=UTF8&qid=1303114884&sr=1-1)。

+0

是的,這或多或少是MetaL試圖做的,我想,只是沒有我能告訴的xslt。我對xslt沒有太多的好經驗,所以我會跳過這一點,但也許我可以做一些簡單的其他xml->代碼轉換...謝謝。 – Roel 2011-04-18 12:03:23

2

的Emscripten項目(我只在上週發現)你可能感興趣的:http://syntensity.blogspot.com/2011/04/emscripten-10.html

這傢伙基本上已經寫了一個編譯器編譯爲Javascript代碼C/C++。

這應該解決你的問題的Javascript方面。

希望有所幫助。

另一個產品沿着同樣的路線,更爲人熟知的是Google Web Toolkit(GWT)。它基於Java,但最終的結果是相似的 - 您使用Java代碼編寫Web應用程序,並將前端部分編譯爲Javascript,將後端部分編譯爲常規Java字節碼。我知道你不是要求Java,但如果它感興趣,鏈接在這裏:http://code.google.com/webtoolkit/

稍微有用,但可能與您的問題更相關的是PHPJS。這是一個用Javascript儘可能多地實現PHP語言的項目。他們在逐個函數的基礎上進行,所以它只是一個近似值,但是鑑於語言語法是相似的,可以使用它來編寫在原生PHP中工作不變的代碼,並且也在客戶端使用Javascript。

當然,將一種語言編譯爲另一種語言的一個重要缺陷是,生成的代碼總是不夠優化。關於這一點你可以做的事情不多,但在開始用單一語言編寫共享代碼庫的路徑之前,應該記住這一點。

+0

謝謝,Emscripten看起來非常相關。我猜如果它有一個javascript後端,PHP後端應該不會那麼困難 - 特別是因爲我只需要一個非常有限的語言結構子集。 – Roel 2011-04-18 12:01:51

1

也許你可以在javascript中編寫它,然後使用C++和PHP javascript解釋器。

+0

有趣的想法,謝謝。 – Roel 2011-04-18 11:59:24

+0

@Roel:「渲染」通常是計算密集型的。面對計算密集的任務,建立一個解釋器來做到這一點對我來說似乎不是一個好主意。 – 2011-04-19 14:03:07

+0

就我而言並不重要。這是值得的權衡。 – Roel 2011-04-21 16:24:25

-1

完全不同的方法是使用匯編代碼。用您選擇的語言編寫算法,將其編譯爲ASM源代碼。然後在部署語言中提供接口包裝器。

當然,這是非常「空氣餡餅」。這取決於如此多的變量,目標平臺的數量,優化的重要性,與實現變​​化相關的界面變化的頻率等等。