よくある質問
原文: Frequently asked questions ── © Louis Pilfold and the Gleam contributors, Apache-2.0。日本語訳 © 2026 Canonical。
なぜ Gleam という名前なのですか?
Gleam は「beam」と韻を踏むだけでなく、意味も同じです。beam は Erlang 仮想マシンの名前でもあります。
短く愛らしい単語であり、多くの人にとって綴りやすく発音しやすい名前であってほしいと願っています。
Gleam は何にコンパイルされますか?
Gleam のコンパイルターゲットは次の 3 つです。
- Erlang の抽象形式(abstract forms)。これは Erlang コンパイラの中間表現であり、Elixir などでも使われています。これは、Gleam を「Erlang 上」で実行するためにコンパイルする際、Gleam のビルドツールが使用するターゲットです。
- Erlang のソースコード。これは通常、教育目的やコンパイラ自体のテストにのみ使用されますが、Gleam をサポートする他のビルドツールで使用される可能性もあります。
- JavaScript のソースコード。
Gleam に型クラスは入りますか?
型クラスは楽しく、非常に簡潔な API を作れるという利点があります。しかし一方で、難解なコードを容易に書けてしまうため、エラーメッセージが分かりにくくなりがちです。また、他の言語からそのコードを利用することがはるかに難しくなるほか、コンパイル時間も長くなります。さらに、コンパイラがプログラム全体のコンパイルとコストの高い単相化(monomorphisation)を行わない限り、実行時のコストもかかってしまいます。残念ながら、こうした特性は Gleam の方針と合わないため、型クラスを導入する予定はありません。
Gleam にメタプログラミングは入りますか?
Gleam の可読性やコンパイル速度を損なわない限り、私たちは何らかの形のメタプログラミングの導入に前向きです。メタプログラミングの設計を提案したい場合は、こちらの記事に進め方がまとめられていますのでご覧ください: How to add metaprogramming to Gleam。
Gleam に導入予定の無い機能は何ですか?
Gleam は常に小さくまとまった言語であることを目指しており、機能セットは最小限に保たれます。そのため、他の言語で人気がある機能の多くは Gleam に追加されません。一例として以下のものが挙げられますが、これですべてではありません。
- 例外ベースのエラー処理
- 拡張可能バリアント(extensible variants)
- 関数と演算子のオーバーロード
- 暗黙の引数
- 暗黙に null になりうる値
- 線形型やアフィン型
- Lisp スタイルのマクロ
- 手動メモリ管理
- ミューテーション(mutation)
- オブジェクト指向
- 省略可能な引数
- 型クラスやトレイト
- タグ無し共用体(untagged unions)
Gleam にミュータブルな状態はありますか?
Gleam のデータ構造はすべてイミュータブルであり、構造共有(structural sharing)を用いて実装されているため、極めて効率的に更新できます。通常はこれらを関数型のイミュータブルなアルゴリズムと組み合わせて使用することで、ミューテーションなしでも優れたパフォーマンスを発揮します。
ただし、データの保存やキャッシュなど、依然としてミューテーションが役立つ場面もあります。そのような場合は、データベースや、Erlang の ETS システムのような言語固有のミュータブルなストレージを使用します。
Gleam に副作用はありますか?
はい。Gleam は OCaml や Erlang と同様に、非純粋(impure)な関数型言語です。そのため、ファイルへの書き込みやコンソールへの出力といった非純粋な操作を、特別な手続きなしで実行できます。
なお、コンパイラは内部で限定的な効果追跡(effects tracking)を行っています。将来的にこの仕組みで解決できる問題が出てきた場合には、機能が拡張される可能性もあります。
メッセージパッシングはどのように型付けされますか?
型安全なメッセージパッシングは、コア言語の一部としてではなく、ライブラリとして Gleam に実装されています。これにより、Erlang と JavaScript という互換性のない並行性システムを持つ二つの環境のどちらでも動作し、相互運用できるようになっています。
詳細にご興味がある場合は、gleam_erlang および gleam_otp パッケージをご確認ください。
Gleam で Erlang のホットコードリローディングは使えますか?
Erlang の通常のコードリローディング機能はすべて動作します。しかし、すでに実行されているコードの型を知る方法がないため、アップグレードそのものを型検査することはできません。つまり、この機能に関しては Gleam 特有の安全性は得られず、Erlang と同程度の安全性にとどまります。
一般的に、Gleam の OTP ライブラリはアップグレードよりも型安全性を重視して最適化されています。アトムのモジュールではなくレコードを使用するため、状態をアップグレードするコールバックの記述がやや複雑になる場合があります。
なぜゼロ除算はゼロを返すのですか?
プログラミング言語においてゼロ除算を扱う方法には、主に三つのアプローチがあります。
- 例外を投げてプログラムをクラッシュさせる。
- 特別な無限大の値を返す。
- 0 を返す。
Gleam は暗黙的に例外を投げない設計であるため、例外を投げるという選択肢はとれません。また、BEAM VM には無限大という値が存在しないため、これも不可能です。したがって Gleam に残された唯一の選択肢は、ゼロで割ったときに 0 を返すことでした。
なお、標準ライブラリにはゼロ除算に対して Result 型を返す関数も用意されています。プログラムの要件に応じて、そちらのほうが適している場合はぜひご利用ください。
数学的な観点からのゼロ除算について、詳しくは Hillel Wayne 氏によるこちらの記事をご参照ください: 1/0 = 0。
Gleam は Rust と比べてどうですか?
構文が似ている部分はありますが、Gleam と Rust はまったく異なる言語です。
- Rust は低水準の命令型言語です。制御されたミューテーション、静的に検証される手動メモリ管理、複数のメタプログラミングシステムを備えており、言語としての仕様が大規模です。ネイティブコードにコンパイルされ、ランタイムはほとんど、あるいはまったくありません。
- Gleam は高水準のイミュータブルな関数型言語です。自動ガベージコレクションを備え、メタプログラミングはありません。言語の仕様は小さくまとまっており、容易に学習できます。Erlang と JavaScript の仮想マシン上で動作します。
どちらの言語も強力な静的型システムを備えており、Gleam の開発者向けツールの一部は Rust のツールから着想を得ています。
Elixir にも型システムができました。これは Gleam にとって何を意味しますか?
Elixir は Erlang 仮想マシン上で動くもう一つの言語です。Gleam の姉にあたるこの言語に型システムが導入されたことを、私たちはとても嬉しく思っています。
Elixir と Gleam の型システムは対極と言えるほど異なっており、それぞれ異なる目標のもとに設計され、異なるプログラミング体験を提供しています。これほど違いがあれば、おそらく大半の人はどちらか一方を好むでしょう。ぜひ両方を試してみて、ご自身に一番合うほうをお使いください。どちらを選んでも、BEAM の素晴らしさを享受できることに変わりはありません!
Gleam から Elixir のコードを使えますか?
はい! Gleam のビルドツールは Elixir をサポートしており、Gleam プロジェクト内にある Elixir の依存も、ソースファイルもコンパイルできます。ただし、これを利用するにはコンピュータに Elixir がインストールされている必要があります。
なお、Elixir のマクロは Elixir の外からは呼び出せないため、一部の Elixir API は Gleam から直接使用できません。そうした API を利用する場合は、マクロを呼び出す Elixir モジュールを別途作成し、そのモジュールを Gleam のコードから呼び出すようにしてください。
Gleam に AI の方針はありますか?
はい。そしてそれは Rust 言語の方針と似ています。コントリビューションやコミュニケーションは、LLM やその他の統計モデルではなく、人間によって書かれなければなりません。
コーディングエージェントは Gleam で使えますか?
2026 年現在、これらのツールはほとんどの言語で同等にコードを生成できるように見え、JavaScript や Python などの他の言語と比較しても、Gleam で同様の結果が得られています。
学習にあたっては、まずドキュメントを参照し、Gleam の Discord サーバで質問することをお勧めします。チャットボットやその他の LLM ツールは不正確な情報を出力することが多く、質問することは他の Gleam プログラマと貴重なつながりを作る素晴らしい方法です。
なぜコンパイラは Rust で書かれているのですか?
Gleam コンパイラの試作版は Erlang で書かれていました。しかし、静的型がないためにリファクタリングが遅々として進まず、エラーも起きやすかったため、Rust への移行を決定しました。Rust で全面的に書き直した結果、多くの技術的負債やバグを取り除くことができ、さらにパフォーマンスが向上したのも嬉しい副産物でした!
コンパイラは Gleam で書き直されますか?
Gleam コンパイラの再実装には膨大な時間がかかり、数か月から数年間にわたって他のすべての作業を止めることになってしまいます。これは時間を有効に使えているとは言えません。また、Gleam で実装したバージョンはおそらく現在の Rust 版よりも遅くなるため、Gleam コミュニティにとっても有益ではありません。
Gleam を本番環境に入れるべきですか?
はい!
Gleam は本番運用に十分耐えうるプログラミング言語です。動作基盤である Erlang や JavaScript のランタイムは極めて成熟しており、実戦で十分に鍛え上げられています。Gleam はすでに、ミッションクリティカルなワークロードにも対応できる状態にあります。
Gleam のプログラマは何と呼ばれますか?
Gleam の Discord サーバによれば、Gleamlins です。
それは良いものですか?
はい、私はそう思います。:)