RustでBrainfuckのインタプリタを実装する

実践Rust入門の9章はRustで電卓のインタプリタを実装する内容になっています。今回はそれのBrainfuck版を実装しました。

https://amzn.to/2K52yMM

まとめ

  • 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で動かす)

  1. ~/.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 with gcc failed: exit code: 1" というエラーが出ました。

  2. 必要なツールの準備

     $ rustup target add x86_64-pc-windows-gnu
     $ sudo apt install mingw-w64
    
  3. targetを指定してbuild

     $ cargo build --release --target x86_64-pc-windows-gnu
    
  4. Windowsにtarget/x86_64-pc-windows-gnu/release/brainfuck.exeを持ってきて実行

     > ./brainfuck.exe ./hello_world.bf
     Hello World!
    

    これでWindowsで動作確認ができました。