🪃

Uiua 言語で実装する http サーバ

2023/09/30に公開

https://zenn.dev/hatappo/articles/11c7ca2bc2d98e

の続き。

Uiua は組み込みで Audio や 画像 をサポートしている。また TCP ソケットを扱うこともできるので HTTP のサーバを書くこともできる。公式のリポジトリにサンプルがあるので動かしてみる。

https://github.com/uiua-lang/uiua/blob/main/examples/http_server.ua

コメントに従って clone してきたリポジトリの site フォルダで trunk を実行する。

trunk build --release

ちなみに trunk は Rust で書いた wasm ウェブアプリケーションをコンパイルやバンドルするものらしい。 webpack とかに近そう。 JS だけじゃなくて wasm バイナリも生成するけど。

https://trunkrs.dev/

エラー:

   Compiling wasm-bindgen v0.2.87
error[E0463]: can't find crate for `core`
  |
  = note: the `wasm32-unknown-unknown` target may not be installed
  = help: consider downloading the target with `rustup target add wasm32-unknown-unknown`

コンパイルターゲットが足りないらしい。

$ rustup target list --installed
aarch64-apple-darwin
x86_64-unknown-linux-gnu
x86_64-unknown-linux-musl

たしかに。
追加する。

$ rustup target add wasm32-unknown-unknown
info: downloading component 'rust-std' for 'wasm32-unknown-unknown'
info: installing component 'rust-std' for 'wasm32-unknown-unknown'
$ rustup target list --installed
aarch64-apple-darwin
wasm32-unknown-unknown
x86_64-unknown-linux-gnu
x86_64-unknown-linux-musl

良さそう。
再度、

$ trunk build --release

....

   Compiling uiua v0.0.5 (/Users/xxxx/uiua)
   Compiling site v0.1.0 (/Users/xxxx/uiua/site)
    Finished release [optimized] target(s) in 1m 25s
2023-09-30T10:55:48.736405Z  INFO fetching cargo artifacts
2023-09-30T10:55:49.104612Z  INFO processing WASM for site
2023-09-30T10:55:49.116124Z  INFO downloading wasm-bindgen version="0.2.87"
2023-09-30T10:55:51.999547Z  INFO installing wasm-bindgen
2023-09-30T10:55:52.061216Z  INFO calling wasm-bindgen for site
2023-09-30T10:55:52.469286Z  INFO copying generated wasm-bindgen artifacts
2023-09-30T10:55:52.471213Z  INFO applying new distribution
2023-09-30T10:55:52.471898Z  INFO ✅ success

通った。
けど、何が生成されたのかよくわからない。 target/wasm-bindgen/release/ あたりが生成された成果物のよう。

$ cd ../
$ uiua run examples/http_server.ua
Server started

http://localhost:8080 を開くとたしかに、公式サイトと同じウェブページが表示される。
起動したほうのターミナルにはログが吐かれている。

$ uiua run examples/http_server.ua
Server started
Request:
/
Response:
3019 bytes
Request:
/styles-c706be319f8bf9ff.css
Response:
11629 bytes
Request:
/site-8907d00a07aaa18c.js
Request:
/site-8907d00a07aaa18c_bg.wasm
Request:
/uiua-logo.png
Response:
42998 bytes
Response:
28348 bytes
Request:
/DejaVuSans.ttf
Response:
757143 bytes
Response:
7096460 bytes
Request:
/favicon.ico
Response:
2303 bytes
Request:
/DejaVuSansMono.ttf
Response:
335135 bytes

コンテンツはだいたい Rust で書かれていてウェブサーバは Uiua で書いたものが動いているということか。すごいな。

感想

他の言語との大きな違いは http_server.ua のコード眺めてもまったく内容がわからない。予約語(というか Griph)が頭に入ってないと逐一Griphホバーしてなんのトークンか確認しないといけなくて、ざっと眺めるというのがまだ自分には困難。眺めてるとコードがかわいいなというのはよく分かる。

続きは

https://zenn.dev/hatappo/articles/7e4c167aa1837d

Discussion