JavaCASL2(IPA公式(?)のCASL IIシミュレータ)クイックガイド for Linux (Ubuntu 10.04) and Windows XP

ものすごーく久しぶりに――具体的には6年ぶりぐらいに――偽アセンブラであるCASL IIを触ってみようと思い立ったのだけど、WindowsはともかくLinux上で使えそうなシミュレータがなかなか見当たらない。

Linux CASL」等でググってもIPAのサイトで公開されているCASL IIシミュレータ(以下、JavaCASL2)しか引っかからない。Javaで実装されているので動くには動くけど*1、実際にLinux上で環境を構築して動かした云々のネタは見つからない。なのでドキュメント片手に自分で環境構築しようとしたら、付属のドキュメントもサンプルもイマイチで、一見して参考になるようで結構当てにならない*2

そんなことがあったのでメモを残しておこうと思う。まあJavaCASL2をLinux上で使う人なんて基本的に物好き以外の何者でもないので、ある程度分かっている人向けの内容となっている。

後のほうでWindows XPでの環境構築の話も書いているけど、他にグラフィカルなシミュレータが色々あるなかでJavaCASL2を使う人なんてコマンドプロンプト大好きな物好き以外の何者でもないので、やはりある程度分かっている人向けの内容となっている。

Ubuntuでの環境構築 その1

JavaCASL2はIPAのサイトで公開されている。IPAの情報処理技術者試験のページから辿っていけば見つかるはず。このエントリを書いている時点ではZIP書庫と自己解凍書庫の2つが存在する。

ZIP書庫の中身はこんな感じ。解凍ツールによっては、空ディレクトリの中で解凍するようにしないとカレントディレクトリに中身がぶちまけられてしまうので注意。

javaCASL2_2.0
|   casl2.jar
|   Readme.pdf
|   readme.txt
|   run.jar
|
+---TestProgram
        CASL2.bat
        count1.cas
        ExplanatoryNote.txt
        extern.cas
        gsub1.cas
        gsub11.cas
        gsub2.cas
        Javas.bat
        RUN.bat
        sample1.cas
        sample2.cas
        sample3.cas
        sample4.cas
        smain.cas

今回は$HOME直下にディレクトリjavaCASL2_2.0を作成し、その中に書庫の中身を展開した。

実際に動かすには、展開したファイル中のcasl2.jarとrun.jarを使う。手順はこんな感じ:

  1. casl2.jarを使ってCASL IIのソースファイルをオブジェクトファイルに変換する。
  2. run.jarを使ってオブジェクトファイルを実行する。

付属のサンプルコードは動作確認に使うには微妙だったので、ハローワールドを用意してみた。

; hello.cas
MAIN    START
        OUT     MSG,LEN
        RET
MSG     DC      'hello, world'
LEN     DC      12
        END

まずはこのhello.casをオブジェクトファイルに変換する。

java -jar ~/javaCASL2_2.0/casl2.jar hello.cas

するとhello.objという名前でオブジェクトファイルが生成されるので、これを実行する。

java -jar ~/javaCASL2_2.0/run.jar hello.obj

Ubuntu 10.04のopenjdk-6-jreで動作した。但し、run.jarには実行時に指定したラベル名のサブルーチンが見つからなかった場合に外部のオブジェクトファイルの中を探す機能があるのだけど、うまく動作しなかった。Windows XPJRE 1.6.0_30では機能しているので、JREの違いかOSの違い*3に起因するとは思うものの、面倒なので調べてはいない。

他のJREでは試していない。

Ubuntuでの環境構築 その2

毎回JARを指定して実行するのは面倒だ。実際、付属のファイルにはラッパー用のバッチファイルもあったりする。

もう一つ不便なことに、casl2.jarやrun.jarにはヘルプ表示のオプションが存在しないようだ。なので付属のドキュメントReadme.pdfを参照しなくてはならない。

そこで引数無しか引数が `-h' ないし `--help' の場合に簡単なオプションの説明を表示するようなラッパーのシェルスクリプトを用意してみた。

まずはcasl2.jarのラッパー。

#!/bin/sh
# cas.sh

readonly JC2DIR=$HOME/javaCASL2_2.0

usage() {
	cat <<- EOT > "$1"
		assemble CASL2 source file (using JavaCASL2)
		usage: `basename $0` <src-file> [dst-name] [option]
		option:
		    -L  show label information
		    -S  show source list
		    -A  show source list with object information (same as \`-L -S')
	EOT
}

if [ $# -eq 0 -o $# -gt 5 ]; then
	usage /dev/stderr
	exit 1
fi

if [ $# -eq 1 ]; then
	case "$1" in
		-h | --help )
			usage /dev/stdout
			exit 0
			;;
	esac
fi

java -jar $JC2DIR/casl2.jar "$@"

そしてrun.jarのラッパー。

#!/bin/sh
# cr.sh

readonly JC2DIR=$HOME/javaCASL2_2.0

usage() {
	cat <<- EOT > "$1"
		execute CASL2 object file (using JavaCASL2)
		usage: `basename $0` <obj-file> [option]
		option:
		    -L      show program dump after loading
		    -M      show program map
		    -T      execute with system trace
		    -S      step mode
		    -Bxxxx  break at xxxx and start debug mode
		            debug command:
		      Bxxxx            set break point at address xxxx
		      E                exit program
		      G[xxxx]          run from address xxxx, or continue
		      M[xxxx[,yyyy]]   show memory dump from xxxx to yyyy (or all)
		      R                show register information
		      Sxxxx[=yyyy]     set value yyyy to address xxxx
	EOT
}

if [ $# -eq 0 -o $# -gt 6 ]; then
	usage /dev/stderr
	exit 1
fi

if [ $# -eq 1 ]; then
	case "$1" in
		-h | --help )
			usage /dev/stdout
			exit 0
			;;
	esac
fi

java -jar $JC2DIR/run.jar "$@"

どちらもヘルプの英語は無茶苦茶だと思う。

これでアセンブル && 実行の手順はこうなる。

./cas.sh hello.cas
./cr.sh hello.obj

私の環境では$HOME/binにPATHを通してあるので、恒久的に使うのならこのスクリプトを$HOME/binに放り込んでおくと思う。

Windows XPの場合

Windowsでの環境構築方法はJavaCASL2付属のドキュメントに書かれているものの、次のようなツッコミ所がある。

  • ファイルの配置先の指定がJ2SDK 1.4.2_06ベッタリ。というかJDKのインストール先フォルダにファイルをコピーするの?
  • そもそも実行するだけなのだからJREで十分なはずなのに、なぜJDK
  • 途中で出てくるjavas.batってどこで使うの? 何の為にどこで使うかは何となく想像がつくけど、ドキュメントには書いてないよね……。

この辺りを変更した手順はこんな感じ。

  1. JREをインストールしておく。現時点ではJRE 6が無難。
  2. JavaCASL2の書庫を展開する。以下の例ではフォルダC:\javaCASL2_2.0を作成し、その中に展開している。
  3. ラッパーのバッチファイルとしてcas.batとcr.batを用意し、どこか適当なPATHの通ったフォルダに置いておく。
  4. cas.batでオブジェクトファイルを生成し、cr.batで実行。もちろんコマンドプロンプト*4

cas.batとcr.batはこんな感じ。

@echo off
setlocal
:: cas.bat

set JC2DIR=C:\javaCASL2_2.0\

if "%1" == "" (
	goto HELPMSG
)
if "%1" == "/?" (
	goto HELPMSG
)

java -jar "%JC2DIR%casl2.jar" %*
exit /b %ERRORLEVEL%

:HELPMSG
(
	echo assemble CASL2 source file ^(using JavaCASL2^)
	echo usage: %~nx0 ^<src-file^> [dst-name] [option]
	echo option:
	echo     -L  show label information
	echo     -S  show source list
	echo     -A  show source list with object information ^(same as `-L -S'^)
) 1>&2
exit /b 1
@echo off
setlocal
:: cr.bat

set JC2DIR=C:\javaCASL2_2.0\

if "%1" == "" (
	goto HELPMSG
)
if "%1" == "/?" (
	goto HELPMSG
)

java -jar "%JC2DIR%run.jar" %*
exit /b %ERRORLEVEL%

:HELPMSG
(
	echo execute CASL2 object file ^(using JavaCASL2^)
	echo usage: %~nx0 ^<obj-file^> [option]
	echo option:
	echo     -L      show program dump after loading
	echo     -M      show program map
	echo     -T      execute with system trace
	echo     -S      step mode
	echo     -Bxxxx  break at xxxx and start debug mode
	echo             debug command:
	echo       Bxxxx            set break point at address xxxx
	echo       E                exit program
	echo       G[xxxx]          run from address xxxx, or continue
	echo       M[xxxx[,yyyy]]   show memory dump from xxxx to yyyy ^(or all^)
	echo       R                show register information
	echo       Sxxxx[=yyyy]     set value yyyy to address xxxx
) 1>&2
exit /b 1

JavaCASL2付属のCASL2.bat及びRUN.batには少し不満があるので、cas.shないしcr.sh相当のものを作ってみた。

アセンブル && 実行の手順はLinuxの場合と似たような感じ。

cas.bat hello.cas
cr.bat hello.obj

なおWindows XP上でしか動かしていない。Vistaや7、あと64bit環境で動くか否かは不明。

*1:Linux上で動くこと自体は2005年に自分で確かめた。

*2:多分、仕事でこんなドキュメントを書いたらまず上司に「やり直せ」と言われるだろうなあ。趣味でももうちょっとマシな方向に持っていくと思う。

*3:OSというか、例えばファイルパスの区切り文字の違いとか。Javaでのファイルパスの取り扱いを知らないので、見当違いなことを書いているかもしれない。

*4:……といいつつ私の場合はckwだけど。