実践Rust入門の9章はRustで電卓のインタプリタを実装する内容になっています。今回はそれのBrainfuck版を実装しました。
まとめ
- RustでBrainfuckのインタプリタを実装しました。
- オーバーフローを無視して計算する
wrapping_add
,wrapping_sub
について理解しました。 - Ubuntu上でWindows用のコンパイルを行い、Windows10で動作確認をしました。
実装
インタプリタのbuild後にソースコードを指定して実行できるものを実装しました。
$ cargo build --release
$ target/release/brainfuck sample_program/hello_world.bf
実際のソースコードはmatsu7874/brainfuck: Brainfuck interpreter written in Rust.を御覧ください。
実装上の学び
RustはPythonと違い、整数のオーバーフローを気にする必要のある言語ですし、Brainfuckも各セルに入る値は実装依存になっています。
今回はu8
を採用し、255+1 => 0
という仕様にしました。
これを実現するちょうどよい関数(wrapping_add
, wrapping_sub
)が既に実装されています。
add
という名前は破壊的なイメージを持っていたのですが、これは非破壊的な関数で、v.wrapping_add(1);
と何回やってもv
は変化しません。
Ubuntu上でコンパイルしたバイナリをWindows上で動作確認する
せっかくなので、下記の記事の「rustup を使う方法」を参考に、UbuntuでコンパイルしてWindows10で動作確認をしてみました。 - Rustのクロスコンパイル(Linux, MacOSで作ったものをWindowsで動かす)
~/.cargo/config
の設定下記の内容を追加します
[target.i686-pc-windows-gnu] linker = "i686-w64-mingw32-gcc" [target.x86_64-pc-windows-gnu] linker = "x86_64-w64-mingw32-gcc"
誤って
Cargo.toml
の方に書くと、"error: linking withgcc
failed: exit code: 1" というエラーが出ました。
必要なツールの準備
$ rustup target add x86_64-pc-windows-gnu $ sudo apt install mingw-w64
targetを指定してbuild
$ cargo build --release --target x86_64-pc-windows-gnu
Windowsに
target/x86_64-pc-windows-gnu/release/brainfuck.exe
を持ってきて実行> ./brainfuck.exe ./hello_world.bf Hello World!
これでWindowsで動作確認ができました。