2020-07-14
メモリに所有権を導入して安全性を確保するプログラミング言語「Rust」がおもしろそうです。お気に入りのJavaScriptの実行環境 Deno でも使われていることもあり、本格的に入門してみます。 今回のターゲットは、IchigoJam (Arm NXP LPC1114)です!


1. シンプルに 1+1 を計算するRustプログラム
2. エルチカ(LEDをチカチカさせるループ)
3. かわくだりゲーム in Rust!
4. CPUに書き込んでいるので、ケーブルを外しても動きます!

Rustで書くメイン関数はこんな感じです。c4ijをベースに作っていただいた rust4ij by mitsujifork して改造しながら使いました。 main関数の返り値は、IchigoJAM BASICのコンソールで表示されます。マシン語起動用のBASICコードは、Makefile内にあります。

fn main(_param:i32, _ram:i32, _rom:i32, _divfunc: fn(u32, u32) -> u64) -> i32 { return 1 + 1; }

i32は符号付き32bit整数、u32は符号なし32bit整数。fnは関数を表します。

エルチカはこんな感じ。実際には、IchigoJam用のライブラリ以外、余計なものをリンクしないような設定が6行、加わります。(src on GitHub)

fn main(_param:i32, _ram:i32, _rom:i32, _divfunc: fn(u32,u32) -> u64) -> i32 { loop { out(7, 1); wait(10); out(7, 0); wait(10); } }

led関数を定義しておくのもいいですね。コンパイル型の言語の場合、使わない関数はメモリを消費しないので、分かりやすいライブラリをいろいろ作っていくのがお得です。


ゲームもこのように作れます。IchigoJAM BASIC版C言語版Ruby版Armマシン語版とも比べてみましょう。

fn main(_param:i32, _ram:i32, _rom:i32, _divfunc: fn(u32, u32) -> u64) -> i32 { cls(); let mut x:u32 = 15; let mut score:u32 = 0; loop { locate(x, 5); putc(236 as char); locate(rnd(32), 23); putc('*'); putc(10 as char); wait(3); let c:u32 = inkey(); if c == 28 { x -= 1; } if c == 29 { x += 1; } if scr(x, 5) != 0 { break; } score += 1; } putstr(b"SCORE:\0" as *const u8); putnum(score); putc(10 as char); return 0; }

Rustの真骨頂は、メモリ管理にあり!ここまではほぼBASICやC言語などと変わらない感じですが、必要に応じてメモリを確保したり開放したりする際、Rustらしさがでてくるはず。 プログラムで7KBまで、RAMも1KBくらいはフリーで使えるので、IchigoJam BASICでは難しい大作づくりにチャレンジするのもおもしろいかも!?


MacとUSBシリアルで接続して、sector指定書き込み対応のlpc21ispを使用して、書き込みます。

LEDを付ける out(7, 1) だけのプログラムを逆アセンブルしてみました(make disasm)

Disassembly of section .data: 00000000 <.data>: 0: b580 push {r7, lr} 2: af00 add r7, sp, #0 4: 20d8 movs r0, #216 ; 0xd8 6: 8802 ldrh r2, [r0, #0] 8: 2007 movs r0, #7 a: 2101 movs r1, #1 c: 4790 blx r2 e: 2000 movs r0, #0 10: bd80 pop {r7, pc} 12: 0000 movs r0, r0 14: ffec 7fff ; <UNDEFINED> instruction: 0xffec7fff 18: 0001 movs r1, r0 ...

素直でコンパクトなマシン語になってました!
小さいコンピューターにコンパクトに実装するのが好きうれしい Rust でした!

links
- Rust Programming Language
- taisukef/rust4ij: Rust language for IchigoJam (forked from rust4ij by mitsuji)
- 高専でなぜC言語を学ぶのか? IchigoJamマシン語生成プログラム c4ij で作る、C言語版かわくだり

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS