Skip to content

gorakuseisaku/NovaMath

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NovaMath - A Fast, Lightweight Mathematics DSL

C++20で実装した、独自の数式記述言語(DSL)です。 高校生が一人で、コンパイル速度と実行速度の最適化を意識してスクラッチから開発しました。

A fast and lightweight domain-specific language for mathematical evaluations, built from scratch in C++.

主な特徴 (Features)

  • 独自拡張子 .nmath: 外部ファイルに記述された数式スクリプトを読み込み、ダイレクトにパース・実行します。
  • 高速な実行速度 (High Performance): C++の強みを活かし、高速な計算を実現しています。
  • 変数と組み込み関数 (Variables & Built-in Functions):
    • 柔軟な変数定義と再代入
    • 組み込み関数を標準サポート: 三角関数 (sin, cos, tan), 絶対値 (abs), 平方根 (sqrt)

使い方 (Usage)

1. スクリプトファイルの作成 (example.nmath)

以下のように、変数や関数を組み合わせた数式を記述できます。

x = 4.0
y = sqrt(x) + abs(-5.5)
result = sin(y)

2. コマンドラインからの実行 (Execution)

ビルドされた実行ファイルに .nmath ファイルのパスを渡して実行します。

# コマンドラインでの実行例
NovaMath.exe example.nmath

内部アーキテクチャ (Architecture)

本プロジェクトは、一般的なAST(抽象構文木)の構築と走査を行いません。 数式の評価を極限まで高速化するため、**独自のコンパイラおよびレジスタ型仮想マシン(VM)**をスクラッチで実装しています。

Instead of building and traversing an AST, this project compiles code into custom bytecode and executes it via a register-based Virtual Machine.

  1. Lexer (字句解析): .nmath ファイルを高速に読み込み、トークン列に分解します。
  2. Pratt Parser (構文解析 & コード生成): Top-Down Operator Precedence(Pratt Parsing)アルゴリズムを採用。演算子の優先順位(三角関数、絶対値、四則演算など)を効率的に1パスで解析し、同時に独自の「バイトコード(命令列)」へとコンパイルします。
  3. Register-based VM (実行環境): 生成されたバイトコードを、スタック型よりも高速とされる「レジスタ型仮想マシン」上で実行します。変数や計算中の中間データは、VM内の高速なレジスタ(仮想レジスタ)間で直接処理されるため、オーバーヘッドが極めて少なく、圧倒的な実行速度を実現しています。

ベンチマーク (Benchmark)

測定環境 (Environment)

  • OS: Windows 10 (64-bit)
  • CPU: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz (2コア / 4スレッド)
  • RAM: 16.0 GB
  • Compiler: Visual Studio 2022 (MSVC)

ベンチマークA: 長大四則演算・カッコ・複数関数テスト(負荷・構文解析検証)

演算子の優先順位、カッコのネスト、複数の組み込み関数が複雑に入り混じった長大な数式の、純粋な1発の処理速度(コンパイル+実行オーバーヘッド)を計測しました。

  • ループ回数: なし(1回のみの実行)
  • 実行スクリプト:
    a = 2.5
    b = 3.5
    result = (a + b) * (b - a) / (a * 2.0) + sqrt(a * a + b * b) - abs(a - b)
    
  • 合計処理時間: 3 µs (3マイクロ秒)
  • 計算結果: 4.501162633521314 (理論値と完全一致)

長大な構文であっても、Prattパーサーによる1パスバイトコード生成と、レジスタ保護を両立。レジスタ型VM上での評価までをわずか3マイクロ秒という極限の低レイテンシで処理しており、本DSLの圧倒的な軽量性とキレの良さを証明しています。

ベンチマークB: 究極ストレス環境・限界突破テスト(O(N)スケーラビリティ&コンパイラ最適化検証)

約30個の永続変数、何重にもクロスした変数依存、大量の組み込み関数呼び出しを含む、言語システムとしての限界値に挑む超長大スクリプトの、1発の処理速度を計測しました。

  • ループ回数: なし(1回のみのコールドスタート実行)
  • 合計処理時間: 21 µs (21マイクロ秒)
  • 計算結果: -78.33913011596053 (C++ double精度 演算完全一致)
  • コンパイル最適化: MSVC /O2, /GL, /LTCG, /arch:AVX2, /fp:fast 有効

技術的考察: 数式の規模を初期のベンチマークから数倍以上に拡張したにもかかわらず、処理時間はわずか21 µsに留まっています。 MSVCのリンク時コード生成(LTCG)によるパーサー・VM間の関数インライン化、およびAVX2拡張命令セットを用いた浮動小数点演算のハードウェア最適化により、初期の31 µsから約32%のさらなる高速化を達成。 大規模なスクリプトを読み込ませても速度が一切破綻しない、商用エンジン並みの堅牢性とスケーラビリティを、Intel Core i5-6200U環境下で完全に証明しました。

About

A super-fast, minimalist mathematical DSL with a built-in runtime.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors