将棋をモチーフにしたプログラミング言語「ModanShogi」が公開!

この記事を読むのに必要な時間:およそ 2.5 分

意味論

ModanShogiプログラムは,仮想的なレジスタマシン(以下,⁠仮想マシン⁠⁠)の上で実行される。

レジスタ

ModanShogiの仮想マシンは9個のレジスタを持つ。これらのレジスタには1番から9番までの番号が振られている。各レジスタは,1つの実数を保持することができる(つまり,整数だけではなく,小数も保持できる⁠⁠。

プログラムの開始時には,各レジスタは,そのレジスタ番号と同じ値を初期値としてもつ(つまり,1から9までの整数が入っている⁠⁠。ModanShogiには数値リテラルが存在しないため,これらの値をやりくりして必要な計算を行うことになる。混乱を避けるため,慣れるまでは1から4あたりのレジスタには上書きしない方がよいだろう。

スタック

仮想マシンには,9個のレジスタに加え,1つのスタックが用意されている。このスタックには実数をプッシュ・ポップすることができる。

命令

ModanShogiの命令群の概略を表1に示す。

表1 ModanShogiの命令群

PIECE別名 COL ROW意味
mov X YX = Y
add X YX += Y
sub X YX -= Y
mul X YX *= Y
div X YX /= Y
mod X YX %= Y
push X _Xをプッシュ
pop X _Xをポップ
putc X _文字コードXの文字を出力
putn X _Xを数値として出力
jump_if X YXが非0なら,ラベルY番にジャンプ
jump_ifp X YXが0以上なら,ラベルY番にジャンプ

mov命令は,レジスタY番の値を,レジスタX番に上書きする。

add/sub/mul/div命令は,レジスタX番とY番の加減乗除を行う。結果はX番に上書きされる。div命令の結果は小数になり得ることに注意。mod命令は,レジスタX番の値をY番の値で割った余りをX番に書き込む。

push命令は,レジスタX番の値をスタックにプッシュする。pop命令は,スタックからポップした値をレジスタX番に書き込む。

putc命令は,レジスタX番の値を文字コードとしてもつ文字を標準出力に出力する。putn命令は,レジスタX番の値を数値として出力する。

jump_if命令は,レジスタX番の値が0以外ならレジスタY番の値をもつラベルにジャンプする(つまり,そのラベルの直後の命令から実行を続ける⁠⁠。

jump_ifp命令は,レジスタX番の値が0以上だった場合にジャンプする。

Rubyによる実装

2010年4月1日現在,ModanShogiはその言語仕様のみが公開されており,実際に動く処理系は用意されていない。そこで本記事では,全世界に先駆け,RubyによるModanShogi処理系「ShogiModan」を実装した。以下のWebサイトからソースコードをダウンロードすることができる。

実行方法

ShogiModanのソースコードをダウンロードし展開したのち,リスト1のプログラムを適当なファイル名(ここではsample.modanとする)にUTF-8で保存し,以下のコマンドを実行する。

./bin/shogimodan sample.modan

画面に「Hello, world!」と表示されるはずである。

実装概要

言語処理系の分類としては,ソースコードを逐次実行するインタプリタ方式,ソースコードを機械語に変換するコンパイラ方式,中間言語にコンパイルしたものを仮想マシン(VM)で実行する中間言語方式の3種類が代表的である。このうち,ShogiModanは中間言語方式を採用している。

中間言語方式の処理系は,さらにスタック型とレジスタ型に分類できる。JVMなど,現代の多くの処理系がスタック型を採用しているが,プログラミング言語LuaのLua VM,Android用のJava VMであるDalivk VMさまざまな動的言語を実行するParrotなど,レジスタ型の仮想マシンも一部に存在する。

ShogiModanも,レジスタ型VMを採用しているため,各レジスタをCPUのレジスタと対応させ,アセンブリ言語に変換することで,さらなる高速化が見込める。実際に,ModanShogiプログラムから,LLVMのアセンブリコードを出力する拡張が,ujihisa氏の手によって行われている。

ModanShogiの今後

ModanShogiのプログラムは,必ずしも棋譜として正しいことが要求されないため,ありえない駒の移動や,二歩になる打ち駒なども動作するプログラムとして受け入れられてしまう。今後の改定では,不可能な駒の移動や反則をエラーとする機能(Strictモード)が言語仕様に追加される予定である。

また,棋譜をモチーフにしているという特性から,命令数を増やすのが難しいのではないかと思われていたShogiModanだが,⁠矢倉囲い」⁠穴熊囲い」など,駒を特定のパターンに沿って並べることで特殊な命令を実行するという奇手が検討されている図2⁠。

図2 今日の将棋における先進的な陣形,ゴールデンクロス囲い

図2 今日の将棋における先進的な陣形,ゴールデンクロス囲い

著者プロフィール

原悠(はらゆたか)

NaClこと「ネットワーク応用通信研究所」勤務。さまざまなプログラミング言語に興味を持つ。最近触っている言語はRuby,Scheme,JavaScript,Englishあたり。

URL:http://route477.net/

著書