icon

nazo6.dev

一覧に戻る
2025/4/9 2025/11/5 10 min read

「Rustが嫌いです。」の感想

この記事はZennにも投稿しています

目次


「Rustが嫌いです。」の感想


この記事を読んで1Rustユーザーとして思ったことを書いた。

#全体を通して

  • WASM固有の問題にハマってしまっている
  • Rustをスクリプト言語と同じ枠で見てしまっている

の2点が辛さの原因であると感じた。

前者について、この方はフロントエンドにRustを使っているようだがここは確かに整備が行き届いてない分野でWASM特有の問題とJSとのFFIの辛さがもろに感じられて辛いと思う。 割となんでもかんでもRustを使う自分であってもWebフロントエンドにはおとなしくTSを使うようにしている(ただ、dioxusはホットリロードを開発中だったりと結構頑張っているようなのでいつかはRustでフロントエンドも現実的になるかもしれない)。

後者について、この記事では全体的に「JSやPythonではこんなに簡単だったのにRustでは難しい/エラーが出る」という評価が多いが、これは後述するようにRustが提供するものと期待のずれが原因だと感じた。

#各節について

#1

「所有権の概念を理解すれば、あとは簡単です」は事実かも知れないがそこに行き着くのはかなり難しいと思う。(自分もライフタイムエラーで苦しむことはよくある)

1.1についてはコメントに指摘がある通りleakを使わずStringを入れればよいと思う。 1.2は周りのコードをちゃんと見てみないとなんとも言えないがそれこそ所有権を理解していればそこまで苦労はしないはず。

#2

2.1のcfgまみれについてはtraitを使うことで軽減される可能性があるが型システムの表現力不足や定義の煩雑さゆえににcfgを使うことも多い。これはある程度仕方のないことかなと思う。またJSと違いプラットフォームに適合しないコードは大抵コンパイルすらできないので実行時の分岐は困難。 2.2のCargoのfeatureシステムが分かりづらいというのは正当な批判だと思う。自分は最近組み込み向けRustを弄っているがfeature滅茶苦茶になることがある。ただこれより良い解決策があるかとも言われると…

#3

3.1の問題は自分もこのエラーに出会ったことがあり、確かにドキュメントが不足気味だった記憶がある。ただ「準必須ツールがインストールできないことが日常茶飯事」だとは思わない。また、nodejsと比較されているがWebが前提となっているJSと比較するのはフェアではない。 3.2についてはそのドキュメントの問題だと思う。

#4

コンパイル時間の遅さについてはその通りで、これはたびたびRustコミュニティでも話題になっている。ただ「開発環境でも動くことを祈って書いた呪文」がこの.cargo/config.tomlなのは解せない感じはある。このconfigだとビルドは通常よりさらに遅くなるだろう(ただし良いバイナリができる)。 4.2についてはこのような事例に当たったことがないのでよくわからない。

#5

Rustでも意味不明なエラーメッセージが出ることは確かにあるがこの例で示されたエラーは「Copyトレイトが実装されていない値がmoveされた → なのでその値はもうborrowできませんよ」と明確に示しており特に冗長であるとは感じない。

#6

このコードはRustのwasmチュートリアルに出てくるコードで、確かに最初見ればゲッとなりそう。こういう場合はlogクレートとwasm-loggerなど外部クレートを使う事が多いと思う。

現在Rustのwasmターゲット(wasm32-unknown-uknown)はブラウザ向けであるとは定まっていないためstdのprintからブラウザに出力といったようなことはできない。そういうターゲットを追加すべきかどうかについては意見が分かれるところかもしれない。

ただ通常のRustではprintln!dbg!があるのにwasmの事例をもって「デバッグ=苦行」というのは言いすぎではないかとは思う。少なくともロギングに関してはlogtracingなど優れたクレートが存在している。

#7

まず、RustはTypeScriptやPythonやGoに比べてメモリ安全性が特に向上するわけではない。ただそれに付随する機能によりプログラムが堅牢になる可能性は高い。 また、「おそらく半分の時間で2倍の機能を実装できていただろう」については結局のところ個人の感想でしか語れないがRustで記述することによって最初は時間がかかるものの設計が一度できあがるとリファクタリングやバグの発見が容易になり生産性が向上すると感じている。

#感想

wasm関連やビルドが遅いことについては自分も共感できる部分が多かったが、他の部分についてはこの記事の筆者が期待しているものとRustが提供するものにズレがあるからこうなってしまったのではないかと感じた。 Rustが存在する背景、メモリ管理について理解するとこの記事で出るようなエラーについてもある程度納得してもらえるのではないかと思う。

「メモリ管理を安全かつ効率的に行う」「コンパイル時にできるだけ多くのエラーを検知し、正しいコードを書かせる」がRustにとっての最重要課題だが、Rustではそれらを達成するためにいくつかの枷がはめられており、特に一つ目の目標を達成するためのものが所有権やライフタイムである。

ただし高レイヤでは必ずしもRustが提供するGCなしのメモリ安全性が必要なわけではない。 自分はメモリ安全性以外にもRustの高パフォーマンスさ、豊富な型システムによる間違いの犯しにくさ、エコシステムの豊富さを魅力だと感じて通常のアプリケーションなど比較的高いレイヤにおいてもRustを使っている。 そう考えているのは自分だけというわけではなく、だからこそ最近ではRustはWebサーバや果てはWebフロントエンドのような高レイヤにも進出している。

高レイヤでも使えるとは言え、RustはCやC++などのシステムプログラミング言語と同種のものであり、JSやPythonとは違う問題を解決しようとして生まれたということを知らずに「なんか性能の高い言語」とだけ思って使うと、Rustにより課される制限がただただ鬱陶しいものと感じてしまうだろう。

Share this article:
一覧に戻る

関連記事

2021/12/27

2023/10/20

#tech/lang/rust
memo

Rust

気づきとかいろいろ

Read Article

2024/3/23

#tech/lang/rust#hardware/keyboard/keyball
blog

RustでKeyballのファームウェアを書きたい話

KeyballのファームウェアはQMKを使ったC言語のものになっています。ですがやはりRust、使いたいですよね?

Read Article

2023/5/26

#tech/lang/rust#tech/database
memo

RustでSQLからコードを生成するcornucopiaについて

SQLからRustのコードを生成して安全にデータベース操作ができる。恐らくGoのsqlcと同じ感じなんだと思う。

Read Article

2023/11/15

#tech/lang/rust
memo

Rustでジョブキュー的なもの

実行するコマンド(EnqueueかClear)をチャネルで受け取る

Read Article

2025/12/13

2025/12/14

#tech/lang/rust
blog

RustでデスクトップGUI - gpui入門 Part1 (gpuiの仕組み・状態管理の基礎編)

gpui解説記事のPart1。gpuiのレンダリング方法や状態管理について、実際のソースを見ながら詳しく解説します。

Read Article

2024/4/26

2024/5/22

#tech/lang/rust#hardware/keyboard/keyball
blog

RustとEmbassyでKeyballのファームウェアを作った

以前RustでKeyballのファームウェアを書きたい話で、ATMega32U4向けのファームウェアの作成をRustで試みたという話を書きましたが、結論から言うとこれは諦めてProMicro RP2040向けのファームウェアをRustで書くことにしました。

Read Article

2023/8/27

#tech/lang/rust
memo

Rustのserde_jsonでエラーの発生箇所を知る方法

serde_jsonではパースエラー発生時にどのプロパティでエラーが発生したのかわからない

Read Article

2023/6/27

#tech/lang/rust
memo

Rustのtargetフォルダを軽くする

cargo-sweepを使う

Read Article

2022/2/13

#tech/lang/rust
memo

Rustアプリにwasmerを埋め込む

dioxusを使ってwebでもdesktopでも動くアプリを作りたい

Read Article

2025/3/29

#tech/lang/rust
memo

Rustアプリのメモリ使用量を調査する

主にstatic領域のメモリ使用量を調査するのに有益。embassyの独立したタスクなどのサイズが見れる。

Read Article

2023/9/10

2023/12/18

#tech/lang/rust
blog

SerdeのDeserializerを実装する(Part1)

Serdeで任意の形式のファイルなどをデシリアライズする際にはDeserializerを書く必要があります。この記事では基本的なDeserializerの書き方を解説します。 正直自分もあまり理解していない部分が多々あるのですが世に出ている情報が少ないので書くことにしました。

Read Article

2023/12/18

2023/12/19

#tech/lang/rust
blog

SerdeのDeserializerを実装する(Part2 JSON編)

この記事はRust Advent Calendar 2023 シリーズ3の19日目の記事です。

Read Article

2024/5/24

#hardware/keyboard#tech/lang/rust
blog

USB HIDキーボードでメディアキーを操作する方法

USB HIDでは0x80がVolume Up、0x81がVolume Downに割り当てられており、さらに0xEDや0xEEでもVolume UpやDownができそうですが、実はこれらは全て動きません(Windowsでは)。

Read Article

2023/9/1

#tech/lang/rust
blog

prisma-client-rust入門

prisma-client-rustはJavascript向けのORMであるprismaをRustから使えるようにしたものです。実はprismaのコア部分はRustで書かれているためこういうものも作りやすかったんじゃないかと思います。

Read Article

2021/12/25

#tech/lang/rust
memo

tauriでWindows上でproductionビルドでのみ画像が表示されない(fetchエラーが発生する)

誰の役にも立たない気がするけどハマったのでメモ

Read Article

2023/11/18

#tech/lang/rust
blog

tokioで作ったサーバーをdockerで起動すると終了が遅くなるときの対処法

axumなどを作ってRustでサーバーを作るとdocker compose stopなどが微妙に遅くてイライラだったのでそれを解決する方法です。

Read Article

© 2025 nazo6. All rights reserved.