実践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 withgccfailed: exit code: 1" というエラーが出ました。
必要なツールの準備
$ rustup target add x86_64-pc-windows-gnu $ sudo apt install mingw-w64targetを指定してbuild
$ cargo build --release --target x86_64-pc-windows-gnuWindowsに
target/x86_64-pc-windows-gnu/release/brainfuck.exeを持ってきて実行> ./brainfuck.exe ./hello_world.bf Hello World!これでWindowsで動作確認ができました。