はじめに
日本語プログラミング言語Mindの小技「スタック検査」について説明したいと思います。
対象読者
日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方
この小技に関連するMind言語マニュアル
この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載があります。
11 スタック操作
└スタック検査
スタック検査 → ・
構文=
<メッセージ>で このメッセージでスタック検査 → ・これを呼び出したときスタックが空でない場合、次のようなエラーメッセージを表示し、プログラムが強制終了する。
↓「スタック検査」の場合
スタックがずれています。↓「このメッセージでスタック検査」の場合
スタックがずれています(メッセージ)。
本機能(本記事)は、下記のバージョンに対応しています。Mind8のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。
Mind7は本単語に対応していますが、プログラムの強制終了はしません。実行時の解説で詳しく説明します。
対応バージョン
■Mind7 ■Mind8 ■Mind9
■Windows版 □Linux版
小技の解説
Mindの小技「スタック検査」は、スタック指向プログラミング言語であるMindが正常に完走するための条件である「スタックの状態の整合性」を、アプリケーションプログラム側から実行時にチェックするしくみです。
このチェックは、スタックポインタが基底状態でなっているかを判定します。
一時的な積み残しをのちの処理でスタックから消費して最終的にはスタッククリアされるようなステップの途中で、「スタック検査」の実行を記述してしまうと、意図せずプログラムが強制終了されてしまいます。「スタック検査」の実行箇所が適切かはアプリケーションプログラマにゆだねられています。
「スタック検査」は、あくまでスタックがクリアされているべき時点で実行することで、意図しないスタックの積み残しを検知するものです。
「スタック検査」 検知時のメッセージが固定。
「このメッセージでスタック検査」 メッセージをユーザー指定できます。
この単語の実行時にスタックがクリアされていない場合、プログラムを強制終了するのはMind8以降の動作です。Mind7はメッセージを出力するだけの動作となっています。
Mindプログラムソース
スタックの値を2つ使うとは (数値 数値 → ・)
変数1は 変数
変数2は 変数
変数1に 入れ
変数2に 入れ
変数2を 数値表示し 「と」を 表示し 変数1を 数値表示し
「をスタックから消費しました。」を 一行表示すること。
スタックの値を1つ使うとは (数値 → ・)
変数1は 変数
変数1に 入れ
変数1を 数値表示し
「をスタックから消費しました。」を 一行表示すること。
メインとは (・ → ・)
スタック検査し
「起動直後なのでスタックはずれていません。」を 一行表示し 改行し
スタック検査し
「文字列定数は一行表示で消費されたのでスタックはクリアされています。」を 一行表示し 改行し
スタックに値を2つ積み
スタックの値を2つ使い
スタック検査し
「2つの値は2つ消費されたのでスタックはクリアされています。」を 一行表示し 改行し
スタックに値を2つ積み
スタックの値を1つ使い
スタック検査し
「プログラムを終了しました。」を 一行表示すること。
コンパイル結果
ではコンパイルしてみます。下位ライブラリはfileを指定します。
Mind9
下図はMind9βです。
C:\developments\vscode\mind9>mind stackcheck file
日本語プログラミング言語 Mind Version 8.11 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> stackcheck.exe
Mind8
C:\developments\vscode\mind9>mind stackcheck file
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> stackcheck.exe
Mind7
C:\developments\vscode\mind9>mind stackcheck file
日本語プログラミング言語 Mind Version 7.5 for Windows
Copyright(C) 1985-2004 Scripts Lab. Inc.
Single user license. Serial No:********
コンパイル中 - 終了
Coping.. C:\mind7\bin\mindexec.exe -> stackcheck.exe
実行結果
つづいて実行してみます。
Mind8/9β
Mind8の結果です。記述は割愛していますがMind9βも同じです。
c:\developments\vscode\mind9>stackcheck
起動直後なのでスタックはずれていません。
文字列定数は一行表示で消費されたのでスタックはクリアされています。
1と2をスタックに積みました
1と2をスタックから消費しました。
2つの値は2つ消費されたのでスタックはクリアされています。
1と2をスタックに積みました
2をスタックから消費しました。
スタックがずれています。
c:\developments\vscode\mind9>
スタックずれを検出して「スタックがずれています。」のメッセージを表示した後、プログラムを強制終了したため、最後に記述されていた「プログラムを終了しました。」の表示が実行されていないことがわかります。
Mind7
続いてMind7の結果です。
c:\developments\vscode\mind9>stackcheck
起動直後なのでスタックはずれていません。
文字列定数は一行表示で消費されたのでスタックはクリアされています。
1と2をスタックに積みました
1と2をスタックから消費しました。
2つの値は2つ消費されたのでスタックはクリアされています。
1と2をスタックに積みました
2をスタックから消費しました。
スタックがずれています。プログラムを終了しました。
c:\developments\vscode\mind9>
スタックずれを検出してメッセージを表示した後、プログラムを強制終了していないため、最後に記述されていた「プログラムを終了しました。」の表示が実行されたことがわかります。
実行結果2
最後の「スタック検査」の実行を「このメッセージでスタック検査」にしてみます。
Mindプログラムソース
~略~
メインとは (・ → ・)
~略~
スタックに値を2つ積み
スタックの値を1つ使い
「2つの値は1つしか消費されていないのでこの時点でスタックはクリアされていません」
このメッセージでスタック検査し 改行し
「プログラムを終了しました。」を 一行表示すること。
実行結果
Mind8の結果です。記述は割愛していますがMind9βも同じです。Mind7も割愛していますが結果はメッセージ表示だけの動作となりますので、最後の「プログラムを終了しました。」が表示されます。
c:\developments\vscode\mind9>stackcheck2
起動直後なのでスタックはずれていません。
文字列定数は一行表示で消費されたのでスタックはクリアされています。
1と2をスタックに積みました
1と2をスタックから消費しました。
2つの値は2つ消費されたのでスタックはクリアされています。
1と2をスタックに積みました
2をスタックから消費しました。
スタックがずれています(2つの値は1つしか消費されていないのでこの時点でスタックはクリア されていません)。
c:\developments\vscode\mind9>
参考情報
この小技「スタック検査」を使った記述例の記事は未発見です。
おわりに
いかがでしたでしょうか?なにかの参考になれば幸いです。2025年は日本語プログラミング言語Mind生誕40周年です。
本記事シリーズのご紹介
本記事シリーズ「日本語プログラミング言語Mindの小技」は「日本語プログラミング言語Mind生誕40周年プロジェクト」の一環です。
興味を持たれた方は日本語プログラミング言語Mind公式サイトにアクセスすると、Mindコンパイラをダウンロードできます。
面白い!、楽しい、カンタン、難しいのも書ける!みんなでやってみよう![]()