はじめに
本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。とはいっても題材としては定番アルゴリズムのいくつかを疑似言語ではなくコンパイル・実行可能なプログラミング言語の日本語で書いてみようというたてつけとなります。
Mind(マインド)
プログラミング言語Mind(マインド)は自然な日本語で記述できるスタック指向の軽量中間コードコンパイラ言語です。ただし単語間の分かち書きが必須であくまで形式言語です。逆ポーランド記法1の範囲で分かち書きされた日本語単語の語順が自然と日本語の語順となるという意味の「自然さ」で書くことができ、独自の軽量中間コードのランタイム実行で非常に高速です。実装言語はCまたはMind。初版の登場は1985年で2025年は生誕40周年となりました。
Mind(マインド)の入手方法
無償版のMind version 8 (windows版linux版)を下記の公式サイトからダウンロードできます。フリーメールでかまいませんのでメールアドレスをご登録くださいませ。
定番アルゴリズム:線形キューとは
アルゴリズムは、問題を解決するための手順や計算方法を意味します。アルゴリズムにはいくつかの定番ロジックが存在します。
ここではその中のひとつ「線形キュー」を扱ってみます。「線形キュー」(またはただの「キュー」)は先に入れた要素から順に取り出すデータ構造とロジックです。
お題のソースコード
下図のようなインデックス構造を構築します。
初期状態
index: 1 2 3 4 5 ...
↑
0 head (先頭)
↑
tail (末尾)
初期状態ではheadが1を指していて、tailは0となっています。
3つデータを挿入(tailが3へ移動)
index: 1 2 3 4 5 ...
↑
0 head (先頭)
↑
tail (末尾)
3つデータを挿入すると、tailが3に移動します。このときキューサイズも3に増加します。
1つデータを取出(headが2へ移動)
index: 1 2 3 4 5 ...
↑
0 head (先頭)
↑
tail (末尾)
1つデータを取出すると、headが1のデータを返し、headは2へ移動します。キューサイズは1つ減少し2になります。
もう1つデータを取出(headが3へ移動)
index: 1 2 3 4 5 ...
↑
0 head (先頭)
↑
tail (末尾)
もう1つデータを取出すると、headが2のデータを返し、headは3へ移動します。キューサイズは1つ減少し1になります。
もう1つデータを取出(headが4へ移動)
index: 1 2 3 4 5 ...
↑
0 head (先頭)
↑
tail (末尾)
もう1つデータを取出すると、headが3のデータを返し、headは4へ移動します。キューサイズは1つ減少し0になります。
データを格納する入れ物は数値の場合は1次元配列の変数とします。インデックスの位置を先頭と尻尾で管理する変数も設けます。キューサイズはインデックスの尻尾と先頭の差分で算出できますが、この実装例では図示していませんが、別の変数で管理してデータの挿入の都度一つ増加、取り出しの都度一つ減少させます。
Mindの配列の基数は1です。基数0の配列を使った一般的なプログラミング言語の実装とはインデックスの扱いが異なる点にご留意ください。
下記がソースコード全文となります。今回は幅優先探索の実装で利用するため、ライブラリとして定義して、テスト用のメイン部分を別ソースとしました。
ライブラリ
キュー深さ最大は 定数 100。
キュー値は キュー深さ最大の 変数。
キュー先頭は 変数。
キュー尻尾は 変数。
キューサイズは 変数。
キューを初期化するとは (・ → ・)
キュー先頭を セットし
キュー尻尾を クリアし
キューサイズを クリアすること。
キューに入れるとは (キュー値 → ・)
キューサイズが キュー深さ最大に 等しい ならば 「キューがオーバーフローしました。」で 重大エラー つぎに
キュー尻尾を 一つ増加し
(キュー値を) キュー値(キュー尻尾)に 入れ
キューサイズを 一つ増加すること。
キューから出すとは (・ → 先頭キュー値)
キューサイズが 0に 等しい ならば 「キューは空です。」で 重大エラー つぎに
キュー値(キュー先頭)を 返し (→ 先頭キュー値)
キュー先頭を 一つ増加し
キューサイズを 一つ減少すること。
キューは空?とは (・ → 真偽)
キューサイズが 0に 等しい。
キュー値配列の「キュー深さ最大」はお題のキューイング対象数列より大きめに確保してありますが、この実装は線形キューのため取り出されたデータ領域(取り出し後のインデックスのキュー値)はクリアされません。再利用は想定していない一般的な実装です。
テスト実行用メインプログラム
"queue"を コンパイルする。
メインとは (・ → ・)
キューを初期化し
1を キューに入れ
2を キューに入れ
3を キューに入れ
4を キューに入れ
ここから
キューが空? ならば 打ち切り つぎに
キューから出して 数値表示し 改行し
繰り返すこと。
お題のソースコードをコンパイル
では、コンパイルしてみます。Mind8によるコンパイル結果です。
C:\developments\vscode\mind9\algorithm>mind queuetest file
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> queuetest.exe
実行結果
実行結果です。
C:\developments\vscode\mind9\algorithm>queuetest
1
2
3
4
相当かなり芸のない出力ですが、キューに入れた値から取り出されていることがわかります![]()
おわりに
いかがでしたでしょうか?わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。
-
演算子を被演算子の中間に記述する中置記法 1 + 2、前に記述する前置記法(ポーランド記法)+ 1 2、後に記述する後置記法(逆ポーランド記法)1 2 +がある。日本語は1と 2を 足す。 ↩