9

一部の C コードを Python コードまたはバイトコードに変換したいと考えています。問題の C コードは、私が純粋にアルゴリズムと呼んでいるものです。プラットフォームに依存せず、I/O はなく、アルゴリズムとメモリ内データ構造のみです。

例として、正規表現ライブラリがあります。翻訳ツールは、ライブラリ ソース コードを処理し、サンドボックス環境で実行できる機能的に同等の Python モジュールを生成します。

どのような具体的なアプローチ、ツール、テクニックを推奨できますか?


注:環境がサンドボックス化されているため、 Python C 拡張または ctypes はオプションではありません。

別のメモ: C-to-Java-bytecode コンパイラがあるように見えます。libjpeg を Java にコンパイルしました。Java バイトコード + VM は CPython バイトコード + VM と違いすぎますか?

4

9 に答える 9

12

率直に言って、非常識なパフォーマンスのペナルティを受けることなく、CをPythonに機械的かつ意味のある形で変換する方法はありません。Pythonは(現在のコンパイラとインタプリタでは)Cの速度に近いわけではありませんが、それよりも悪いのは、Cが得意なこと(ビットをいじる、整数の数学、メモリのブロックを使ったトリック)です。Pythonは非常に遅いです。 Pythonが得意なことは、Cで直接表現することはできません。したがって、直接翻訳は、不条理な点まで、非常に非効率的です。

一般的にはるかに優れたアプローチは、実際にCをCに保ち、Python拡張モジュールでラップするか(SWIGPyrexCythonを使用するか、ラッパーを手動で作成する)、 ctypesを使用してCライブラリを直接呼び出すことです。すでにCであるか、後で追加するものに対するCのすべての利点(および欠点)と、Pythonの任意のコードに対するPythonのすべての便利さ(および欠点)。

それはあなたの「サンドボックス化」のニーズを満たしませんが、とにかくPythonを特にうまくサンドボックス化することはできないことを理解する必要があります。CPythonの多くの労力と変更が必要であり、どこかで小さな穴を1つ忘れると、刑務所が壊れます。Pythonをサンドボックス化する場合は、プロセス全体をサンドボックス化することから始める必要があります。そうすれば、C拡張機能もサンドボックス化できます。

于 2008-09-25T10:12:54.317 に答える
4

indent(1) と ctopy(1) を使用...

言語に関係なく、実行時空間 (CPU) またはメモリ空間 (RAM) の間でさまざまな構造や関数の出力を格納することを常に犠牲にする必要があります。

私が話していることを見たい場合は、素晴らしい言語の銃撃戦をチェックしてください。

ここに例を示します。浮動小数点数を使用せずに浮動小数点演算を使用したいですか?

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

行き詰まらないで、プライマルになり、必要に応じて穴居人の数学を使用してください。

于 2011-07-28T11:09:45.267 に答える
3

最速の方法 (効率ではなく、プログラマーの労力の観点から) は、おそらく既存のコンパイラを使用して C を単純なもの (LLVM など) にコンパイルし、次のいずれかを行うことです。

  • Pythonでそれを解釈します(法外なパフォーマンスペナルティ)
  • それをPythonに変換します(パフォーマンスが大幅に低下します)
  • それを Python バイトコードに変換します (パフォーマンスが大幅に低下します)

C を Python に直接変換することは可能ですが (おそらく、上記のアプローチよりも高速なコードが生成されます)、本質的に C コンパイラのバックエンドを作成することになり、これは非常に大きな作業になります。

編集、後付け: C コードの解析ツリーを取得し、それを Python データ構造に変換し、Python で解釈することは、おそらくさらに手っ取り早い方法です。

于 2008-09-25T10:25:45.470 に答える
1

純粋な Python で C インタープリターを作成しますか? ;-)

于 2009-04-23T17:51:26.330 に答える
0

私は個人的にツールを使用してCコードからumlshemeを抽出し、それを使用してPythonコードを生成します。

このスケルトンから、不要なCスタイルの構造を取り除き始め、メソッドにPythonコードを入力します。

より安全でありながら最も効率的な方法だと思います。

于 2008-09-25T20:29:33.023 に答える
0

まず、既存のCライブラリをPythonの良さでラップして、Pythonモジュールの形式でAPIを提供することを検討します。私は小枝、ctypes、パイレックス、そして最近そこにある他のものを見るでしょう。Cライブラリ自体は変更されません。作業を節約します。

しかし、本当にCに基づいてオリジナルのPythonコードを作成する必要がある場合、使用するツールはなく、脳だけです。Cでは、ポインターを使った面白いトリックやマクロを使った巧妙なトリックなどが多すぎるため、誰かが私に指摘したとしても、自動化されたツールを信頼することはできません。

Pyrexについて触れましたが、これはCに似た言語ですが、Python指向でもあります。私はそれをあまり使っていませんが、ガイドとしてCから始めていることを考えると、純粋なPythonを書くよりも簡単かもしれません。

IDL(科学者が他のIDLではなく使用するのが好きなデータ言語)などのより制約のある、より使い慣れた言語からの変換は難しく、手作業と精神的な努力が必要です。C?それを忘れてください、UFOの人々が私たちの最先端の1000年先を行く彼らの素晴らしいソフトウェアツールを私たちに与えるまでは!

于 2008-09-25T10:07:47.620 に答える
0

Pythonの機能を使用しないと、自動翻訳に問題が発生します。Cタイプの手続き型コードをPythonに直接変換すると、実行速度が非常に遅くなります。セクション全体をプロファイリングして、Pythonに最適化されたコードに置き換える必要があります。

于 2008-09-25T10:16:49.487 に答える
0

C コードを保持し、実行中の Python 環境にインポートできるPython C モジュールを作成しないのはなぜですか?

于 2008-09-25T10:00:14.003 に答える
-1

いつでも C コードをコンパイルし、Python で ctypes を使用してライブラリにロードできます。

于 2008-09-25T18:52:54.737 に答える