2

我有一個(假設的)問題,我認爲解決方案是動態生成代碼。動態代碼生成的選項

我想快速評估用戶輸入的任意數學函數,比如說找到i^3 + 2i^2 + 6i + 1的和i = 1至NN是任意的,i^3 + 2i^2 + 6i + 1也是任意的(它不一定是一個多項式,也可能包含三角函數和其他函數)。假設N可能非常大。我想知道如何快速評估答案,假設我已經解析了用戶對某些字節碼或其他程序可以理解的輸入。

如果可能的話,我還希望我的代碼能夠在不同的操作系統(包括移動設備)上輕鬆編譯和運行。

我已經想到了一些方法:

1)寫一個解釋,在我的字節碼執行每個命令的解釋。這使我可以自由使用任何語言,但速度很慢。 2)用Java/C#編寫並使用動態代碼生成(例如Is it possible to dynamically compile and execute C# code fragments?)。這將會像我直接在我的源代碼中直接寫入函數一樣快速執行,只有輕微的減速,因爲C#/ Java都被JIT編譯爲機器代碼。限制是Java在移動設備上不被廣泛支持,而C#僅限於Windows。

3)爲我使用的任何編譯語言嵌入彙編器/ C++編譯器/編譯器。限制是它不能在移動設備上工作 - 它不會讓我執行數據文件。

4)編寫HTML/Javascript,然後將其嵌入到Web瀏覽器控件中,並將其放入應用程序中(我認爲這是一些人用來製作可在任何地方運行的通用應用程序的方式)。但它也很慢,用Javascript編寫真正的應用程序是一件痛苦的事情。

您認爲哪個選項最適合?或者,也許我應該去混搭,也許我的應用程序代碼將創建並執行生成的Javascript函數?

+0

爲什麼這個標記的JavaScript?你想在javascript中編寫字節碼解釋器或Java/C#編譯器嗎?什麼是您的實際環境 - 您的應用在瀏覽器中執行還是作爲操作系統可執行文件執行?你真的想用你選擇的(什麼?)語言生成可讀代碼來輸出給用戶,還是唯一的目的是評估數學和表達式? – Bergi 2014-09-04 14:53:09

+0

簡單的解決方案:[伸手到網絡](https://www.wolframalpha.com/input/?i=sum+i^3%2B2i^2%2B6i%2B1+over+i=1+to+N ):-) – Bergi 2014-09-04 14:56:27

+0

感謝您的評論;我意識到我不清楚。我的初衷是編寫一個移動應用程序,所以我可以在移動應用程序中嵌入一個Web瀏覽器控件,並讓它顯示該頁面。我將這個問題擴展到桌面,以查看是否有更好的解決方案。唯一的目標是儘可能快地得到數字答案。 – Bernard 2014-09-05 01:26:24

回答

0

在N的大數值上執行這些計算的最快和最簡單的方法是使用原始數學而不是重複求和。

這裏的一個公式來計算各個項目中的表達,執行此在表達的所有項目和完成的操作:

sum x = 1 to N for x^k

H [n]爲第n個Harmonic number

有多種方法來計算H [n]。一些計算所需的最大數量,並生成所有數字,保存所需的其他數值... 或者將系列中的每第10,000個項目存儲在一個文件中,並從最近的項目計算H [n]。

+0

這是有效的,但它僅限於多項式,我希望有一些適用於任何數學表達式的東西(科學計算器可以做的任何事情)。對不起,我沒有在我的問題中明確說明,我會編輯它。 – Bernard 2014-09-05 01:38:10

+1

像科學計算器這樣的任意表達式?我不認爲你想編寫自己的[CAS](http s://en.wikipedia.org/wiki/Computer_algebra_system),而是嘗試找到可以嵌入到應用中的軟件。 – Bergi 2014-09-05 12:11:27

+0

嗯我沒有考慮CAS,但這是一個有趣的想法考慮。當我提到一個科學計算器時,我的意思是一個「愚蠢的」計算器,它以數字方式評估表達式(它不會做代數),所以我不想看看代數分析的「智能」算法。但我認爲你的建議很有趣,所以我會贊成! – Bernard 2014-09-05 14:35:37