Mindの原理(コンパイラの使い方)


小さなGUIアプリケーションの起動テスト
 インストールが終って最初にやることとして、コンパイル済みの小さなGUIアプリケーションを起動してみます。
 MindおよびGUIエンジンのランタイムが正しく機能するか確認するためですが、セキュリティソフト(アンチウィルスソフトなど)により起動が妨げられることがないかの確認も兼ねます。
 Windowsのエクスプローラで、Mind9\samplew\ フォルダを開き、その中にある hellowin.exe をダブルクリックして起動してください。
 上記のようなウィンドウが現れたら正しく起動しています。タイトルバーの「×」をクリックして閉じてください。

 万が一、次のようなウィンドウが現れた場合には、Mind9 のディレクトリが正しく展開されていない可能性があります。お手数ですがインストール操作に問題が無かったか確認をお願いします。
   (Mind9\bin\mrunt102.exe が見つからない)
   (Mind9\tclruntime\ フォルダが見つからない、あるいはその中身が壊れている)
 もし上記のいずれでもなく、セキュリティソフト(アンチウィルスソフトなど)の警告が表示された場合には、アンチウィルスソフトが誤検出をしてしまった可能性があります。お手数ですが、README文書の Mind9\README-mind9-windows.txt の「セキュリティ」という項目をお読みいただき対応をお願いします。
まれに、GUIアプリケーションを起動したとき以下のエラー・ダイアログが表示されることがあるかもしれません。
このエラーは vcruntime140.dll というプログラムがPC上に見つからないというものです。
これは VC++ という言語で作成されたアプリケーションの走行に必要なランタイムです。Mindは直接的には使っていませんが、GUIエンジンのTcl/Tkが使うため間接的に使うことになります。
通常の販売店から購入したPCなどではこのエラーが出ることはまず無いのですが、たとえばWindowsをご自身でクリーン・インストールしたようなPCでは起きるかも知れません。
他社さんのサイトで恐縮ですが、たとえば以下のようなWebページを参考にしていただき、このdllをご自身でPCにインストールしていただくようお願いします。
「VCRUNTIME140.dllが見つからないため〜」とエラーが表示された場合の対処方法 - FAQ / よくあるご質問
https://solutions.vaio.com/556
(「X86」と「X64」の2種類がありますが両方をインストールしてください)

2種類の開発環境

 Mindでプログラムを開発するのに2つの環境が利用できます。
1.Mind WorkBench を使う方法
 Mind9 から導入された統合型開発環境の Mind WorkBench を使うのが標準的な方法となります。
 (Mind WorkBench は Mind9 で作成されたGUIアプリケーションでもあります)
Mind WorkBench の中でソースコードの作成/編集、コンパイル、実行といった、プログラム開発に伴う作業のほとんどをおこなうことができます。
2.コマンド プロンプト を使う方法
 一つ前の Mind8 のように、コマンド プロンプト(ターミナルソフト)を開き、その中でコマンドを入力するなどのキー操作によってコンパイルや実行をおこなう方法です。Mind8の時とまったく同じように使えます。
 Mindコンパイラの起動や実行のほかにも、キーボードから他のWindowsプログラムやツールも実行できる上、頻繁に使うスクリプトはバッチファイルを組むこともできるため、熟練した方は、あるいは大規模なプログラム開発ではこちらのほうが能率的に開発をおこなうことができる可能性があります。


Mind WorkBench の起動
注: 以下では Mind WorkBench を使ってコンパイルや実行をするケースを説明していますが、それらの作業はコマンド プロンプト環境であってもおこなえます。
注: Mind WorkBench の詳しい説明は、Mind WorkBench のTOP画面で、メニューバーの「ヘルプ」-「使いかた」 で表示されるヘルプに書かれているのでそちらをお読み願います。(ここではざっくりとした導入のみとなります)
 Windowsのエクスプローラでフォルダ Mind9¥bin¥ を開き、mindwb.exe をダブルクリックすることで起動します。(exeファイルのショートカットを Mind9¥ 直下、あるいはデスクトップ上に置くと起動が楽になります)
 最初に2秒間だけ Mind WorkBench のロゴが表示されたあと上記のようなウィンドウが開きます。
注: 日本語入力システム(IME)にATOKをお使いの方は、まれにロゴが本体ウィンドウの裏に回ってしまって見えないことがあるかも知れません。これはATOK特有、あるいはATOKとMind9のGUIエンジンとの相性の問題でありMind9の障害ではありません。

Mind WorkBench のトップ画面
 Mind WorkBench の トップ画面は以下の構成になっています。
ソース表示域:
ソースファイルの内容がここに表示されます。エディタの機能を備えているので この表示域内でソースコードを編集できます。
[編集]-[エディタ起動] により外部エディタを起動しそちらで編集することもできます。
境界線:
ソース表示域と実行域を分ける境界線はマウスでつまんで上下に動かせます。
実行域:
コンパイラを起動したり、プログラムを実行したとき、ここに実行の様子が表示されます。
ワークディレクトリ:
ワークディレクトリは「カレントディレクトリ」と同じ意味です。 ここに表示されているディレクトリ内でソース作成やコンパイル作業をおこないます。
起動時は lesson\ になっていますが、[変更]ボタンを押すことて変更できます。
[ファイル]-[開く] でソースファイルを選択する際、ファイル選択ダイアログ内でディレクトリを変更した場合にはこのワークディレクトリも連動して変更されます。
ライブラリ:
ソースファイルをコンパイルする再にリンク先となるライブラリを選択できます。
起動時は lib\guilib が仮に選択されていますが、[変更]ボタンを押すことて変更できます。
既にコンパイルされたことのあるソースファイルを開いた場合(.hisファイルが存在)は、履歴情報を見ることで自動的にライブラリが変更されます。
Mind WorkBench の主要な操作

 最低限覚えておきたい操作は以下の通りです。
ワークディレクトリ(作業場所)を選ぶ
最下段左の [ワークディレクトリ] および [変更] ボタン:
起動した直後のワークディレクトリは lesson になっています。その右にある[変更]ボタンで変更できますが、とりあえずこのフォルダで試してみてください。
ライブラリを選ぶ
最下段右の [ライブラリ] および [変更] ボタン:
起動した直後のライブラリは guilib になっています。その右にある[変更]ボタンで変更できます。
作成するアプリケーションがGUI(ウィンドウを開くタイプ)であればこのままで試してください。
作成するアプリケーションがGUIでない(コンソールアプリ)場合は[変更]ボタンを押して file を選択してください。
ソースファイルを開く(または 新規作成する)
メニュー:[ファイル]-[開く] または [ファイル]-[新規作成]
ファイルを開くためのダイアログが表示されるので好きなソースファイルを選び出ます。
新規作成の場合は新しいソースファイル名を指示してください。このときの拡張子は .src が強制されます。
(ソースファイルの拡張子は .src です)
(ソースファイルの文字コードとしては Shift_Jis を使います)
ソースコードを確認・編集する(または新規にキー入力する)
ソース表示域でソースコードを確認し、あるいは編集します。
何らかの編集があった場合は、メニュー:[ファイル]-[保存] でファイルに反映しますが、Ctrl-s のショートカットが便利です。
もし引き続いて [コンパイル] あるいは [再コンパイル] をおこなうのであればソースの保存は自動的に行われるのでそのまま放置でも構いません。
コンパイルする
メニュー:[初期コンパイル]
現在のソースコード(ソースファイル)をコンパイルし、オブジェクトファイル(実行ファイル)を生成します。
コンパイルの様子は実行域にモニタ表示されます。
コンパイル中に文法エラーを検出した場合には、エラー情報がダイアログとして表示されるのでそれを参考にしてソースコードを訂正します。
再コンパイルする
メニュー:[再コンパイル]
ソースコードが既にコンパイルされた状態でソースを修正し再度コンパイルしたい場合にはこちらのボタンを使います。(文法エラーがあったときのソース修正時もこちらです)
コンパイルの様子は実行域にモニタ表示されます。
実行する
メニュー:[実行]
ソースコードが既にコンパイルされている時、[実行]ボタンが有効化されています。これを押すとプログラムが実行されます。
アプリケーションがGUI(ウィンドウを開くタイプ)であればアプリケーションが起動しウィンドウが開きます。確認が終ったらウィンドウを閉じてください。
プリケーションがGUIでない(コンソールアプリ)場合はアプリケーションの文字出力が表示域に表示されます。
 Mind WorkBench にはこの他にも多くの機能があります。詳しい情報が メニューバーの 「ヘルプ」-「使いかた」 で表示されるヘルプに書かれているのでそちらをお読み願います。

簡単なプログラムをコンパイル/実行

1.GUIアプリケーションをコンパイル
 まずワークディレクトリが lesson になっているか確認してください。違っていたら lesson に変更してください。
 次に、ライブラリが guilib になっているか確認してください。違っていたら guilib に変更してください。
 次に、メニュー:[ファイル]-[開く] でダイアログを開き、hellowin.src を選択します。
 ソース表示域には以下のように hellowin.src の内容が表示されたはずです。
 コンパイルします。メニュー:[初期コンパイル] を押してください。
 コンパイルの様子が実行域に表示されます。
 実行します。メニュー:[実行] を押すとプログラムが起動し、アプリケーションウィンドウが開きます。(確認したらウィンドウは閉じてください)
 このとき、起動したことを示す情報が実行域に表示されています。
 次にソースコードを修正してみます。
 ソース表示域の中でキーボードを使い次のように訂正してください。
    (旧) 「こんにちは。」を ラベル1に テキストを設定し
          ↓
    (新) 「おはようございます。」を ラベル1に テキストを設定し
 このとき、Mind WorkBenchのウィンドウタイトルが、
     Mind WorkBench - hellowwin.src
                      ↓
     Mind WorkBench - hellowwin.src*
と変化し、ソースファイル名直後に「*」が付くことで何らかの編集があったことを知らせています。

 次いで、再コンパイルします。メニュー:[再コンパイル] を押します。
 再コンパイルの様子も実行域に表示されます。
 実行します。再び [実行] ボタンを押すとプログラムを起動できます。(確認したらウィンドウは閉じてください)
2.コンソールアプリケーションをコンパイル
 今度はコンソールアプリケーションをコンパイル/実行してみます。
 ワークディレクトリは lesson になっていますね。違っていたら lesson に変更してください。
 次に、メニュー:[ファイル]-[開く] でダイアログを開き、hello.src を選択します。
 ソース表示域には以下のように hello.src の内容が表示されたはずです。
 次いでライブラリを確認します。ライブラリが file になっているか確認してください。違っていたら file に変更してください。
 次にコンパイルします。メニュー:[初期コンパイル] を押してください。
 コンパイルの様子が実行域に表示されます。
 実行します。メニュー:[実行] を押すとプログラム(hello.exe)が起動し、プログラムが出力した文字列が実行域に表示されます。
文法エラーがあった場合
 ソースコードに誤りがあるとコンパイル時に文法エラーが検出され、Mind WorkBench 環境下ではエラー情報がダイアログとして表示されます。それを参考にしてソースコードを訂正してください。(.infファイルの内容がダイアログとして表示されます)
 次の図は lessonフォルダにある bunpouerrwin.src というソースファイルをコンパイルした時の Mind WorkBench の応答です。
注1: bunpouerrwin.src はわざと文法エラーを起こすためのサンプルプログラムです
注2: コンソール版のソースは bunpouerr.src というファイル名です
注3: .infファイルをエディタで開く方法でも見られますが、確認が終ったらエディタ画面は閉じてください(そのまま再度コンパイルしようとするとアクセス競合でエラーになります)
オブジェクトファイルの生成先
 たとえば、lesson フォルダ内でコンパイルをおこなった場合、コンパイル結果となるオブジェクトファイル群は lesson\obj フォルダ内に生成されます。
 ソースファイルが置かれている場所にオブジェクトも生成すれば良いのに・・と思われるかも知れません。
 もちろんそうすることもできますが、1つのディレクトリに多数のプログラムが存在する場合、ディレクトリ内の総ファイル数が多くなってしまい、たとえばエクスプローラで閲覧しにくくなる上、元となるソースファイルと、コンパイル結果であるオブジェクトファイル群が混在することで見分けがつきにくくなる難点もあります。
 この問題に対応するため、Mind WorkBench では次のような仕組みでコンパイルをおこないます。
 Mind WorkBench は「初期コンパイル」ボタンが押されたとき、ワークディレクトリ配下に obj フォルダが存在するかチェックします。もし存在すれば、コンパイラ起動時に、オブジェクトファイル生成先を obj とするような指示をおこないます。逆に obj フォルダが存在しない場合はそのような特別な指示はせず、オブジェクトファイル群はソースファイルの存在場所に・・つまりワークディレクトリ内生成されます。
 Mind WorkBench によってプログラムを何かコンパイルした際、「コンパイルしたのにオブジェクトファイル群が無い!」と驚かないでください。もし下位に objフォルダがあるのであれば、その中に生成されています。
 さらに複雑なことがあります。
 Mind WorkBench 環境下でGUIアプリケーションをコンパイルする時、下位にobjフォルダがある場合には次のようなオブジェクト生成となります。
  (hellowin.src をコンパイルしたと仮定)

  ワークディレクトリ\
        hellowin.src  ←これはソースファイル
        hellowin.exe  ←実行時に必要
        hellowin.mco  ←実行時に必要

  ワークディレクトリ\obj\
        hellowin.his  ←実行時には不要
        hellowin.sym  ←実行時には不要
 上記のように、4つのオブジェクトファイルが2つずつに分れます。
 このようにしている理由は、プログラム hellowin を実行するのに必須な2つのファイル、hellowin.exe と hellowin.mco のペアをワークディレクトリ直下に置きたいからです。
 GUIアプリケーションはエクスプローラからexeファイルをダブルクリックすることで起動するのが通常であり、もし exeファイルが obj\ 下にあったのではダブルクリックするのが面倒になる・・という操作面での配慮です。
 また Mindのプログラムは .exe/.mco ファイルがセットで動作することから、exeファイルの置き場所に mcoファイルも置くという事情もあります。


コンパイルの概念

 Mind で言うところの「コンパイル」の概念とその内容について詳しく説明します。
コンパイルとは
 「コンパイル」とは、日本語で記述されたプログラム(中身はテキストファイル)をコンピュータが実行可能な機械語に翻訳する作業を指します。
 翻訳元となるプログラムを「ソースプログラム」または「ソースコード」と言い、翻訳結果の機械語を「オブジェクトプログラム」または「オブジェクトコード」と言います。

 ソースプログラム
 オブジェクトプログラム
翻訳の方法
 翻訳を行なう為には辞書が必要です。ソースコードに記述されている単語が何を表しているのかを認識するためです。Mindシステムに付属するファイルの中に(特に lib¥ 内) .sym という拡張子のファイルが幾つか入っていたはずです。これが辞書に相当するファイルです。
 Mindでは次のような方法をとっています。
 この考え方は、人間の成長の仕組みと似ています。産まれたばかりの赤ちゃんは殆ど知識を持っていませんが、大人が教育することでどんどん知識を身に付けて成長してゆきます。
Mindのプログラムミング
 プログラマはコンピュータ(Mind)に新しい単語を覚えさせます。その覚えさせ方は「○○とは・・・・である」という体裁をとります。新しい単語を、既に知っている単語の集まりで判り易く説明するのです。
 Mindでプログラムを記述することは、新しい語彙をコンピュータに教えることにほかなりません。その語彙の数だけコンピュータは利口になってゆきます。Mindは人間で言えば義務教育終了のレベルでユーザに届けられます。ユーザ側ではさらに独自の業務知識を覚え込ませてから実社会で使うものであると思って下さい。
ライブラリとは
 我々は「プログラム」という言葉から、それ単独で何かの処理を行なうことができる独立した能力をイメージしがちです。しかし、先に述べたように、Mindではコンピュータに知識を与えることがプログラミングですから、それが完結したものでなく、ある業務の為の基礎知識というものも考えられます。
 基礎知識ですから, 直ちにそれだけで特定の仕事ができるわけではありません。これらを「ライブラリ」と名付けることにします。ライブラリは何種類か付属していますが、たとえば、 lib¥ ディレクトリにある file.mco(sym) や guilib.mco(sym) などはそれに相当します。
 ライブラリは成長途中のある時点の知識であると言えます。ライブラリの上にまたライブラリをかぶせる(さらに知識を与える)というような階層構造になっています。
 ライブラリも通常のプログラム(実行可能なもの)も、みかけは同じ形をしています。ソースプログラムの最後に「メイン」という単語が定義されているものが実行可能なもの(.exeファイルが付く)で、「メイン」が無いものがライブラリ(.exeファイルが付かない)であると理解してください。
プログラムの履歴
 Mindで作成されたプログラムは、メインプログラム/ライブラリを問わず、 すべてに履歴書のようなものが付けられています(拡張子 .sym のファイルです)。この履歴書は次の方法で見ることができます。
Mind WorkBench のメニューで:
  「表示」-「プログラムの履歴」
  「表示」-「ライブラリの履歴」
コマンド プロンプト環境で:
  Mindの標準ツール mhist コマンドを使って表示
 ためしに標準ライブラリの一つである file の履歴を見てみます。
 まず、Mind WorkBench環境でおこなってみます。
 ライブラリを file に変更したあと、メニュー:「表示」-「ライブラリの履歴」を操作すると次のような情報が実行域に表示されます。


 次にコマンド プロンプト環境でやってみます。
 Mind WorkBench のメニュー:「ファイル」-「コマンド プロンプトを開く」 を操作してコマンド プロンプトのウィンドウを開き、そこでキーボードから mhist コマンドを打ち込みます。
C:¥Mind9¥lesson>mhist file

 "C:¥Mind9¥lib\file"の履歴 (対応するランタイム=mrunt002 Serialno=11)
+------+----------------+----------------+-----------+----------+-----------+
|module|filename        |compile date    |total words|total code| total data|
+------+----------------+----------------+-----------+----------+-----------+
|   0|yoyakugoG       |2016 12/ 2 16:49|        221|         0|          0|
|   1|asmword         |2025  9/16 18:12|        582|       320|          0|
|   2|console         |2026  7/11 14:52|        545|    13,040|     22,208|
|   3|file            |2026  7/11 14:52|        826|    38,032|    616,596|
+------+----------------+----------------+-----------+----------+-----------+
コマンド プロンプトでの上記操作ではライブラリ file のパスを指定していませんが、mhistは自動的に lib¥ の場所を知り、そこにある file を見つけて表示しています。もちろん明に存在パスを指定しても構いません。
 履歴表示の1行目にある yoyakugoG というモジュール0が新生児の知識に相当します。この行の「total words」という項目に注目してください。日本語に直せば「総単語数」となりますが、いわば語彙数に相当するものです。最初は220程度の語彙しか持ちませんが以降、ライブラリのモジュール番号(ライブラリのレベル)が1〜3に成長するに従って知識が増大してゆくのを見ることができます。
リンク
 「リンク」はソフトウェア用語で言えば、別々のプログラムモジュールをつなげることの意味として使われていますが、それらが並列的に接続されるイメージで使われることが多いので、誤解の無いようにここで補足しておきます。
 Mindでは、ある下位ライブラリに接続して新しいプログラムをコンパイルすること(関係性)をリンクと呼んでいます。別の見方で言えば、ある下位ライブラリの知識にかぶせて次のライブラリまたはメインプログラムの知識を与えることを指します。このリンクは直列的に行なわれます。
   ┌───────────────┐
   │               │
   │    レベル2の知識    │
 ┌─→    (file)     |知識の合計はL0+L1+L2
リ│ │               │
ン| |┌─────────────┐|
ク| ││             ││
 └───             ││
   ││   レベル1の知識   ||知識の合計はL0+L1
 ┌──→  (console)  ||
リ| ││             ││
ン| |│┌───────────┐|│
ク| ||│           ||│
 └────           ||│
   ||│  レベル0の知識  |||知識の合計はL0
   ||│ (yoyakugo)|||
   ||│           ||│
   ||└───────────┘||
   ││             ││
   |└─────────────┘│
   │               │
   └───────────────┘
 一般的なアセンブラやコンパイラでいう明な「リンク」というフェーズ(実際、他の言語では「リンカー」というツールが存在することが多い)は Mindには存在しません。リンクはあくまでコンパイル作業の一つであり、コンパイルと同時に内部で自動的に行なわれます。従って Mindでのリンクという言葉は、リンクという作業段階を指すのではなく、モジュールの結合関係を指す目的に使われます。つまり、「・・にリンクして・・をコンパイルして下さい」というように使います。
単語の習得について
 先の「プログラムの履歴」のセクションにもありましたが、Mindの標準的なライブラリであるfileモジュールで約800程の単語が入っています。
 「800もの単語を覚えないとプログラムが書けないのか!」と思われるかも知れませんが、この点は心配ありません。この全てを知っていないとプログラムが書けないわけではないからです。とりあえずはこれから作るプログラムに関係しそうな語から覚えていけば良いのです。
 たとえばですが、何万語と言われる日本語の語彙に比べれば、小学生の知っている語彙数など本当に僅かなものですが、彼等は日常会話をこなすことができます。−−−それに、あなたがこれから覚えなくてはならない単語というのは日本語なのですから−−−。
コンパイラが入出力するファイル
 冒頭の「簡単なプログラムを実行してみる」において、hello.src というMindのソースプログラムをコンパイルしました。このとき、次のようなファイル群が入出力されています。

           ┌─────────┐     実行ファイルはライブラリを
           │ライブラリ    │     作る際は出力されません
           │  file.mco   │         ↓
           │  file.sym   │    ┌─────────┐
           └─────────┘    │実行ファイル   │
                |      ┌→ │  hello(.exe) │
              入力|      │  └─────────┘
┌─────────┐     |      │  ┌─────────┐
│ソースファイル  │入力   ↓      出力 │Mコードファイル │
│  hello.src  │─→[Mindコンパイラ]─┼→ │  hello.mco  │
│         │            │  └─────────┘
└─────────┘            │  ┌─────────┐
                       │  │シンボルファイル │
                       ├→ │  hello.sym  │
                       │  └─────────┘
                       │  ┌─────────┐
                       │  │ヒストリファイル │
                       ├→ │  hello.his  │
                       │  └─────────┘
                       │  ┌ ─ ─ ─ ─ ┐
                       │   インフォメーション 
                       └→ │  hello.inf  │
                          └ ─ ─ ─ ─ ┘
                               ↑
                         文法エラーがあった時のみ出力



 メインを含み、それ自体で起動するプログラムでは、実際には .exe/.mco ファイルだけが得られれば良いのですが、mhistを使って履歴を見たり、mmakeを使って自動再コンパイルをおこなうといった目的のため、このようなたくさんのファイルを生成しています。
 以下に個々のファイルについて解説します。

■exeファイル(実行ファイル)(Linuxでは拡張子なし)
 「メイン」という単語を含むプログラムは単独で起動し実行することができますが、そのようなプログラムをコンパイルした場合に生成されます。メインの無い(=ライブラリとなる)プログラムのコンパイルでは出力されません。
 一見すると、この実行ファイルがプログラム本体に見えますが、実はこれは本体プログラムをキックするためのプログラムに過ぎません。本体プログラムのサイズにかかわらず、このファイルは固定サイズで小さなものです。

■mcoファイル(Mコードファイル)
 実質的なプログラムの本体(オブジェクトコード)はこれです。Mindは Version 7 以降、コンパイラはMコードと呼ぶ中間コードを生成するようになりました。Mindのランタイム(mruntXXX.exeというファイル)がこれを解読・実行します。
 これ自身はCPU命令を含まないため直接にはOSから起動することができませんが、代わりにキッカーとなるプログラム(前記のexeファイル)がその仲立ちをするので、最終的に普通にexeファイル形式(Linuxでは拡張子無しの実行ファイル)のプログラムを起動したかのようにふるまいます。

■symファイル(シンボルファイル)
 「辞書」に相当します。これまで覚えた単語が全部入っいます。これはテキストファイルではないので目で見ることはできません。

■hisファイル(履歴ファイル)
 ヒストリファイルという意味で .his になっています。これにはコンパイル手順の履歴‥‥それまでコンパイルしたすべてのソースファイルの名前やタイムスタンプ、そしてリンクしたライブラリの情報‥‥が記入されています。
 これはテキストファイルなので見ることができます。たとえば、たびたび取り上げてきたサンプルプログラム hello.src をコンパイルした時の hisファイルは以下のような内容です。
..........
hello.src      2004-05-08 18:38.04  file
 hello.srcは簡単なプログラムなので履歴も小さいですが、コンパイル単位が何層にもなる大きなアプリケーションをコンパイルした時は何行も記入されます。
 行内の内訳ですが、まず最初にソースファイル名が記入され、次いでそのファイルが更新された日時、その次に「file」とあるのは、リンク先のライブラリ名です(もし起動オプションもあれば続いて記入されます)。
 もう少し大きなプログラムとして、tool¥ ディレクトリにある mmake の履歴ファイルを見てみます。
..........
mmakeF.src     2023-11-18 09:11.39  ..\lib\file2  obj\mmakeF
  コンパイル mmakeFsub.src   2023-09-29 10:10.17
 上記では2行の情報が記入されています。
 最初の行はメインソースとなる mmakeF.src に関するものです。コンパイラ起動時に第3引数で生成ディレクトリとファイル名を明に指定している(obj¥mmakeF)のも分かります。
 2行目には、同ソースファイルから読み出される副ソースとしてmmakeFsub.src の情報が記入されています。
 自動再コンパイルをおこなうツールである mmake(このプログラム自身ですが)は、このファイルに書かれている情報をもとに再コンパイルをおこないます。
 .hisファイルは結果的にmmakeの為だけにあるようなファイルですが、開発者が目で見ても有益です。これを読めば、そこまでコンパイルして来たすべてのソースファイルの名前と更新日時、リンク先ライブラリ名、そしてコンパイラ起動時の引数まで知ることができるからです。

■.mco/.symファイルのペア
 これらは, さらに上位のプログラムモジュールをコンパイルする際のリンクに用いられます。ライブラリ的なプログラム(上位のプログラムにリンクされる)の場合は、このペアのファイルは、言わば途中結果のような立場となります。
xxx.mco ──┐
          ├─→ 上位プログラムのコンパイル時にこれをライブラリ指定する
xxx.sym ──┘
■infファイル(インフォメーションファイル)
 開発者向けのメッセージが入ります。通常はコンパイル時に文法エラーがあったとき、そのエラー情報が記入されます。開発者はこのファイル内容を見て、どこに間違いがあったかを知ることができます。
 Mind WorkBench 環境下でコンパイルをした時には、文法エラーがあると自動的に.infファイルがダイアログで開かれるので確認が容易ですが、コマンド プロンプト環境下では type コマンドで見る、あるいは分量が多い場合はエディタでファイルを開いて読む方法となります。
 なお、.infファイルをエディタで開いたまま再度コンパイルをおこなうと、ファイルのアクセスが競合するためにコンパイルに失敗するため注意してください。再コンパイルをする場合はエディタ画面を閉じてください。


コマンド プロンプト環境下でのプログラム開発

 Windows向けターミナルである コマンド プロンプト の環境下で開発する方法を説明します。
 Mind WorkBench でGUIアプリケーションとコンソールアプリケーションのどちらも作成できるのと同様に、コマンド プロンプト環境下でも、どちらのタイプのアプリケーションも作成できます。
コマンド プロンプトを開く
 幾つかの方法があります。
1. Mind WorkBench のメニューで:
  1-1 「ファイル」-「コマンド プロンプトを開く」
  1-2 「実行設定」-「コマンド プロンプトを開く」 (プログラムが開いている間だけ可能)
      → いずれも、ワークディレクトリをカレントディレクトリとして立ち上がる
2. エクスプローラで:
  エクスプローラのアドレスバーに「cmd」と打ち込む
  → 開いているフォルダをカレントディレクトリとして立ち上がる
3. コマンド プロンプトを直接起動:
  3-1 タスクバー:[スタートボタン]右クリック - [ターミナル」
  3-2 タスクバー:[スタートボタン]右クリック - [ファイル名を指定して実行] - 「cmd」を入力
  3-3 cmd.exeのショートカットをデスクトップなどに置き、それをダブルクリック
 上記1が推奨です。この方法によれば、コマンド プロンプトが立ち上がった時、ワークディレクトリがカレントディレクトリとなるだけでなく、コマンド プロンプトでのMindでの作業に必須となる usemind.bat の起動も自動的に行われるため、すぐMind関連の作業に入ることができます。
 Mind WorkBench を立ち上げず、直接にコマンド プロンプトを開きたい場合は上記2または3の方法で開いてください。
コマンド プロンプトの作業を終了したい(ウィンドウを閉じたい)場合は、コマンド プロンプトのタイトルバー右の「×」をクリックするか、あるいはコマンドとして exit を入力してください。
− Mind WorkBench 経由でなく直接コマンド プロンプトを開いた場合 −
(Mind WorkBench 経由の時は以下は自動的におこなわれます)

 まずカレントディレクトリが Mindのインストールディレクトリではない場合はそこに移るところから始めます。
注:Mindのインストールディレクトリを c:\Mind9 と仮定します
>cd c:\Mind9

c:\Mind9>
 つぎに作業用の環境変数をセットアップするためのバッチファイルを起動します(このバッチファイル usemind.bat は Mindのインストールディレクトリ直下にあります)
c:\Mind9>usemind   ←必ず一度実行する
Mind9の開発環境を設定しました
 上記のセットアップはコマンド プロンプトが開いている間は有効ですが、閉じると解除されるため、コマンド プロンプトを開く都度実行する必要があります。
 上記セットアップによって、Mind9\bin に対して環境変数 PATH が設定されるので、すべてのツール類(mind.exeなど)はコマンド プロンプト内からパス無しで起動できるようになります。

 ためしにコンパイラ(mind.exe)をわざとパス無し起動してみます(単純起動すると Usage を表示してきます)。
c:\Mind9>mind

日本語プログラミング言語 Mind Version 9.03 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
          (GUI library is evaluation version) ←ライセンス情報

Usage(1): mind source library [objectdir\][objfile]
Usage(2): mind -help (オプション詳細を表示)

 上のメッセージが表示されればMindコンパイラの起動はOKで、Mind9\bin に対してPATHが通っていることが分かります。
  「GUI library is evaluation version」 の部分は、正式版GUIライブラリがインストールされると所有者のメールアドレスと共にライセンス情報が表示されます。
 もしコンパイラが起動せずに、
     'mind' は、内部コマンドまたは外部コマンド、
     操作可能なプログラムまたはバッチ ファイルとして認識されていません。
のようなメッセージが表示された場合は、環境変数 "PATH" が正しく設定されていないことになります。作業開始時に usemind.bat を実行しているか確認してください。
コンパイラの起動
 コンパイラ(mind.exe)の起動方法は以下の通りです。
(注:以下では ソース名を SOURCE、ライブラリ名を file と仮定しています)
(方法1)
  >mind SOURCE LIBRARY
    (例:mind hello file)
       file にリンクして hello をコンパイルする

(方法2)
  >mind SOURCE LIBRARY OBJECTDIR
    (例:mind hello file obj)
       上と同様だが、オブジェクトファイルの生成先を指定

(注:起動引数のバリエーションは他にもあります。「mind -help」と起動してください)
 ためしに小さなコンソールアプリケーション(hello)をコンパイルしてみます。
 hello.src は smaple\ ディレクトリにもありますが、ここでは lesson\ にあるものを使います。
 まず lesson フォルダに移動し(元からそこに居るなら不要)、次にソースファイルがあることを確認するため stamp(Mind9付属ツール)を使ってみます。
c:\Mind9>cd lesson

c:\Mind9\lesson>stamp hello.src
2004/05/08 18:38:04         80  hello.src

 hello.src はコンソールアプリケーションとしては最も短いサンプルプログラムです。このソースコードは普通のテキストファイルなのでエディタで開いたり、コンソール内でtypeコマンドで内容を見ることができます。
c:\Mind9\lesson>type hello.src
メインとは
    「こんにちは、Mindです。」を 表示して 改行すること。

 上記プログラムが何をするものなのかは見ての通りです。
 このソースファイルを指定してMindでコンパイルしてみます。
c:\Mind9¥lesson>mind hello file

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

c:\Mind9¥lesson>
 上記で赤線を引いた部分は以下の意味となります。
  ──────────────────────   コンパイラ名     >mind hello file         ライブラリ名(拡張子なし)             ソースファイル名(拡張子なし)   ──────────────────────
 Mindコンパイラは、指定されたソースファイルを読み込み、コンパイル結果として複数のオブジェクトファイルを生成して終ります。
 ここでオブジェクトファイル生成の様子を確認します。
 もちろんエクスプローラなどのファイラーでファイル生成を確認しても良いのですが、ここではコマンドラインでオブジェクトファイルを確認してみます。
                            ↓末尾に*を指定
C:\Mind9¥lesson>stamp hello.*
2026/07/18 14:23:15     193136  hello.exe
2026/07/18 14:23:15         60  hello.his
2026/07/18 14:23:15      45440  hello.mco
2004/05/08 18:38:04         80  hello.src    ←元から有ったソースファイル
2026/07/18 14:23:15      29056  hello.sym
上記ではMindの標準ツールのstampを使ってファイル一覧を表示しています。もちろん Windowsなら dir コマンドでも良いのですが、表示がシンプルなことと、WindowsとLinuxで同じコマンドで済むことから、以降ではなるべく stamp を使うことにします。
 次に、stampコマンドで特殊なファイル指定をしてみます。以下のようにタイプすると、Mindコンパイラが生成したオブジェクトファイルのみを表示できます。
                           ↓末尾に+を指定
C:\Mind9¥lesson>stamp hello+
2026/07/18 14:23:15     193136  hello.exe
2026/07/18 14:23:15      45440  hello.mco
2026/07/18 14:23:15         60  hello.his
2026/07/18 14:23:15      29056  hello.sym
 上記の生成ファイルのうち、実際のプログラム実行に必要なのは .exe および .mco です。(Linuxでは.exe側のファイルは拡張子なしです)
実は hello.exe はMindのランタイムをキックするための固定的で小さなもので、Mindにおいては .mcoファイル(hello.mco)のほうがアプリケーションの実質的な実行ファイルと言えます。
 コンパイル結果のプログラム(hello)を実行してみます。
C:\Mind9¥lesson>hello
こんにちは、Mindです。

 次に、起動方法の説明 における「方法2」のケースを示します。
 方法2は、オブジェクトファイルの生成先としてソース存在場所以外を指定するものです(方法1であればオブジェクトファイルはソース存在ディレクトリに生成されます)。
 たとえば、lesson\ ディレクトリにはその下位に obj\ というフォルダがあり、オブジェクトファイルはそこに出力することができます。
 実は、Mind WorkBench においては、下位に obj\ フォルダが存在する場合は強制的に「方法2」によってオブジェクト生成を obj\ フォルダとするようコンパイラを起動しています。
 一方、先に示した hello.src のコンパイルテストではあえて方法1を使い、ソース存在場所にオブジェクトファイルを生成する方法をとりました。
 以下では方法2で hello.src をコンパイルしてみます。
         ↓先のコンパイルでの生成オブジェクトを一旦削除(1)
C:\Mind9¥lesson>erasemindobj hello

         ↓先のコンパイルでの生成オブジェクトを一旦削除(2)
C:\Mind9¥lesson>erasemindobj obj\hello
c:\Mind9\lesson\obj\hello.exe が見つかりませんでした。
c:\Mind9\lesson\obj\hello.his が見つかりませんでした。
c:\Mind9\lesson\obj\hello.mco が見つかりませんでした。
c:\Mind9\lesson\obj\hello.sym が見つかりませんでした。

c:\Mind9¥lesson>mind hello file obj

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


上記で使っている erasemindobj というバッチコマンドはMindの標準ツールとして bin\ ディレクトリに入っているものです。コンパイル結果のオブジェクトファイル群をまとめて削除するコマンドです。今回のようなケースで便利に使えます。
 上図でコンパイラの表示を見ると、最後のキッカーのコピー(mindex.exe)の複写先が obj\ 内となっていることから、obj\ フォルダに生成したことが見て取れます。
 もう少し詳しく確認してみます。
C:\Mind9¥lesson>stamp hello.*
2004/05/08 18:38:04         80  hello.src    ←元から有ったソースファイル

C:\Mind9¥lesson>stamp obj\hello.*
2026/07/18 15:58:31     193136  obj\hello.exe
2026/07/18 15:58:31         65  obj\hello.his
2026/07/18 15:58:31      45440  obj\hello.mco
2026/07/18 15:58:31      29056  obj\hello.sym

 上のように、カレントディレクトリにはソースファイルしか存在せず、オブジェクトファイル群は obj\ の中に存在することが分かります。
 先に、Mind WorkBench 環境下でのコンパイルで、カレントディレクトリ直下に obj\ フォルダが存在する時のオブジェクト生成について解説しましたが、コマンド プロンプト環境下でコンパイラを起動する場合も同様です。
 コマンド プロンプト下でGUIアプリケーションをコンパイルする際、もしオブジェクトフォルダ(objなど)が使えるのであれば、コンパイラ起動を次のようにすることで、Mind WorkBench の挙動と同じにさせることができます。
(hellowin.src をコンパイルすると仮定)

  >mind -mcohere hellowin guilib obj
上記の -mcohere という起動オプションが重要で、これがあるとMindコンパイラは Mind WorkBenchでの挙動と同じことをします。つまり、.exe/.mco ファイルをソース存在場所に生成し、.his/.sym ファイルを指定したオブジェクト生成ディレクトリに出力します。
  (hellowin.src をコンパイルしたと仮定)

  カレントディレクトリ\
        hellowin.src  ←これはソースファイル
        hellowin.exe  ←実行時に必要
        hellowin.mco  ←実行時に必要

  カレントディレクトリ\obj\
        hellowin.his  ←実行時には不要
        hellowin.sym  ←実行時には不要
 samplew\ フォルダに多くのGUIサンプルプログラムが置かれています。このディレクトリ内でユーザが自身でサンプルプログラムをコンパイルする時のため、バッチファイルとして次のようなものを置いてあります。
(samplew\ フォルダ内)

  capp0.bat  (初期コンパイル用)
  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
  〜略〜
  mind -mcohere %1 ..\lib\guilib obj\
  〜略〜
  \_________________/

  capp.bat   (再コンパイル用)
  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
  〜略〜
  mmake obj\%1
  〜略〜
  \_________________/

  (例)
  samplew\ ディレクトリ内で hellowin.src をコンパイルするなら
  次のようにバッチを使うのが便利
  
   >capp0 hellowin   ←初期コンパイル
   >capp hellowin    ←再コンパイル
文法エラーがあった場合
 ソースコードに誤りがあるとコンパイル時に文法エラーが検出され、コンパイラは次のように応答します。
注1: bunpouerr.src はわざと文法エラーを起こすためのサンプルプログラムです
注2: GUI版のソースは bunpouerrwin.src というファイル名です
C:\Mind9¥lesson>mind bunpouerr file

日本語プログラミング言語 Mind Version 9.03 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
1 個のエラーが有ります。
 コンパイル時メッセージが上記のように 「n個のエラーが有ります」 で終わった場合は次のようにして.infファイルの内容を確認してください。
C:\Mind9¥lesson>type bunpouerr.inf
bunpouerr.src 2 行目でエラー。行内容は、
    「こんにちは、Mindです。を 表示して 改行すること。
      要因1:'」'が見付からず、不均衡になっています。

1 個のエラーが有ります。
.infファイルをエディタで開く方法でも見られますが、確認が終ったらエディタ画面は閉じてください(そのまま再度コンパイルしようとするとアクセス競合でエラーになります)
mmakeを使う
 コンパイラの上位機能として mmake というものがあります。mmake は Mind WorkBench で「再コンパイル」ボタンを押したときに実行されるものですが、もちろんコマンド プロンプトの中からも使えます。
 mmake は起動されるとソースファイル(もし有れば副ソースファイルも)とライブラリのタイムスタンプを調べ、もし現実のソースファイルが以前コンパイルしたときのそれと異なる、あるいはリンク先ライブラリが以前コンパイルしたときのそれと異なる・・ような場合にコンパイラ(mind)を起動することで再コンパイルをおこないます。
 その際、mind.exe起動時に必要となるライブラリ指定は、前回の生成オブジェクトを調べることで自動的におこなうため、ユーザは再コンパイル時のライブラリについて関与せずに済みます。
 もしタイムスタンプの照合をして何も変化が無いと判断すればコンパイラを起動せず、何もせずに終了します。
 Mindの初心者は mmake の必要性についていまひとつピンと来ないかもしれません。
 中規模以上のプログラムを開発していて、メインソースや副ソースがたくさんあるような場合、たとえばそのうち一つの副ソースファイルを更新したような場合に、更新したソースに依存している主プログラムがどれなのかを考え、影響のあるメインプログラムだけを再コンパイルすることは負担になります。
 別のケースとしては、一度リリースしたアプリケーションであっても、後日、Mindの新版が出てライブラリが新しくなった場合、それまで作成したすべての主プログラムに再コンパイルをかける必要があります。
 そのような場合に mmake を使うと依存関係を自動的に判断してくれるため開発者として負担が軽減されます。
 mmake の起動方法は以下の通りです。
(方法3)
  >mmake PROGRAM
  (例:mmake hello)          ↑hello を再コンパイルする (方法4)   >mmake OBJDIR\PROGRAM
  (例:mmake obj\hello)          ↑obj\hello を再コンパイルする
 上記で PROGRAM というのはソースファイルの主ファイル名部(拡張子を除いた部分)です。たとえば、hello.src の再コンパイルなら hello とだけ指定します。
 オブジェクト生成先を指定してコンパイルされている場合は上記「方法4」を使います。たとえば obj\hello のように指定します(ソースファイルでなくオブジェクトファイルを拡張子無しで指定することになります)。

 先の解説、「方法2で hello.src をコンパイルしてみます」 での作業において hello.src をコンパイルした状況にあるとします。このときオブジェクトファイル群は obj\ 内に生成されています。
 ここで mmake を使った再コンパイルをしてみます。
c:\Mind9\lesson>mmake obj\hello
mmake obj\hello (for Mind9)

  (もしコンパイルされてしまった場合はもう一度実行してください)
 mmake を起動しましたがメッセージ表示はあるもののコンパイルはおこなわれません。ソースファイルもリンク先ライブラリも最新だからコンパイルの必要が無いからです。
 ここでわざと、hello.src のファイルのタイムスタンプを変更します。次のように操作します。
c:\Mind9\lesson>mtouch hello.src      ←mtouchはMind9付属ツール


 上記操作により、hello.src のファイルの更新日時が最新になりました。
 この状態で再度 mmake を実行します。
c:\Mind9\lesson>mmake obj\hello
mmake obj\hello (for Mind9)
hello.src が新しい

[再コンパイル] mind hello C:\Mind9\lib\file obj\hello -p
日本語プログラミング言語 Mind Version 9.03 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\Mind9\bin\mindex.exe --> obj\hello.exe
 上記のように、mmake はソースファイルのタイムスタンプが変化したことを検出し、mind.exeを呼び出すことでコンパイルをおこないました。

GUIアプリケーションとコンソールアプリケーションの使い分け
 誰でも簡単に使えるプログラムという意味ではGUIアプリケーションの形態にするのが一般的ではあるのですが、一概に言えない部分もあり、その点について説明します。
 コンソールアプリケーション形態のほうが向いているものとして以下があります。
  • そのアプリケーションの利用者もまたソフトエンジニアであり、コマンド プロンプト環境での起動に抵抗が無い(あるいは利用者が自分自身である)
  • たとえばファイルを操作する、あるいはネットワークをアクセスするなどコマンド プロンプト環境での利用のほうが向いている用途(ファイルを準備したりデータ出力を確認するのにコマンド プロンプト環境なら容易なことが多い)
  • 使い捨てのプログラム、ちょっとしたテストプログラムなど(なるべく短時間に検証したい)
 では上記以外のケースはGUIアプリケーションにすれば良いかというと、その場合であっても次の点に留意すると良いでしょう。
・GUIアプリケーションだからといって、そのすべてがGUI処理となるわけでもありません。
少し大きめのアプリケーションでは、データ(文字列)加工、ファイル操作など、非GUIの機能の割合が大きいこともよくあります。
・そのような場合、ソースコードの内部を、GUI部非GUI部 に分離することを勧めます。
そうすれば、 非GUI部 をコンソールアプリケーションとして動作させることができ、プログラム作成と検証を(すべてGUI形態にするのに比べて)短時間で済ませることができます。
検証が終ったら、そのソースコードをGUIを含む全体のソースに入れれば良いのです。
・コンソールベースのプログラムであれば、Mind掲示板などで不明点を質問しやすく(操作手順や結果は画面のメッセージをコピー・ペーストすれば済む)、またその回答もしやすくなります。
 たとえば、Mind WorkBenchのソース群を見ると(Mind WorkBenchのソースはGUIライブラリ正式版に含まれます)、その一部に以下のようなソースファイルを見つけることができます。
  mindwb_curdir.src
  mindwb_curdir_gui.src
 上のソースファイルは Mind WorkBench で「ワークディレクトリ」を管理するモジュールですが、似た名前のファイルが2つあります。
 前者は非GUIな機能なのでコンソールベースで作成・デバックができます。後者のGUIを含んだソースから前者の機能を呼び出すことで利用します。弊社では実際、そのようにしてワークディレクトリに関する機能を実装しました。

Windowsのタスク管理上のプロセス名とアイコン

 Mindの動作原理と関係するのですが、MindのプログラムがWindowsのタスク管理上どのように扱われているのかを説明します。
 コンソールアプリケーションの hello.exe というプログラムを例にとります。
 まず hello.exe を起動します。
「helloというプログラムの実行ファイルは hello.exe である」
は実質その通りなのですが、細かな動きとしては以下のようなものです。
(1) hello.exe は起動されるとすぐ、mrunt002.exe を起動します。
(2) その mrunt002.exe は hello.mco(Mコード)をロードし、
   そこからMindのプログラムとしての実行が始まります。
 人から見るとこの細かな仕組みは感じず、あくまで hello.exe が動作しているように感じます。
 しかし、Windows OS から見た場合、起動しているプログラムのプロセス名(OSによるプロセス管理上の名前)は hello ではなく mrunt002 になります(mrunt002起動時の引数が hello)。
 この違いを意識するのは以下のような場合です。特に、GUIアプリケーションの場合は起動している時間が長く、また複数のプログラムを起動することもあるため目撃しやすくなります。
  ・タスクバーにマウスをかざしたときに表示されるプログラム名は hello (正確にはタイトルバーの内容)
  ・タスクバーを右クリックし表示されるものはプロセス名なので mruntXXX.exe
  ・タスクマネージャを起動し、プロセスのリストを眺めたときの表示は Mind Runtime Library (プロセス名の補足名)
 上記のように、表示手段によって異なるプログラム名あるいはプロセス名が表示されることになりますが、これは障害ではなく、Mindの動作原理に起因するものなので、このようなものであるとご理解ください。

 上記で触れましたがタスクマネージャを起動し、プロセスリストを眺めた時の補足をします。
 プロセスリスト中からMindのプログラムを見つけたとき、たとえば以下のようなものが表示されます。
 上記のように、プロセス名またはその補足名は常に「mruntXXX」または「Mind Runtime Library」と表示されるため、具体的に何のプログラムが起動しているのか分かりません。
 ここでプロセス名の左側にある「>」をクリックすると、以下のように展開されます。
 展開によって各項目直下に表示されたものはMindランタイムを起動した親プロセス名で、これが本来のMindのプログラム名になります。