現在の選択: lua-jit。印象的なベンチマーク、私は構文に慣れています。高性能のABIを作成するには、C++をどのように構成するかを慎重に検討する必要があります。
その他の興味のある質問
- 埋め込み可能な言語としてのGambit-CとGuile
- Luaパフォーマンスのヒント(コレクターを無効にして実行するオプションがあり、処理実行の最後にコレクターを呼び出すことは常にオプションです)。
バックグラウンド
私はリアルタイムの大容量(複合)イベント処理システムに取り組んでいます。ソースでのイベント構造のスキーマ、ストレージ形式、特定のドメイン固有の構造、内部イベントの発生(汎用処理を構造化および駆動するため)、および常に発生する特定の処理ステップのエンコードを表すDSLがあります。
DSLはSQLに非常によく似ています。実際、私はイベントの長期保存にberkeley db(sqlite3インターフェイス経由)を使用しています。ここで重要なのは、イベントの処理がSQLのようにセットベースで行われることです。しかし、DSLに汎用処理ロジックを追加するのではなく、luaまたはlispを埋め込んでこれを処理する必要があるという結論に達しました。
処理コアはboost::asioを中心に構築されており、マルチスレッドであり、rpcはプロトコルバッファを介して実行され、イベントはプロトコルバッファIOライブラリを使用してエンコードされます。つまり、イベントはプロトコルバッファオブジェクトを使用して構造化されておらず、同じエンコーディングを使用します。 /decodingライブラリ。データベースエンジンがメモリセットに格納する方法と非常によく似た、行を含むデータセットオブジェクトを作成します。DSLの処理ステップは最初に処理され、次に汎用処理ロジックに提示されます。
使用する埋め込み可能なスクリプト環境に関係なく、処理コアの各スレッドには、おそらく独自の埋め込み言語環境が必要です(つまり、少なくともマルチスレッド作業を行う場合は、luaがそれを必要とします)。
質問)
現時点での選択は、lispECLとluaのどちらかです。パフォーマンスとスループットが強力な要件であることを念頭に置いて、これはメモリ割り当てを最小限に抑えることが非常に望ましいことを意味します。
もしあなたが私の立場にあったら、あなたはどの言語を選びますか?
検討すべき代替案はありますか(埋め込み可能な実装がない言語を提案しないでください)。Javascript v8はおそらく?
lispはドメインによりよく適合しますか?luaとlispは、提供するものに関してそれほど異なるとは思いません。私を呼んでください:D
私が考えるべき他のプロパティ(以下のような)はありますか?
あらゆる形式の組み込みデータベースIO(コンテキストについては以下のDSLの例を参照)は、スクリプト言語の呼び出しを桁違いに小さくし、どちらを選択しても、全体的なスループットに大きなオーバーヘッドは追加されないと断言します。私は正しい方向に進んでいますか?:D
必要なプロパティ
データセットをlispリストまたはluaテーブルにマッピングしたいのですが、冗長なデータコピーを最小限に抑えたいと思います。たとえば、あるデータセットから別のデータセットに行を追加する場合、両方のテーブルの形状が同じである場合は、参照セマンティクスを使用する必要があります。
lua / lisp呼び出しを行っている間、入力として渡されるデータセットが変更されないことを保証できます。luaとlispに、可能であればデータセットも変更しないように強制したいと思います。
埋め込まれたコールエンドのデータセットを破棄した後、作成された参照をコピーに置き換える必要があります(私は推測します)。
DSLの例
私はあなたの視聴の喜びのためにDSLを添付しますので、あなたは私が何を達成しようとしているのかを知ることができます。注:DSLは汎用処理を示していません。
// Derived Events : NewSession EndSession
NAMESPACE WebEvents
{
SYMBOLTABLE DomainName(TEXT) AS INT4;
SYMBOLTABLE STPageHitId(GUID) AS INT8;
SYMBOLTABLE UrlPair(TEXT hostname ,TEXT scriptname) AS INT4;
SYMBOLTABLE UserAgent(TEXT UserAgent) AS INT4;
EVENT 3:PageInput
{
//------------------------------------------------------------//
REQUIRED 1:PagehitId GUID
REQUIRED 2:Attribute TEXT;
REQUIRED 3:Value TEXT;
FABRRICATED 4:PagehitIdSymbol INT8;
//------------------------------------------------------------//
PagehitIdSymbol AS PROVIDED(INT8 ph_symbol)
OR Symbolise(PagehitId) USING STPagehitId;
}
// Derived Event : Pagehit
EVENT 2:PageHit
{
//------------------------------------------------------------//
REQUIRED 1:PageHitId GUID;
REQUIRED 2:SessionId GUID;
REQUIRED 3:DateHit DATETIME;
REQUIRED 4:Hostname TEXT;
REQUIRED 5:ScriptName TEXT;
REQUIRED 6:HttpRefererDomain TEXT;
REQUIRED 7:HttpRefererPath TEXT;
REQUIRED 8:HttpRefererQuery TEXT;
REQUIRED 9:RequestMethod TEXT; // or int4
REQUIRED 10:Https BOOL;
REQUIRED 11:Ipv4Client IPV4;
OPTIONAL 12:PageInput EVENT(PageInput)[];
FABRRICATED 13:PagehitIdSymbol INT8;
//------------------------------------------------------------//
PagehitIdSymbol AS PROVIDED(INT8 ph_symbol)
OR Symbolise(PagehitId) USING STPagehitId;
FIRE INTERNAL EVENT PageInput PROVIDE(PageHitIdSymbol);
}
EVENT 1:SessionGeneration
{
//------------------------------------------------------------//
REQUIRED 1:BinarySessionId GUID;
REQUIRED 2:Domain STRING;
REQUIRED 3:MachineId GUID;
REQUIRED 4:DateCreated DATETIME;
REQUIRED 5:Ipv4Client IPV4;
REQUIRED 6:UserAgent STRING;
REQUIRED 7:Pagehit EVENT(pagehit);
FABRICATED 8:DomainId INT4;
FABRICATED 9:PagehitId INT8;
//-------------------------------------------------------------//
DomainId AS SYMBOLISE(domain) USING DomainName;
PagehitId AS SYMBOLISE(pagehit:PagehitId) USING STPagehitId;
FIRE INTERNAL EVENT pagehit PROVIDE (PagehitId);
}
}
このプロジェクトは博士課程の研究プロジェクトの構成要素であり、自由ソフトウェアです。このプロジェクトで私と一緒に仕事をする(または貢献する)ことに興味がある場合は、コメントを残してください:D