RustでCコンパイラ その02 STEP4まで

2025-11-15 12:20:44

下記をRustで実装する続き。
低レイヤを知りたい人のためのCコンパイラ作成入門

Githubは下記。
commitコメントに、learnt step N って書いているから、該当のところをみれば変更が分かると思う。

ryotakato/tvcc

何が難しかったって、
Step 3の、トークナイザーのところで、
元はCのポインターとかを活用しているのだけど、
Rustの所有権、ライフタイム、nullがないこと、借用規則のせいでそのまま実装するのが大変だったこと。

でもかなり頭使って、データ構造がどういうものがRustにあっているのかってのがよく分かった。

なるべく元のCプログラムに合わせたかったけど、STEP4までで結構違っているが、
まあ、アセンブリ結果は一緒だったからいいかなと。

参考になったのは下記。
トークナイザーを作るときに、LinkedListを作るんだけど、
単方向リストを作る方法として下記を参考にさせてもらった。

Rustで単方向リストを実装する(Box版) #Rust - Qiita

記事では、Box版はないわーって書いてあり、RcとRefCellを使ったほうがいいって書いてあるが、
とりあえず末尾に加えるだけの機能がほしかったので、上記で十分だった。
でもIteratorまわりがなぜas_derefが必要になるのかを理解できていない。

あと、末尾への参照としてtailを持たせたかったけど、Boxだけではできなかった。
これはRustの所有権と借用規則のせいだと思う。

難しいけど、すごく楽しい。

次は四則演算。




Comments

There are currently no comments on this article, be the first to add one below

Add a Comment

Note that I may remove comments for any reason, so try to be civil. If you are looking for a response to your comment, either leave your email address or check back on this page periodically.