Gleamとは?初心者でもわかる関数型プログラミング言語の完全解説【2025年版】
この記事でわかること: Gleamの基本概念・特徴・他言語との比較・実際のコード例・学習ロードマップ
はじめに:なぜ今Gleamが注目されているのか
プログラミング言語の世界では、毎年のように新しい言語が誕生しています。その中でも近年、開発者コミュニティの中で静かな熱狂を生んでいる言語があります。それが Gleam(グリーム) です。
Gleamは2024年にバージョン1.0がリリースされた比較的新しい言語でありながら、「型安全性」「並行処理の強さ」「読みやすい構文」という三拍子が揃ったことで、多くのバックエンドエンジニアの注目を集めています。
特に「Rustのような安全性を、Elixirのような生産性で」というコンセプトは、堅牢なシステムを効率よく開発したいエンジニアの心をつかんでいます。本記事では、Gleam初心者の方に向けて、言語の概要から実際のコードまでやさしく解説します。
Gleamの基本情報
| 項目 | 内容 |
|---|---|
| 開発者 | Louis Pilfold(個人開発) |
| 初回リリース | 2019年(v1.0は2024年3月) |
| パラダイム | 関数型プログラミング |
| 型システム | 静的型付け・型推論あり |
| 実行環境 | Erlang VM(BEAM)/ JavaScript |
| ライセンス | Apache 2.0 |
| 公式サイト | https://gleam.run |
Gleamの最大の特徴は、Erlang VM(BEAM)上で動作する静的型付け言語であるという点です。Erlang VMは、WhatsAppやDiscordといった大規模サービスを支える実績ある実行環境で、高い並行処理性能と耐障害性で知られています。
Gleamが解決しようとしている課題
従来のErlang/Elixirエコシステムには、動的型付けという特性から来る課題がありました。プログラムが大規模になるにつれ、型に関するバグが実行時にしか発見できないケースが増えてくるのです。
Gleamはこの課題を「静的型付け」によって解決します。コードを書いている段階でコンパイラが型の間違いを検出するため、実行時エラーが大幅に減少します。
さらに、Gleamは null(ヌル)を持たない言語 です。多くの言語でバグの温床となっている「NullPointerException」が原理的に発生しません。この設計思想は、実運用における安定性を大きく高めます。
他のプログラミング言語との比較
Gleamを理解する上で、他言語との比較は非常に役立ちます。よく比較される言語と並べてみましょう。
主要言語との特徴比較
| 比較項目 | Gleam | Elixir | Rust | Go | TypeScript |
|---|---|---|---|---|---|
| 型システム | 静的型付け | 動的型付け | 静的型付け | 静的型付け | 静的型付け |
| 実行環境 | BEAM/JS | BEAM | ネイティブ | ネイティブ | Node.js/ブラウザ |
| 並行処理 | ◎ 非常に強い | ◎ 非常に強い | ○ 強い | ○ 強い | △ 普通 |
| 学習コスト | ○ 低い | ○ 低い | ✕ 高い | ◎ 非常に低い | ○ 低い |
| Null安全性 | ◎ Nullなし | △ あり | ◎ Option型 | △ nilあり | ○ strict有効時 |
| エラー処理 | Result型 | {:ok, :error} | Result型 | 多値返却 | try/catch |
| メモリ管理 | GC(BEAM) | GC(BEAM) | 所有権システム | GC | GC |
| JavaScript出力 | ◎ 対応 | ✕ 非対応 | △ WASM経由 | △ WASM経由 | ◎ 対応 |
ElixirとGleamの違い
GleamとElixirは、ともにBEAM上で動作することから「兄弟のような関係」と表現されることがあります。しかし、その設計思想は異なります。
Elixirは動的型付けであり、メタプログラミングやマクロを駆使した表現豊かなコードが書けます。一方Gleamは、型の安全性を最優先に設計されており、マクロや複雑なメタプログラミングを意図的に排除しています。「シンプルで予測可能なコード」がGleamのフィロソフィーです。
RustとGleamの違い
どちらも型安全性を重視する言語ですが、ターゲットは異なります。Rustはシステムプログラミング向けで、メモリ安全性を所有権システムによって保証します。学習コストが高い一方、ネイティブなパフォーマンスを発揮します。
Gleamはウェブサービスやバックエンド開発に特化しており、Rustより学習コストが低く、BEAM由来の軽量プロセスによる高い並行処理性能を活かせます。
Gleamの構文:コードで見てみよう
Gleamの構文は、HaskellやRustから影響を受けながらも、非常にシンプルで読みやすく設計されています。
Hello World
import gleam/io
pub fn main() {
io.println("Hello, Gleam!")
}
pubは「公開関数」を意味し、fnが関数定義のキーワードです。JavaScriptやPythonに慣れた方なら、すぐに読めるでしょう。
変数とlet束縛
Gleamの変数はすべて**イミュータブル(変更不可)**です。一度値を束縛したら、後から変更することはできません。
let name = "Alice"
let age = 30
let is_active = True
// name = "Bob" // ← これはコンパイルエラー!
この設計により、変数が意図せず書き換えられるバグを防ぐことができます。
型アノテーション
型推論があるため型を明示しなくても動きますが、明示的に型を書くことも可能です。
let name: String = "Alice"
let age: Int = 30
let score: Float = 98.5
関数の定義
pub fn add(a: Int, b: Int) -> Int {
a + b
}
pub fn greet(name: String) -> String {
"Hello, " <> name <> "!"
}
<>は文字列結合演算子です。関数の最後の式が自動的に返り値になります(returnキーワード不要)。
パターンマッチング
Gleamの強力な機能の一つがパターンマッチングです。これはswitch文を大幅に進化させたような概念で、データの構造に応じて処理を分岐できます。
pub fn describe_number(n: Int) -> String {
case n {
0 -> "ゼロです"
1 -> "一です"
_ -> "それ以外の数です"
}
}
_はワイルドカードで、どの値にもマッチします。
Result型によるエラー処理
Gleamにはtry/catchがありません。代わりに Result型 を使います。これにより、エラーが起きうる処理を型レベルで明示できます。
import gleam/int
pub fn safe_divide(a: Int, b: Int) -> Result(Int, String) {
case b {
0 -> Error("ゼロ除算はできません")
_ -> Ok(a / b)
}
}
pub fn main() {
case safe_divide(10, 2) {
Ok(result) -> io.println("結果: " <> int.to_string(result))
Error(msg) -> io.println("エラー: " <> msg)
}
}
Okが成功を、Errorが失敗を表します。呼び出し側はこの両方を必ずハンドリングしなければならないため、エラーの見落としがありません。
Option型(nilの代替)
Gleamにはnullがない代わりに Option型 があります。値が「存在する」か「存在しない」かを型で表現します。
pub fn find_user(id: Int) -> Option(String) {
case id {
1 -> Some("Alice")
2 -> Some("Bob")
_ -> None
}
}
Some(値)が値あり、Noneが値なしです。これによりNullPointerExceptionが原理的に発生しません。
リストの操作
import gleam/list
pub fn main() {
let numbers = [1, 2, 3, 4, 5]
let doubled = list.map(numbers, fn(x) { x * 2 })
// -> [2, 4, 6, 8, 10]
let evens = list.filter(numbers, fn(x) { x % 2 == 0 })
// -> [2, 4]
let sum = list.fold(numbers, 0, fn(acc, x) { acc + x })
// -> 15
}
Gleamのカスタム型(レコードと直和型)
Gleamはオブジェクト指向ではなく、データをカスタム型で定義します。
レコード(構造体のようなもの)
pub type User {
User(
id: Int,
name: String,
email: String,
)
}
pub fn main() {
let user = User(id: 1, name: "Alice", email: "alice@example.com")
io.println(user.name) // "Alice"
}
直和型(Variant型)
複数の形を持つ型を定義できます。これはオブジェクト指向でいう「継承」の代替となるものです。
pub type Shape {
Circle(radius: Float)
Rectangle(width: Float, height: Float)
Triangle(base: Float, height: Float)
}
pub fn area(shape: Shape) -> Float {
case shape {
Circle(r) -> 3.14159 *. r *. r
Rectangle(w, h) -> w *. h
Triangle(b, h) -> b *. h /. 2.0
}
}
このパターンにより、新しい形が追加されたとき、コンパイラがすべてのcase式でハンドリングされているかを自動チェックします。
GleamとJavaScriptの連携
GleamはJavaScript(TypeScript)へのコンパイルにも対応しています。つまり、フロントエンドのコードもGleamで書くことができます。
BEAMターゲットとJSターゲットの両方に対応していることは、フルスタック開発においても大きなアドバンテージです。バックエンドとフロントエンドで同じ言語・同じ型定義を共有できます。
Gleamのエコシステム
パッケージマネージャー:Hex
GleamはElixirと同じ Hex というパッケージリポジトリを利用します。Elixirの豊富なライブラリ資産を活用できる点は大きなメリットです。
ビルドツール:gleam CLI
# 新しいプロジェクトの作成
gleam new my_project
# ビルド
gleam build
# テストの実行
gleam test
# 実行
gleam run
標準ライブラリの構成
| モジュール | 役割 |
|---|---|
| gleam/io | 入出力 |
| gleam/string | 文字列操作 |
| gleam/list | リスト操作 |
| gleam/int | 整数操作 |
| gleam/float | 浮動小数点数操作 |
| gleam/result | Result型の操作 |
| gleam/option | Option型の操作 |
| gleam/dict | 辞書(ハッシュマップ) |
| gleam/set | セット |
Gleamに向いているユースケース
向いているもの
- 高トラフィックのWebAPI … BEAMの並行処理性能を最大限に活かせます
- マイクロサービス … 型安全性があるため、サービス間のインターフェース定義が明確になります
- リアルタイムシステム … チャット、通知、ゲームサーバーなどBEAM得意分野でGleamを活用できます
- フルスタック開発 … JSターゲットを活用してフロントもバックもGleamで書けます
向いていないもの
- 機械学習・データサイエンス … PythonのPandas/NumPy相当のライブラリがまだ少ない
- システムプログラミング … OS、ドライバ開発にはRustやCが適しています
- ゲーム開発 … Unity/Unrealエコシステムとの親和性は低い
Gleamの学習ロードマップ
GleamはElixirやRustと比べて学習コストが低い言語ですが、関数型プログラミングの概念(イミュータブル、パターンマッチング、高階関数)に慣れていない方は少し時間がかかるかもしれません。
ステップ1:環境構築(1日)
まず公式サイト(https://gleam.run)からGleamをインストールします。macOSであればHomebrewで簡単に導入できます。
brew install gleam
その後、gleam new hello_worldでプロジェクトを作成し、Hello Worldを動かしてみましょう。
ステップ2:基本構文の習得(1〜2週間)
公式の「Language Tour」(https://tour.gleam.run)はブラウザ上でGleamを試しながら学べる優れたリソースです。変数、関数、パターンマッチング、カスタム型を順番に学びましょう。
ステップ3:標準ライブラリの把握(1〜2週間)
gleam/list、gleam/string、gleam/resultあたりを重点的に学ぶと、実用的なコードが書けるようになります。
ステップ4:Webアプリ開発(1ヶ月〜)
WisprというWebフレームワークや、HTTPサーバーのMistを使ってAPIを作ってみましょう。Erlang/OTPの知識も少しずつ身につけると、BEAMの能力を最大限に引き出せます。
Gleamのメリット・デメリットまとめ
| 観点 | メリット | デメリット |
|---|---|---|
| 型安全性 | コンパイル時にエラーを発見できる | 型エラーへの対処が最初は難しい |
| エラー処理 | Result型で見落としがない | try/catchに慣れた人には最初違和感あり |
| 並行処理 | BEAMにより軽量プロセスを大量生成可能 | BEAMの知識が必要になる場面もある |
| 学習コスト | 構文がシンプルで読みやすい | 関数型パラダイム自体への慣れが必要 |
| エコシステム | ElixirのHexライブラリを活用できる | Gleam専用ライブラリはまだ少ない |
| コミュニティ | 熱狂的で親切なコミュニティ | 日本語の情報がまだ少ない |
まとめ:Gleamはこんな人に向いている
Gleamは「シンプルで型安全な言語でバックエンドを書きたい」エンジニアにとって非常に魅力的な選択肢です。
特に次のような方にはぜひ試してほしい言語です。
ElixirやErlangの並行処理性能には魅力を感じるが、動的型付けの不安が気になる方。RustやHaskellに興味はあるが、学習コストの高さに躊躇している方。TypeScriptのような型安全性を、サーバーサイドでも一貫して使いたい方。
Gleamは2024年にv1.0をリリースしたばかりで、エコシステムはまだ発展途上ですが、言語設計のクオリティは非常に高く、今後の成長が大いに期待されます。
「未来の自分が読んでも理解できるコードを書く」—それを強力にサポートしてくれる言語、それがGleamです。
よくある質問(FAQ)
Q. GleamはElixirの代替ですか? A. 代替というよりは「補完的な存在」です。Gleamは型安全性を重視する開発者向けであり、Elixirのマクロや動的な柔軟性を求める場合はElixirのほうが向いています。両者はBEAMエコシステムで共存できます。
Q. Gleamで書いたコードからElixirを呼び出せますか? A. はい、可能です。GleamはErlang/Elixirのライブラリをそのまま利用できます。既存のElixirプロジェクトにGleamを段階的に導入することも現実的です。
Q. Gleamの仕事はありますか? A. 2025年時点ではまだ求人は少ないですが、スタートアップやElixir系の企業でGleamを採用するケースが増えています。学習しておくことで、ElixirやErlangの案件にも応用できます。
Q. フロントエンドにもGleamは使えますか? A. はい、JavaScriptへのコンパイルに対応しているため、ブラウザで動くアプリケーションを書くことができます。ただし現時点ではReactやVueのような充実したUIフレームワークはなく、実用性はまだ限定的です。
参考文献
Gleam公式ドキュメント( https://gleam.run/documentation/ )
Gleam Language Tour( https://tour.gleam.run )
