AnteでAObenchを書いた

Ante という新しいプログラミング言語(とその処理系)があります。


面白そうなので勉強がてらAObenchを移植してみました:
GitHub - eldesh/aobench_ante: A microbench for floating point calculation in Ante programming language

言語仕様

簡単に特徴を述べると以下のような感じです:

  • Rust製
  • 正格評価
  • 関数型言語
  • 型クラス
  • GC無し
  • Lifetime 推論 (未実装)
  • 篩型 (未実装)
  • Algebraic Effect (未実装)


肝心の機能が全部未実装なんですが…。
(そもそもこれらの機能は全部共存出来るんでしょうか?(疑))

文法

作者はかなり syntax element の冗長性を減らす志向があるようです。
例えば以下はレコードの定義です。

// 定義
type Vec = x: float, y: float, z: float
// 構築
v = Vec 1.1 1.2 1.3
// アクセス
s = v.x + v.y + v.z

また特殊なオフサイドルールを採用しており、直後にインデントされるはずではないトークンの直後ではエスケープ無しで改行出来ます。

a = 3 + 2 *
    5 + 4
    * data

速度比較

aobench-ante の実行結果です。

compiler time
ante 0m7.487s
ante(-O3) 0m2.431s
gcc 0m0.658s
polyml 0m4.589s
mlton 0m1.536s


Poly/MLの2倍時間が掛かっていますのでまだかなり遅いですね。
// 追記ここから
-O3フラグを付けてビルドしたところPoly/MLの1/2倍、GCCの3.5倍の実行時間になりました。
anteの筆者によるともう少しGCCに近い速度が出るはずとのこと。
これが本当ならネイティブコンパイルされる言語としては他の関数型言語に近くなりそうですね。
// 追記終わり
言語自体は低レイヤ指向を標榜しているのでもう少し頑張って欲しいところです。

所感

今回のコードを書くにあたって何度もコンパイラのバグに行き当たりました。(3つほど報告、うち2つは修正済み)
まだかなり基本的な箇所にバグがあり、まともな使用には耐えません。

例えば aobench-ante では画サイズ(256x256)を変数にしていますが、それを使わず決め打ちにしている箇所が複数あります(e.g. aobench_ante/aobench.an at 419d63cfa428595ff35bf53cdeb89fbe388ec923 · eldesh/aobench_ante · GitHub)が、これは型エラーを避けるためです。恐らくトップレベルの変数の型を解決する箇所にバグがあります。


今はまだこんな感じですが篩型やalgebraic effectはロマンがあるので頑張って欲しいところですね。