10 月 19 日(月)

ソースコードの再利用

これまで作成してきたプログラム cg の分割ソースコードを再利用して, 新たなプログラム「タートルグラフィックスインタプリタ tg」 を作成しよう.


TG 言語の仕様

タートルグラフィックスは, 初心者向けプログラミング言語 LOGO で発明された CG の描画方法(というか,お絵描き方法)だ. カーソル(cursor)をマウスなどで直接操作するのではなく, タートル(turtle; 亀)に命令を与え,絵を描いてもらう.

前期「 プログラミング言語II」で利用した KTurtle の元ネタだ.

ここではタートルに与える命令(TG 言語)の仕様を次のように決めておく:

KTurtle と似ているが,違いもあるので注意しよう.

ユーザはこれらのコマンドを組み合わせてタートルに与える. たとえば,正方形を描くには:

forward  100     # 100 歩前進
right  90        # 90 度右旋回

forward  100
right  90

forward  100
right  90

forward  100

さて,このようなコマンドの羅列から グラフィックスを生成するようなプログラムは, 基本的には前回までの cg と同じパターンで実現できる. そして次回は,命令ファイルを効率的に記述できるようにするために, 次のような制御構造を追加する予定:

これらの手続き制御コマンドを利用すれば, 命令ファイルをコンパクトに記述できるようになる. たとえば,上の例と同じ正方形を描くためのコードを, 次のように短く書けるようになる:

repeat 4
  forward 100
  right 90
end

さらに,これらの手続き制御の繰り返し命令は, ネスト(nest; 入れ子)になっていてもよいことにしよう.

repeat ...
  repeat ...
    repeat ...
      ...
    end
  end
end
ここまでできれば, この命令ファイルのことをCや scheme のソースファイルと同様に, 「言語」とか「プログラム」と呼んでも文句は出ないだろう. なお,インタプリタ型言語のプログラム=命令ファイルは, ソースコードではなく, スクリプト(script)と呼ばれている.

TG の基本プログラム

タートルグラフィックスインタプリタ tg の基本プログラムを作成してみよう. このために,すでに作成済みの分割ソース版 cg の ソースコードを再利用する.

なお,以下の作業を進める前に, cg のディレクトリのバックアップコピーを作っておくと安全:
$  cp  -rp  cg/  cg.bak/
$  cd  cg/

まず,分割ソース版 cg のディレクトリへ移動しよう. そして,そのディレクトリに,次のソースファイルをダウンロードしよう.

このソース内で使われているファイル処理関数 ftell( ) および fseek( ) については, 後日解説予定.

このままでは,まだ,コンパイルできないかもしれない. 各自の分割状況に適合するように, tg.c の内容(ヘッダファイル名,関数名,等) を修正する必要があるだろう. 参考のため,元々の tg.c で仮定しているヘッダファイルの内容を 次に示しておく:

自分のヘッダファイルの内容がこれらと異なっていても, 一概に間違いというわけではない. 人生色々,分割方法も色々です.

前回までに作成した分割ソース(ヘッダファイルやソースファイル)の内容については 変更しないこと. 今回のソースファイル tg.c だけを変更すること.

もちろん,以前の分割方法が不適切だった場合には,うまく行かない. その場合,tg.c 以外についても修正すること.

また,コンパイルするために, すでに作成済みの Makefile の内容も修正しよう. オブジェクトファイル tg.o およびプログラムファイル tg をターゲットとして エントリを追加

all: cg tg		# これもあると便利かも(make だけですべてコンパイル)


tg: tg.o pbm.o draw.o ...	# 依存ファイル名については各自変更必要
	cc tg.o ...

tg.o: tg.c pbm.h draw.h ...	# 依存ファイル名については各自変更必要
	cc -c tg.c ...

cg: cg.o ...
	cc cg.o ...
...

distclean:
	-rm cg tg	# これも追加必要

Makefile が完成したら tgmake しよう. それと,以前のプログラム cg についても 再コンパイルできることを確認しておこう:

$  make  distclean	# コンパイルの準備
$  make  cg		# cg のコンパイル
$  make  tg		# tg のコンパイル
クドいが...ここまでの作業での変更対象は, tg.cMakefile だけだ. 他のファイルの内容については,変更せずそのまま使うこと. 他のファイルを変更しちゃうと,当然, せっかく完成していたプログラム cg を 再コンパイルできなくなってしまう可能性がある. (もちろん,以前の分割方法が不適切だった場合には,変更も必要.)

make できたら,スクリプトを作成し実行してみよう. サンプル tg スクリプト:

実行方法:

$  ./tg  スクリプト.tg | display &

実行結果:


練習問題(1)

さまざまな幾何学図形を描画するための tg スクリプトを作成せよ.

基本プログラムの状態で使えるコマンドは, forwardleftrightrepeat-end だけ.

タートルグラフィックスの考え方を理解しよう. リモコンで亀を操作,みたいな感覚. (...すでに理解しているハズですね?)

練習問題(2)

基本プログラムでは,コマンドとして forwardleftright, および repeat 〜 end の 4 つしか解釈できない. 他のコマンド(基本描画コマンド backwardpendownpenup, および初期設定コマンド gotoangle)を実装せよ.

手続き制御コマンド push, exec については今回は保留. 次回,課題とする予定.

(c) 2015, yanagawa@kushiro-ct.ac.jp