関数型まつりでGleamについて話しました
関数型まつり2日目 16:30〜のセッションでGleamについて話しました。
この記事では当日のスライドを交えながら、話した内容や実際に発表した感想を書いていこうと思います。
自己紹介
実は今年から就活で山梨から上京しました。
山手線沿線あたりだったらわりと行けるので、生でGleamの話を聞きたい方がいたら一緒にご飯を食べにいきましょう!
Gleamの概要
GleamはErlang VMとJavaScript Runtimeで動く静的型付けな関数型言語です。
Louis Pilfold氏が開発している、シンプルな構文とErlang VMにもとづく並列性が特徴です。
多くのAltJS(JavaScriptへトランスパイルされる言語)はNode.jsのみ対応していることがほとんどですが、Gleamは他のAltJSと異なりNode.js, Deno, Bunの3つのランタイムに公式で対応しています。
さらにGleamが出力するJavaScriptコードはES6で出力されます。
AltJSとして見てもこの要素を備えている言語はなかなかないと思っています。
Gleamの哲学
Gleamの考え方を知ってもらうのが大事だと思っていたので結構多めに盛り込みました。
同じシンプルを目指しつつも、Goとは切り口が違うというのが伝わっていれば良いなと思っています。
スライドに載せている画像はこちらのサイトになります。
ちなみにこちらの記事を書かれたPeter SaxtonさんはGleam Weeklyという毎週Gleamのニュースが読めるニュースレターを運用しています。
僕も購読したりvim-jpのチャンネルに流したりしているのですが、知らないライブラリの情報が流れてきたりするので結構面白いです。
Gleamの特徴
Gleam本体の特徴についてです。
-
シンプルな構文
公式いわく「半日で覚えられる」そうです。 -
関数型
関数型言語なのでmapやfilterなども標準装備されています。
また、パイプ演算子や関数キャプチャなど、関数を合成する手段が整っています。 -
エラーメッセージが親切
Rust由来の読みやすい形式でエラーメッセージで表示されます。
Gleamは型定義が他の言語と少し異なり混乱する人が一定数いる[1]のですが、そのようなケースに対してエラーメッセージでアドバイスが表示されたりします。 -
Erlang VM / JavaScript Runtime
GleamはErlang VMとJavaScript Runtimeで実行できます。
Erlang VMで動くのでスケールするアプリケーションが比較的書きやすい言語です。
このあたりが哲学の話と混じってしまっていて、もっと整理するべきだったかなと思っています。
Erlang VMについて
セッションでも触れましたが、こちらの記事に全部書いてあるので僕の方から言えることはあんまりないです...
個人的には雑に並列処理が書けたり、処理系でプロセスを良い感じに管理してくれるのが他の言語にはない魅力だと思ってます。
エラーメッセージの例
スライドにも書いてありますが、こちらにもあらためて書いておきます。
error: Unknown variable
┌─ /src/main.gleam:3:8
│
3 │ echo prson
│ ^^^^^ Did you mean person?
The name prson is not in scope here.
warning: Unused variable
┌─ /src/main.gleam:2:7
│
2 │ let person = "Jhon"
│ ^^^^^^ This variable is never used
Hint: You can ignore it with an underscore: _person.
Gleamはユーザーフレンドリーに重きを置いている言語です。
エラーメッセージからLSPに至るまで細かく開発者をサポートしてくれる機能が付いています。
LSP
先述したように、Gleamはユーザーフレンドリーに重きをおいています。
特にLSPのコードアクションがとても充実しており、構文がシンプルゆえに書くのが面倒になりがちな部分を補っています。
このあたりのバランス感覚の良さがGleamの良さにつながっていると個人的には思っています。
構文
環境構築
公式ドキュメントが分かりやすいのでお勧めです。
注意点としては、Gleam本体だけだとコードの変換しかできないのでErlang VMやNode.jsといった処理系もインストールする必要があります。
エコシステム
Webサーバ
Gleamは公式がHTTPライブラリを提供していて、サードパーティのライブラリは基本的にこれを使って書かれています。
Gleamのライブラリどうしが型を共有しているため、ライブラリが組み合わせやすいというメリットがあります。
他にGleamでWebサーバを書く時に使われるライブラリを紹介していきます。
-
mist
Gleamで書かれたHTTPサーバです。
HTTP/2やWebSocketにも対応していて、事実上のデファクトスタンダードになっています。 -
wisp
mistをベースに書かれたライブラリです。
Webサーバを書く際に毎回定義するような処理を提供しています。
GleamでWebサーバを書く際はルーティングをパターンマッチで行います。
フロントエンド
Lustre
スライドでも触れたGleamのWebフレームワークです。
TEAベースの純粋関数型のアプローチでフロントエンドを構築できます。
UIの部品が純粋であるがゆえに、クライアントサイドからサーバサイド、果てはハイドレーションまで可能というレンダリングの柔軟さが特徴です。
個人的には、Gleam自身が非純粋な関数型言語であるのにもかかわらずコミュニティでは純粋関数型のアプローチが支持されている点がおもしろいなと思っています。
Gleamで実装されたアプリケーション
後述しますが、Gleamはデータベースにアクセスするライブラリも整っているため、フルスタックなアプリケーションを開発するポテンシャルをすでに備えています。
ここではそれらのアプリケーションをいくつか紹介していきます。
Gleam Packages
Gleamのパッケージを検索できるサイトです。
内部ではHexというErlang/ElixirのパッケージレジストリのAPIにアクセスしています。
Gloogle
HaskellのHoogleのようにキーワードでライブラリの関数名などを検索できます。
以前はかなりレスポンスが遅かったのですが、最近になって速度が向上したため普段使いもしやすくなりました。
kirakira
Gleamで実装された掲示板です。
登録には運用をしている方にDMをする必要があるらしく、僕は登録できていませんがフルスタックなアプリケーションの実装例としても価値があると思っています。
ここからはスライドに書けなかったSQLについて書いていきます。
補題: SQL
Gleamでもデータベース系のライブラリはいくつか出ており、データベースの操作は可能です。
cake
Gleamで作成されたクエリビルダです。
以下のデータベースに対応しています。
- PostgreSQL
- SQLite
- MariaDB & MySQL
クエリを生成するだけですので、データベースにアクセスするには別途ライブラリが必要です。
対応しているアダプタとして
などがあります。
squirrel
SQLからGleamのコードを生成するパッケージです。
Goのsqlcをイメージしてもらえると分かりやすいです。
PostgreSQLしか対応していない点は注意です。
これからの展望
Gleamはv1に到達して以降も活発に開発されています。
そのため今後はさらなる開発支援機能の追加や新なコンパイルターゲットの追加などを期待しています。
またコミュニティではコード生成技術の発達によるデコードの簡易化や、フルスタックフレームワークの登場による開発速度の向上などを期待しています。
事前にTwitterで何か聞きたいことがないか募集したところ、現状不満に思っている点について聞きたいとのツイートを見かけたのでここでいくつか挙げました。
内容としては、
- 個人的な要望としては、現状コードを生成するライブラリとコードを解析するライブラリのAPIが異なる点
- Webフレームワークのミドルウェア、特に認証系のミドルウェアが不足している
- 構文的な不満としてはレコードの書き方が冗長な点
これらの問題が解消されたら良いなと思っています。
寄付について
Gleamの開発者であるLouisさんは、現在フルタイムでGleamを開発しています。
しかし現状、寄付が十分ではありません。
もしGleamを気に入っていただけたのなら寄付をしてくださるとうれしいです。
余談
登壇後にTwitterを見ていた際、「どうしてそこまでモチベーションを保って追い続けられるのか」というツイートをちらほら見かけました。
いろいろ考えてたのですが、正直僕もよく分かっていません...
ただ、僕の中でGleamはアイマスとかラブライブと同じカテゴリにあって、記事を書くのはいわゆる「推し活」に近い感覚でやっています。
個人的には推し活は無理のないペースでやるものだと思っているので、頑張りすぎて息切れしないようジョギングするイメージで続けているのもその秘訣なのかもしれません。
いつかGleamの聖地巡礼がてらロンドンに行きたいですね...
-
僕もその混乱した人のひとりです。 ↩︎
Discussion
squirrel のところで
となっていますが、sqlx ではなく sqlc ではないでしょうか (?)
ご指摘ありがとうございます!
sqlxとsqlcを混同していました...
先程修正したので今は正しく表示されていると思います。