2011-02-09 18 views
3

私は任意の関数を可能にするために書いたいくつかの数学的コードを調整しようとしていますが、コンパイル時にあらかじめ定義しておくだけです。私は現在、関数ポインタを使用していますが、同じ問題がファンクタで発生することがわかります。単純な例を提供するために、前方差分分化のために使用されるコードである:最初の2つの関数のいずれかが3番目の引数として渡すことができる実行時にC++関数を定義する

double xsquared(double x) { 
    return x*x; 
} 

double expx(double x) { 
    return exp(x); 
} 

double forward(double x, double h, double (*af)(double)) { 
    double answer = (af(x+h)-af(x))/h; 

    return answer; 
} 

。しかし、私がしたいのは、あらかじめ関数を設定する必要がなく、ユーザー入力を渡すことです(有効なC++で)。どんな助けでも大歓迎です!

+1

だから、あなたは完全に機能するC++コンパイラを構築したいですか? Erm ...これはStack Overflowの範囲をはるかに超えていると私は思う。 –

+0

C++はスクリプト言語ではありません... lua、tcl、pythonなどと統合しようとする可能性があります –

+0

あなたは間違った言語を使用しています。 (C++ 0xはクロージャーを持っていますが、それでもやっかいです。) – delnan

答えて

1

いつでもユーザーの入力を受け取り、コンパイラで実行して、結果のバイナリを実行することができます。もちろん、これは任意のコードを実行する可能性があるため、セキュリティ上のリスクがあります。

ユーザが簡単な関数を定義し、C++で解析して適切なコードを実行できる最小限の言語を考案する方が簡単かもしれません。

+0

ありがとう!私は、ユーザー提供のC++コードを実行することは大きなセキュリティ上のリスクであるとのコメントを書く必要があると考えていましたが、それはあなたがそれを世話してくれたようです。私は誰かがそれを指摘して非常にうれしいです。 – Mac

0

Perlのような他の言語とは異なり、C++はそれ自身の実行時解釈を行うことができません。

ここで唯一のオプションは、実行時にアプリケーションによって動的にロードされる小さな共有ライブラリをコンパイルできるようにすることです。

3

C++は完全にコンパイルされた言語であるため、独自のコンパイラまたはインタプリタを記述しない限り、実際にはユーザー入力をコードに変換できません。しかし、この例では、数学的な式であるドメイン特有の言語のための簡単なインタプリタを構築することが可能である。すべてはあなたが何をしたいかによって決まります。

+0

少なくとも1つのコンパイラでこれを行うことができます。私の答えを見てください。 –

+0

ありがとう、ありがとう。別のユーザが私にmuParserを指摘しました。これは最終的なコードで使用するでしょうが、私自身の式インタープリタの結果を関数に渡す方法を理解することにはまだ興味があります。簡単な説明? – Greg

+0

@ Gregたとえば、演算子()(関数呼び出し)を実装するクラスを作成して、式を解析して得た抽象構文木を渡して、呼び出しをインタープリタに委譲します。 – wendazhou

1

このタイプのタスクには、luaやpythonなどの埋め込み言語を使用することをお勧めします。例えば、提案のためのSelecting An Embedded Language

0

さて、あなたが行うことができる2つのものがある:

  1. は、ブースト/ C++ 0xのラムダのをフルに活用して、実行時に関数を定義します。

  2. 数式のみが必要な場合は、muParserのようなライブラリは、文字列をバイトコードに変換するように設計されています。これは実行時に関数を定義すると見ることができます。

+0

muParserは、仕事に完璧に見えます、ありがとう。私はまだ自分の基本的な方程式の通訳を組み立てて、何が起こっているのかを理解するのに役立つと思う。 – Greg

4

歴史的に、あなたが求めている機能の種類は、C++では利用できませんでした。通常の回避策は、C++以外の言語用のインタープリタを埋め込むことです(LuaとPythonは、C/C++アプリケーションにスクリプトを組み込むために特別に設計されています)。コンパイラなどがありますが、それは変化しています。

Clangは、LLVMを活用してAppleが開発した新しいオープンソースコンパイラです。 Clangは、コンパイラーとしてだけでなく、アプリケーションに組み込むことができるC++ライブラリーとしても使用できるように設計されています。私は自分で試したことはありませんが、Clangで望むことができるはずです。ライブラリとしてリンクし、ユーザーがアプリケーションに入力するコードをコンパイルするように依頼します。

how the ClamAV team already did this, so that new virus definitions can be written in Cをチェックしてみるとよいでしょう。

他のコンパイラについては、GCCが最近プラグインのサポートを追加したことを知っています。それを利用してGCCとアプリケーションを橋渡しすることは可能かもしれませんが、GCCは最初からライブラリとして使用されるようには設計されていないため、難しいかもしれません。私は、同様の能力を持つ他のコンパイラは認識していません。

+0

ここで重要な機能であるLLVMはJITコンパイルをサポートしています。 ClamAVとは別に、私はCLangのための通訳を書くプロジェクトもあることを知っています。ステータスは覚えていません:) –

+0

@MatthieuM:あなたは[Cling](http://root.cern.ch/drupal/content/cling)について考えていると思います。 – refi64

+0

@ kirbyfan64sos:私は確かに:) –

0

tiny C compilerをライブラリ(libtcc)として使用できます。

実行時に任意のコードをコンパイルして読み込むことができますが、CではなくC++でしか動作しません。一般的に唯一の方法は以下の通りです

  • は、コンパイラと、この共有オブジェクトから共有オブジェクトまたはDLL
  • ロードこの共有オブジェクトまたはDLL
  • 使用関数を作成するためのコードを渡します。
0

それはオフブローのように思えますが、多くの商業的な欠陥の多くの、そしてフェイシズなど、すべてのように異なるC++とCのための方程式パーサや通訳を書かれているそこの人々、多くのがあります。 1つの場所は大学の人々が後置翻訳者にインフィックスを書くことです。これらのシステムのいくつかは、括弧で囲まれたグループ分けを使用し、その後、古いHP STLライブラリのようにアイテムをスタックに配置します。私は30秒を過ごし、この1が見つかりました:

http://www.speqmath.com/tutorials/expression_parser_cpp/index.html

可能検索文字列:「gccの 『方程式パーサ』中置を後置する」

関連する問題