特定のテーマについての意見やアドバイスを探しています。状況は次のとおりです。私は暇なときに、C#で作成されたプログラミング言語インタープリターを楽しみのために開発しており、その速度を向上させたいと考えています。レクサー(うまく機能します!)、パーサー(うまく機能します!)、オプティマイザー(うまく機能します!)、インタープリター(うまく機能しますが、はるかに優れている可能性があります)を作成しました。
BASICとVB.Netを組み合わせた小さな構文を作成しました。それはこのように見えます:
FUNCTION Main(args[])
# The language actually supports .Net API.
System.Console.WriteLine(FirstMethod(100).ToString())
END FUNCTION
FUNCTION FirstMethod(num)
IF num > 1 THEN
RETURN FirstMethod(num - 1)
END IF
RETURN num
END FUNCTION
したがって、パフォーマンスについて話すと、上記のアルゴリズムは、GitHubでの2015年の以前の実装で、Inteli5で実行するのに約8ミリ秒かかります。プロパティ/メソッドへのアクセスをキャッシュし、Dynamicキーワードを使用する私の新しい実装は、実行に約5ミリ秒かかります(解析と最適化の時間をカウントしません)。
オプティマイザーを使用してすべてをインライン化すると、速度が平均10%向上します(もちろん、アルゴリズムによって異なります)。
作成するのが楽しいPoCができたので、もっと速くしたいと思います。特にインタプリタ(他のコンポーネントは「OK」です)。私が最初にしたことは、VisualStudioのPerformanceProfilerを確認することですが、他のいくつかのプロジェクト(プロまたはパーソナル)と比較すると、関連するものは何もありません(Reflectionは、プログラムの他の部分と比較してそれほど遅くはありません。二項演算子を実行しないと、まだ遅いです...スイッチオンタイプはたくさんありますが、これから逃れるためのクリーンな方法が見つかりませんでした...など)。すべてがかなり速く進みますが、グローバルな結果は遅いです。だから実際にはすべてが遅いです...
私はいくつかのアイデアを念頭に置いており、それはほとんどのインタープリターを書き直す必要があります(しかし、私はそれで大丈夫です、それは何の後の楽しみのためのプロジェクトです)、そしてそれについてあなたの意見をお願いします。
最後のポイント:数年前の私の最初のPoCには、アルゴリズムを段階的に実行し、アルゴリズムにブレークポイントを設定し、すべての変数の値を使用して呼び出しスタックを確認する独自のシステムがありました(実装するのは楽しかったです) !)。これは私の最後のPoCには実装されておらず、これら2つの最初のアイデアのいずれかを使用することで再び実行できるかどうかはわかりません。しかし、私はそれで大丈夫です。それは副次的な目標です。
私はどんな意見や他のアイデアにもオープンです。 =)それについて話し合いましょう?
私のためにすべてを行うライブラリを使用したくないことに注意してください( http://csscript.net/ またはRoslynとその友人)。私の目標は、やりがいのあるプロジェクトを楽しんで学ぶことです。また、C++で書き直したくありません。この.Netプロジェクトをより速くする方法があると私は確信しています。
ASTから操作への変換は実行時ではなくコンパイル時に行われるため、実際のバイトコードを出力すると、(この種のコードの場合)常にこれらのオプションの最高のパフォーマンスが得られます。実行時情報を利用してさらに最適化を実行する可能性はほとんどありません。
そして正直なところ、バイトコードはASTにより近くマッピングされるはずなので、少しの学習曲線を乗り越えれば、バイトコードの発行も簡単になります。