2012-02-27 23 views
2

現在、擬似C++構文を使用して作成したインタープリタを作成しています。私はインタプリタによって作成された変数を格納する最良の方法を探しています。C++インタプリタで変数を動的に割り当てる最も良い方法

現在、私はこれらの変数へのポインタを格納する動的配列を使用していますが、確かに良い方法がありますか?多分、ある種のインラインアセンブラコードがメモリブロックを制御するでしょうか?

私は主要なOSごとにこれらのコードを書き直したいので、移植性についてあまり気にしません。私は単なるタイプにロックされていないメモリブロックを作成する方法を探しています。現在のテストでは、Windows上でMingWコンパイラを使用しています。

アイデアをお待ちしております。

+1

あなたのために何が良いですか?もっと早く?メモリを消費しますか?よりエレガントに実装するには? –

+0

ヒープを管理する方法やスタック上のものを割り当てる方法(言語がサポートしている場合)現在のソリューションの問題点は何ですか?パフォーマンス? – Dervall

+0

@BjornPollex:私は自分のコードをとてもうまくコメントするので、読みやすさについてあまり心配していません。より速くなるという点でできるだけエフェクティブにしたいと思っています。メモリの使用は、私は非常に心配していない – aggregate1166877

答えて

3

私はあなたの言語があなたが通訳でやることのできる仕組みに非常に依存していると思います。これが真のインタプリタであり、プリコンパイルのステップがない場合は、通常、スタックとヒープの割り当てという2種類の割り当てがあります。スタックに物を割り当てることをサポートしている場合は、これをインタープリタのスタックとして実装する必要があります。

スタックバッファとしてvector<char>を使用してください。入力された各スコープを追跡し、マーカーをスタックに配置します。スタックに割り当てられた変数に遭遇したら、新しいローカル変数に対応するようにスタックを拡張します。オブジェクトが必要な場合は、配置をnewで初期化します。

辞書をある種の辞書に追加して変数名とメモリ空間を一致させることで、文脈で与えられた名前がどこにあるかをコードが知るようにします。実際にシンボルテーブルのように、実行時にのみ保持されます。

スコープの最後に出会ったら、必要に応じてローカルに割り当てられたすべてのシンボルのスタックをポップし、デストラクタを呼び出します。また、スコープ内に存在しないため、シンボルテーブルからすべてのエントリを削除します。この方法では、ヒープ上で使用されていないオブジェクトのヒープ割り当てを完全に避けることになります。

1

これを行うためにインラインアセンブラコードは必要ありません。 vector<char>をバッファーとして使用し、placement newを使用してオブジェクトを構築することができます。この手法では、手動割り当て管理の領域に入ることに注意してください。断片化を扱うなど、さまざまな問題が発生します。

+0

このご意見ありがとうございます。私は確かにそれを調べます – aggregate1166877

+3

@ user1166877:メモリ割り当てに関する細かいことを扱うために、ブーストプールライブラリを見てください:http://www.boost.org/doc/libs/ 1_47_0/libs/pool/doc/index.html – Robert

1

私が見つけた最も簡単な解決策はstd::map<std::string, Variant>です。文字列には変数名が格納され、Variantboost::variant<all-interpreter-types>のtypedefです。これにより、globals["foo"]=1;のような簡単なコードが可能になります(インタプリタ変数fooint, 1に設定されます)。

確かに、おおよそ同じコードを書くことができますが、はメモリを気にする必要があります。

関連する問題