シェル、インタプリタ
Menu Menu
目的
この実験では、Unix上で動作するシェル(コマンド・インタプリタ)を作成する。この実験を行うことで、構文解析 インタプリタの実行 ファイルディスクリプタの管理 変数の値の管理などの実装を経験することができる。
実験方法
実験 level 1
シェルの実装例 は、yacc で書いた 簡単なシェルのインタプリタである。構文は、パイプ、リダイレクト、()、; 、&を含んでいる。これをコンパイルして、実行してみよう。Makefile があるので、それを調べて、どのようなファイルがyaccにより自動生成されるのか調べる。close を行っている部分を全てコメントアウトして、何が起きるかを観察せよ。(#define close(a) などとするのも簡単)また、何故、そのようになるかを説明せよ。
このシェルは、wait を実装していない。wait を実装して、(構文の変更が必要である)テスト用のスクリプトを作り動作を示すこと。
以下の機能を実装し、テストせよ。
実験 level 2
環境変数、シェル変数の設定と参照Perl や tcsh の様に、$var などの構文を使用しても良いが、C と同じように、int var などと宣言させる方法もある。
変数の名前と値の組は、hash 関数を使ってテーブルに格納する。
実験 level 3
リストと配列の実装リストや配列は複数の要素を格納する変数である。配列は、添字である数値によってランダムにアクセスすることができる。
配列の大きさをどのように決めれば良いか? リスト表現を使用すると、配列の大きさには制限がなくなるが、アクセスは遅くなる。
実験 level 4
PATH変数をリストで定義し、コマンド探索を実装せよ。stat を使用する必要がある。
実験 level 5
変数を使った四則演算コンパイラの授業の例題を参考にすると良い。インタプリタで良いので、コンパイラの授業の例題をほぼそのまま使うことが出来るが...
実験 level 6
if 文や、while 文を付け加えて、実装せよ。簡単なベンチマーク(階乗数列の計算など)を作り、動作時間を測定せよ。時間の測定には、time コマンドを使うことが出来る。
リダイレクトやパイプは、if 文や while 文でも、ちゃんと動作しているだろうか?
tcsh や Perl などと実行時間を比較し、考察せよ。
実験 level 7
このシェルのスクリプトのデバッグのための機能を設計し実装せよ。ヒント: 実行している文を表示するだけでも結構便利。perl -d を参考にしよう。
実験 level 8
level 3 の実行時間を短くする方法を考案し、実装せよ。また、実行時間を測定し、高速化の効果について考察せよ。コンパイルや、バイトコードを使用すると速くなることが知られている。しかし、そこまで実装しなくても、高速化する改良点はいろいろあるはずだ。
実験 level 9
自分で、今までにない、新しいレベルを作り、実装し、評価せよ。例えば、関数を実装する。引数呼びだしを定義するには、局所変数を実現する必要がある。RPCなどと組み合わせて、分散shellを実装するなどが考えられる。rloginを実装するには、pty に関する処理が必要になる。
まとめ
- シェルの構文定義の適切さに関する考察
- 一番最初に定義した構文と実際に動作した構文の差
- 全体の動作の効率性
- テストプログラムの適切さ
- 作成したシェルの汎用性
- 付加した機能の有用性と適切さ
などについて考察せよ。