C++で単純な動的言語インタープリターを作成しようとしています。動的型付けされた配列を宣言できるようにしたいのですが、C++のオブジェクトにそれらを格納する方法がわかりません。
Ruby / Pythonでは、必要なものを何でも保存できますが、C ++でこれを行う効率的な方法は何ですか?
(また、誰かがRubyのような動的言語用の単純なオープンソースのレクサー/パーサー/インタープリターへのリンクを持っているなら、私はリンクをいただければ幸いです)。
C++で単純な動的言語インタープリターを作成しようとしています。動的型付けされた配列を宣言できるようにしたいのですが、C++のオブジェクトにそれらを格納する方法がわかりません。
Ruby / Pythonでは、必要なものを何でも保存できますが、C ++でこれを行う効率的な方法は何ですか?
(また、誰かがRubyのような動的言語用の単純なオープンソースのレクサー/パーサー/インタープリターへのリンクを持っているなら、私はリンクをいただければ幸いです)。
言語のセマンティクスに基づいて、カスタムソリューションを作成する必要があります。たとえば、を使用して任意のオブジェクトboost::any
を保存できますが、名前の検索などを実行することはできません。基本的にそれをエミュレートしているので、ここではいくつかのアセンブラの知識が役立ちます。ほとんどの人がすることは次のようなものです
struct Object {
boost::any cppobject;
std::unordered_map<std::string, std::function<void(boost::any&, std::vector<boost::any>&)> funcs;
};
std::vector<Object> stuff;
あなたの仮説の言語で、あなたが次のようなものを持っているとき
stuff[0].hi();
次に、それを次のようなものに変換できます
std::vector<boost::any> args;
// fill args
stuff.at(0).funcs["hi"](stuff.at(0).cppobject, args);
// now args holds the result
このスキームをさらに最適化することはかなり可能ですが、すでに最大限に一般化されているため、さらに一般化することはできません。
動的言語がユニバーサルオブジェクトを格納する方法はポインターを介して行われ、C++でも同じことができます。C ++クラスで定義する一般的な「オブジェクト」へのポインタを格納します。これは、効率的な方法です。
ユニオンを使用したり、共通ベースタイプのオブジェクトを動的に割り当てたりする(およびdynamic_castまたは同等の構造を介して適切にダウンキャストする)代わりに、boost::variantを使用できます。これにより次のようなコードを記述できます。
typedef boost::variant<int, float, char, std::string> LangType;
std::vector<LangType> langObjects;
設計でそのような実装が可能である場合、これには、コンパイル時に安全であり、ヒープ、仮想関数、およびポリモーフィックダウンキャストの使用によって課せられるペナルティを回避できるという利点があります。