IT

プログラミング言語「Goose」:C++やRustを超えると謳う新言語の全貌

Gooseは、ヒープもガベージコレクションもライフタイム注釈も持たない新しいシステムプログラミング言語です。作者によれば、慣用的なC++の3倍以上高速に動作するといいます。その仕組みと、試す価値があるのかどうかを解説します。

·3 分で読めます
プログラミング言語「Goose」:C++やRustを超えると謳う新言語の全貌

ここ数週間、開発者の間で最も議論されているトピックの一つが、プログラミング言語「Goose」です。これは、ベテランプログラマーであり「Lobster」言語の作者でもあるWouter van Oortmerssen氏によって作成されました。GooseはApache 2.0ライセンスのもとでオープンソースとして公開されており、最も興味深いことに、そのコンパイラは人間が設計した言語仕様をもとに、ほぼ完全にAIによって生成されたと作者は述べています。

ほとんどの言語では、配列や文字列などの動的データはヒープ上に存在し、管理のためにガベージコレクション(Java、Go)、参照カウント(Swift)、またはライフタイム規則(Rust)を必要とします。Gooseはこれらのいずれも使用しません。公式ドキュメントによると、すべての動的値はコンパイラが管理するデータスタック上に存在します。

  • 各スタックは、シンプルなバンプポインタを持つ大きなアドレス空間予約(デフォルトで2GB)です。
  • 各スタックで同時に生存できる可変長の値は1つだけであり、それは常にトップにあります。
  • 配列の拡張はポインタを進めるだけで、何も移動しません。
  • スコープ終了時のメモリ解放は、単一のストア操作で行われます。

コンパイラはコンパイル時にこれらの規則を検証し、実行時に追跡されるのはバンプポインタのみです。

安全性の仕組み

すべての参照には静的な「ルート」(そのライフタイムを制限する変数)が存在します。コンパイラは自動的にルートを推論し、所有者より長生きしてしまう参照を拒否します。Rustとは異なり、プログラマーがライフタイム注釈を書く必要はなく、unsafeも存在しません。

構文の例

GooseはC言語に似たコンパクトな構文を持ちます。可変サイズデータを持つ構造体は次のように宣言されます:struct Item { sku: u8[varint], qty: varint, cents: varint }。配列には、固定サイズ、拡張のみ、拡張・縮小可能の3種類があります。

速度:作者による数値

作者は16のベンチマーク結果(幾何平均)を公開しています。それらによると、Gooseは以下の通りです:

  • 慣用的なC++の約3.3〜3.5倍高速
  • 手動で最適化されたC++の1.16〜1.26倍高速
  • 最も安全なRustの1.12〜1.19倍高速
  • メモリ使用量が1.2〜1.9倍少ない

例えば、注文レコードの場合、Gooseでは29バイトでアロケーションはゼロですが、C++では160バイトで1回のアロケーション、Rustでは153バイトで4回のアロケーションが必要です。これらは作者自身によるベンチマークであり、第三者による検証はまだ限定的である点には留意してください。

制限事項

  • 再帰関数では、再帰呼び出しをまたいで可変データを保持できません。
  • エスケープするクロージャや関数ポインタはありません。
  • プログラム全体のコンパイル(ホールプログラムコンパイル)のみに対応しています。
  • ライブラリのエコシステムはまだ非常に小規模です。

試す方法

Windows x64、Linux x64、およびmacOS(Apple SiliconおよびIntel)向けの事前ビルド済みコンパイラが利用可能です。Gooseは単一のCファイルにコンパイルされるため、Cコンパイラが動く環境であればどこでも実行できます。GitHubのaardappel/gooseページからリリースをダウンロードし、フォルダをPATHに追加して、goose samples/01_tour.gooseでサンプルを実行してください。アーカイブにはVS Code拡張機能も含まれています。

総評

Gooseは、メモリ管理に対するまったく新しいアプローチを持った魅力的な実験的言語です。パフォーマンスを重視するシステムプログラマーなら、動向を追って実際に試してみる価値があります。ただし、新しい言語であるため、プロダクション環境での使用については、第三者によるベンチマークとエコシステムの拡大を待つのが賢明でしょう。

出典: Goose (aardappel)

関連記事