Fuse プログラミング言語: GRIN による静的型付け関数型プログラミング

Fuse は、高性能なネイティブコード生成のために設計された、静的型付けの純粋関数型プログラミング言語です。GRIN 全プログラム最適化器へコンパイルし、その後 LLVM へコンパイルすることで、Fuse は高レベルな関数型抽象化から、ゼロコスト抽象化を備えた効率的で小さなネイティブバイナリへのパスを提供します。

言語の核となる機能

Fuse は、System F と高階多相性を組み合わせることで、堅牢な型システムを提供します。この言語は、Rust、Python、Scala、Haskell から構文のインスピレーションを得ており、表現力豊かで構成可能なように設計されています。

型システムと多相性

Fuse は、高階多相性を備えた System F に基づく静的型付けシステムを実装しています。主な構成要素は以下の通りです:

  • Higher-Kinded Types (HKTs): HKTs のサポートにより、Functor のような、型コンストラクタをマップできる高度な抽象化の作成が可能になります。
  • Ad-hoc Polymorphism: トレイトを通じて実現され、開発者が異なる型にわたって共有の振る舞いを定義することを可能にします。
  • Ad-hoc Polymorphism via Traits: 開発者は impl ブロックを使用して、ある型に対してトレイトの特定の具体的な実装を提供できます。
  • Algebraic Data Types (ADTs): Fuse は ADTs とジェネリクスをサポートしており、精密なドメインモデリングを可能にします。

関数型パラダイム

Fuse は、すべての関数が純粋関数である純粋関数型言語です。この純粋性を維持しつつ、実用的なアプリケーションを可能にするために、言語は以下を提供します:

  • Pattern Matching: ADTs を扱うために不可欠です。
  • Higher-Order Functions: 他の関数を引数として受け取ったり、他の関数を返したりできる関数です。
  • do notation: do notation のサポートにより、モナド操作のシーケンシングがより読みやすくなります。
  • Bidirectional Type Checking: コンパイラは高階型をサポートする双方向型チェックを使用します。これにより、可読性のために関数型シグネチャのみが必要となり、その他のすべての型は推論されます。

コンパイル・パイプライン

Fuse は、直接マシンコードにコンパイルするのではなく、代わりに、最終的なコード生成の前にプログラム全体を最適化するために、マルチステージのパイプラインを使用します。

GRIN 最適化器

Fuse は、全プログラム最適化器である GRIN にコンパイルされます。このアーキテクチャにより、言語はコードベース全体にわたって広範な最適化を実行でき、高レベルな関数型抽象化が実行時のパフォーマンス・ペナルティを招かないことを保証します。

LLVM バックエンド

GRIN の最適化フェーズに続いて、コードは LLVM を介して生成され、Linux (x86_64) および macOS (ARM64) 用の最終的なネイティブバイナリが生成されます。

コミュニティ分析と技術的批判

Hacker News のコミュニティメンバーは、言語の現状に関して、いくつかの技術的な質問や提案を提起しています:

構文とエルゴノミクス

一部のユーザーは、従来の角括弧 <> ではなく、型変数に角括弧 [] を使用する構文が直感的でないと感じています。また、$\eta$-long form における Higher-Kinded Types の構文についても議論が行われています。

純粋性と IO

あるレビュアーは、言語の純粋性の主張における潜在的な矛盾を指摘しました。.exec() メソッドの存在は、型シグネチャに関係なく、いかなる関数でも IO アクションを実行できることを示唆しており、それが言語の厳格な関数型純粋性を損なう可能性があると彼らは観察しました。

標準ライブラリとツール

  • Editor Support: tree-sitter-fuse グラマーが作成されており、Language Server Protocol (LSP) のサポートに向けた初期の進展を示しています。
  • Unicode Support: 標準ライブラリの文字列型は、現在 Unicode を認識していません。これは将来のライブラリ設計に影響を与える可能性があります。
  • User-Defined Operators: 言語には現在、ユーザー定義の演算子が不足しています。一部の開発者は、これが埋め込みドメイン固有言語 (EDSL) を作成する際の大きな障害になると主張しています。

"標準ライブラリの文字列型は Unicode を認識していません... Unicode サポートの導入は大きな作業になりますが、後で追加するかどうかを検討することは、現在のライブラリ設計に影響を与えるかもしれません。"

インストール

Fuse は、サポートされているプラットフォーム (Linux x86_64 および macOS ARM64) 用の curl スクリプトを介してインストールできます:

curl -fsSL https://fuselang.github.io/fuse/fuseup | sh

Sources