4.Mindコンパイラと関連ツールの使い方

以下での操作例は Windowsの場合を示しています。Linux環境ではパス区切り文字など、Windowsとは多少異なる部分もあります。お手数ですがLinux環境についてはWindowsでの操作から推測してお読み願います。
ここで紹介するすべてのツールはMindで記述されています。ソースファイルは tool¥ に格納されているのでプログラミングの参考にしてください(Mindコンパイラのソースは初期リリースには含まれませんが近いうちに公開します)。

mind(Mindコンパイラ)

 第3章「Mindの原理」の冒頭の「簡単なプログラムを実行してみる」のセクションにおいて、hello.src というMindのソースプログラムをコンパイルしました。そのときはMindコンパイラである mind のごく簡単な起動方法で使いましたが、ここで詳しく解説します。
 mindを引数無しで起動すると、簡単なヘルプを表示してきます。以下のようなものです。
c:¥pmind>mind

日本語プログラミング言語 Mind Version 8.0 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
Usage(1): mind -help (オプション詳細を表示)
Usage(1): mind source library [objectdir¥][objfile]
source
コンパイル対象となるソースプログラム名を指示します。拡張子名である .src は普通は省略しますが付けても構いません。
library
リンクするライブラリ名を指示します。拡張子となる .mco .sym は省略しますが特別に .sym を付けることも許されます。
たとえば file など標準ライブラリ (正確には、環境変数「MLIBPATH」で登録されているパス群にあるライブラリ) を指示する場合にはパスを省略することができます。
objectdir¥  (Linuxでは objectdir/)
これはオプションです。オブジェクトファイル群を出力するディレクトリを指定できます。省略するとカレントディレクトリになります。Mindシステムでは(たとえば toolディレクトリ) obj¥ を好んで使っています。
objfile
これはオプションです。オブジェクトファイル名を指定できます。これが指定されると、ソースファイル名にかかわらず、指定したファイル名でオブジェクトファイル群を出力します。
オブジェクトディレクトリ、ファイル名の指定
 以下に例を示します。
                            -- 簡単な例 --

  ソースファイル名(拡張子なし)
       ↓
>mind hello file
           ↑
      ライブラリ名(拡張子なし)
 上記では、ソースファイル hello.src とライブラリ file を指定し、オブジェクトファイルはソースファイルの主ファイル名と同じで複数の拡張子を持つ以下のファイル群が出力されます。
カレントディレクトリに以下が出力される‥
    hello(.exe)       ←Linuxでは拡張子なし
    hello.mco
    hello.sym
    hello.his
                            -- 複雑な例1 --

ソースファイル名  オブジェクトディレクトリ (Linuxでは obj/ のようにする)
       ↓       ↓
>mind hello file obj¥
           ↑
         ライブラリ名

     (注:obj¥ の指定を単に obj とすると、obj.exe ... のようなファイルが生成されてしまう)
 上記では第3引数にてオブジェクトファイルのディレクトリを明示しています。この場合、指定したディレクトリにオブジェクトファイル群が出力されます。(注:文法エラーが有った場合に生成される .inf ファイルだけは、ディレクトリ指定にかかわらずカレントディレクトリに置かれます)
指定ディレクトリ obj¥ に以下が出力される‥
    hello(.exe)       ←Linuxでは拡張子なし
    hello.mco
    hello.sym
    hello.his
                            -- 複雑な例2 --

ソースファイル名     オブジェクトファイル名 (Linuxでは obj/aisatsu のようにする)
       ↓           ↓
>mind hello file obj¥aisatsu
           ↑
         ライブラリ名
 上記では第3引数にてオブジェクトファイルのディレクトリとファイル名を共に示しています。この場合、ソースファイル名にかかわらず、指定したオブジェクトファイル名で出力されます(注:ディレクトリを省いてオブジェクト名だけにすることも可能です。その場合はカレントディレクトリに出力されます)。
指定ディレクトリ obj¥ に以下が出力される‥
    aisatsu(.exe)       ←Linuxでは拡張子なし
    aisatsu.mco
    aisatsu.sym
    aisatsu.his
コンパイラの起動オプション
 mindを引数「-help」のみで起動すると、起動オプションを含む詳細なヘルプを表示してきます。以下のようなものです。
c:¥pmind>mind

日本語プログラミング言語 Mind Version 8.0 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
Usage(1): mind -help (オプション詳細を表示)
Usage(2): mind source library [objectdir¥][objfile] [-s -ms -mc 
                                    -local -x -inf] [-e:mindexfile]
 オプションはたくさんありますが、特殊な用途のものも含まれるので、一般に使えそうなもののみ解説します。
-s (Silent)
コンパイラの立ち上がりメッセージ(日本語プログラミング言語〜〜Copyright)を抑制します。
これを指定しても、「コンパイル中 .. 終了」の行だけは出力されます。
-local
コンパイルの初期段階でリンク先のライブラリを取り込みますが、その際に、下位ライブラリに含まれるローカルシンボル(「ローカル」宣言したソース範囲にある宣言)を捨てずに維持します。
file¥ ディレクトリにある3レベルのライブラリのコンパイルではすべてこれが指定されています。
-x (実行ファイル生成の抑制)
コンパイルの最終段階で、ソースファイル名と同じで拡張子が .exe の実行ファイルを生成しますが、その生成を抑制します。

mmake(自動再コンパイル)

 第3章「Mindの原理」の「コンパイラが入出力するファイル」のセクションにて .his ファイルについて解説した部分 がありますので合わせてお読みくだいさ。
 コンパイラは処理の最後に、コンパイル手順の履歴‥‥副ソースファイルを含めてすべてのソースファイル名やタイムスタンプ、そしてリンクしたライブラリなどの情報‥‥を .his ファイルに出力します。
 これを参照することで、再び同じソースをコンパイルする場合に、最初と同じコマンドラインを(思い出しながら)手で入力せずに済むようになっています。さらには、ソースファイルに変更があった時だけ再コンパイルを行うという判断もおこなわれます。
 この仕組みを利用するには、コンパイラ mind を直接に起動するのではなく、代わりに mmake というプログラムを実行します。
 mmakeを引数無しで起動すると、簡単なヘルプを表示してきます。以下のようなものです。
c:¥pmind>mmake
Usage: mmake [dir¥]objectname [compiler]   (デフォルトのコンパイラ=mind)
 (objectnameには拡張子は付けません(.hisを参照します)
 通常は以下のいずれかの起動で良いでしょう。
(カレントディレクトリにオブジェクトファイルが有る場合)
  mmake objectname

(ディレクトリ dir にオブジェクトファイルが有る場合)
  mmake dir¥objectname       (Linuxでは dir/objectname)
 第3章「Mindの原理」の「簡単なプログラムを実行してみる」のセクションで、サンプルの hello.src をコンパイルしてみる くだりがありました。既にそれを行っている状態として以下をおこないます。(sample¥ ディレクトリの中で操作してください)
c:¥pmind¥sample>mmake hello

c:¥pmind¥sample>
 上記のように何も起こりません。最後のコンパイルからソースファイルが修正されていないため、コンパイルは不要と判断されたからです。
 ここで試しにソースファイルを修正してみます。エディタで hello.src を開いてください。次のような内容になっているはずです。
メインとは     「こんにちは、Mindです。」を 表示して 改行すること。
 ここで、わざとエラーになるような修正をしてみます。以下のように訂正してください。
メインとは     「こんにちは、Mindです。」を 表示表示して 改行すること。                       ↑このように訂正
 再度、mmakeを起動します。
c:¥pmind¥sample>mmake hello

hello.srcが新しい。
[再コンパイル] mind hello file

日本語プログラミング言語 Mind Version 8.0 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
1 個のエラーが有ります。

 上記のように、ソースファイルが変更されたことが検出され、自動的にコンパイラが起動しました。
 また、エラーがある旨表示されています。
 エラー内容を見るため、hello.inf をエディタで開くか、typeコマンドでコンソールに表示して見てください。
c:¥pmind¥sample>type hello.inf
hello.src 2 行目でエラー。行内容は、
    「こんにちは、Mindです。」を 表示表示して 改行すること。
      要因1:"表示表示"は未定義の単語です。

1 個のエラーが有ります。
 ここで再び、エディタで hello.src を開き、「表示表示」という誤りの箇所を元の「表示」に直してください。そして再度、mmakeを実行します。
c:¥pmind¥sample>mmake hello

hello.mcoが無い。
[再コンパイル] mind hello file

日本語プログラミング言語 Mind Version 8.0 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:¥pmind¥bin¥mindex.exe --> hello.exe

 上記のように正しくコンパイルされました。


mhist(履歴表示)

 第3章「Mindの原理」の「コンパイルの概念」「プログラムの履歴」のセクションで履歴情報について解説しました。そこでも簡単に mhist を使ってみましたが、改めて解説します。
 mhistを引数無しで起動すると、簡単なヘルプを表示してきます。以下のようなものです。
c:¥pmind¥sample>mhist
Usage: mhist [-d -h] program
        program   Mindプログラム名(拡張子無しまたは.sym付き)
        -d        詳細情報も含める
        -h        ベンダー開発情報
 hello.src のコンパイル結果を調べてみます。
C:¥pmind¥sample>mhist hello

 "hello"の履歴 (対応するランタイム=mrunt010)
+------+----------------+----------------+-----------+----------+-----------+
|module|filename        |compile date    |total words|total code| total data|
+------+----------------+----------------+-----------+----------+-----------+
|   0|yoyakugoG       |2016 12/ 2 16:49|        221|         0|          0|
|   1|asmword         |2017  2/ 3 17:15|        621|       128|          0|
|   2|console         |2017  2/ 3 17:15|        531|    11,424|     21,804|
|   3|file            |2017  2/ 4 18:12|        878|    34,848|    615,388|
|   4|hello           |2017  2/11 17:38|        532|    34,896|    615,388|
+------+----------------+----------------+-----------+----------+-----------+
  Next code location=00008850   Next data location=000963DC
 上記を見ると、helloがコンパイルされるまでにどのようにモジュールが積み上がっているかがわかります。