2008-09-25 205 views
8

我想將一些C代碼翻譯成Python代碼或字節碼。所討論的C代碼就是我所說的純算法:獨立於平臺,無I/O,算法和內存數據結構。將算法C翻譯爲Python

一個例子是一個正則表達式庫。翻譯工具將處理庫源代碼並生成功能相當的Python模塊,該模塊可以在沙箱環境中運行。

您可以推薦哪些具體的方法,工具和技術?


注:Python的C擴展或ctypes的是不是一個選項因爲環境是沙箱。

另注:看起來像有一個C-to-Java-bytecode compiler,他們甚至的libjpeg編譯爲Java。 Java字節碼+虛擬機與CPython字節碼+虛擬機的區別太大了嗎?

回答

0

爲什麼不保留可導入到運行的Python環境中的C代碼和creating a Python C module

+0

Python C擴展不是一個選項,因爲環境是沙盒。我更新了問題以反映這一點。 – Constantin 2008-09-25 10:11:44

0

首先,我會考慮用Pythonic善良包裝現有的C庫來提供一個Python模塊形式的API。我會看看swig,ctypes,pyrex,以及這些日子裏的其他事情。 C庫本身會保持不變。節省工作。

但是,如果我真的必須編寫基於C語言的原始Python代碼,那麼我不會使用任何工具,只是我的大腦。 C允許使用指針的太多有趣的技巧,使用宏的聰明的事情等,即使有人指出我自己也不會相信自動化工具。

我提到Pyrex - 這是一種類似於C的語言,但也是面向Python的。我沒有做太多的工作,但是它可能比編寫純Python更容易,因爲你從C開始就是一個指南。

從更受限制的馴化語言(如IDL(科學家喜歡使用的數據語言,而不是其他IDL))轉換很困難,需要人工和精力。 C?忘記它吧,直到UFO的人們給我們他們花哨的軟件工具,比我們的藝術水平還要快上千年!

+0

「宏魔法」不是一個基本問題,它可以通過一個預處理程序來消除。 – Constantin 2008-09-25 10:14:26

12

坦率地說,沒有辦法機械地和有意義地將C轉換成Python,而不會遭受瘋狂的性能損失。我們都知道Python並不是C速度附近的任何地方(使用當前的編譯器和解釋器),但更糟糕的是C的優勢在於(比特搗弄,整數數學,內存塊技巧),Python非常緩慢,而Python擅長的東西無法直接用C語言表達。因此,直接翻譯會更加低效,甚至荒謬。

一般的多,更好的方法是確實保持C中的C和Python擴展模塊(使用SWIGPyrex,或writing a wrapper manually)在其包裝或致電C庫直接使用ctypes。 C語言的所有優點(和缺點),用於已經C語言或稍後添加的內容,以及Python的任何代碼在Python中的所有便利(和缺點)。

這並不能滿足你的'沙箱'的需求,但你應該認識到,你無論如何都不能很好地使用Python的沙箱,它需要花費很多努力和修改CPython,如果你在某個地方忘記了一個小洞,那麼你的監獄就會被打破。如果你想使用沙盒Python,你應該先對整個過程進行沙箱化,然後C擴展也可以使用沙箱。

0

任何自動翻譯將會因爲沒有使用Python的力量而受到影響。如果直接將Python轉換爲Python,C類程序代碼運行速度會非常緩慢,您需要使用更多Python優化代碼來剖析和替換整個部分。

3

最快的方式(在程序員的努力,而不是效率方面)可能會涉及使用現有的編譯器來編譯C簡單的東西(例如LLVM)和兩種:

  • 解釋說在Python(過高性能損失)
  • 翻譯是對Python(巨大的性能損失)
  • 那意思就是Python的字節碼(大的性能損失)

茶將C直接植入Python是可能的(並且可能會產生比上述方法更快的代碼),但是您本質上是編寫C編譯器後端,這是一項艱鉅的任務。

編輯,事後考慮:或許更快捷的方法是將C代碼的解析樹轉換爲Python數據結構並在Python中解釋它。

+0

我確實想到LLVM,但沒有想到會解釋它。好點子。 – Constantin 2008-09-25 10:32:12

+0

好吧,也許在Python中直接解釋C語言分析樹會更容易 - 在編輯中添加。 – 2008-09-25 10:54:23

-1

您可以隨時編譯C代碼,並使用python中的ctypes加載庫。

+0

不是我低估了你,但我能理解爲什麼 - 請注意這個問題。目標環境是沙盒,只接受純Python模塊。 – Constantin 2008-09-25 20:56:06

+0

同意..我的錯。 – 2008-09-25 23:18:34

0

我想personnaly使用工具從C代碼中提取一個uml sheme,然後用它來生成python代碼。

從這個squeleton,我開始擺脫不必要的C風格的結構,然後我會用python代碼填充方法。

我認爲這將是更安全,但最有效的方式。

1

在純Python中編寫C解釋器? ;-)

4

使用indent(1)和ctopy(1)...對於pypy上額外的信用測試速度...對於獎金信用使用pyastra生成彙編代碼。無論語言如何,您都必須犧牲存儲運行時間空間(CPU)或內存空間(RAM)之間各種構造和函數的輸出。

檢查偉大的語言槍戰,如果你想看到什麼我談論無論哪種方式,這實在是太多了基本的計算機科學勢利......

下面是一個例子,想用浮點運算,而無需使用浮動點數?

x * 1,000,000 = a 
y * 1,000,000 = b 
a {function} b = result 
result/1,000,000 = z 

不要陷入泥潭,得到原始的,使用穴居人數學,如果你必須。