はじめに
本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。とはいっても題材としては定番アルゴリズム:挿入ソートを疑似言語ではなくコンパイル・実行可能なプログラミング言語の日本語で書いてみようというたてつけとなります。
Mind(マインド)
プログラミング言語Mind(マインド)は自然な日本語で記述できるスタック指向の軽量中間コードコンパイラ言語です。ただし単語間の分かち書きが必須であくまで形式言語です。逆ポーランド記法1の範囲で分かち書きされた日本語単語の語順が自然と日本語の語順となるという意味の「自然さ」で書くことができ、独自の軽量中間コードのランタイム実行で非常に高速です。実装言語はCまたはMind。初版の登場は1985年で今年2025年は生誕40周年となります。
Mind(マインド)の入手方法
無償版のMind version 8 (windows版linux版)を下記の公式サイトからダウンロードできます。フリーメールでかまいませんのでメールアドレスをご登録くださいませ。
定番アルゴリズム:挿入ソートとは
アルゴリズムは、問題を解決するための手順や計算方法を意味します。ソート(整列・並べ替え)はデータの並び順を特定の条件で並べ替えるためのアルゴリズムで、いくつかの定番ロジックが存在します。
ここではその中のひとつ挿入ソートを扱ってみます。挿入ソートは部分的にソート済みの配列に対して新しい要素を適切な位置に挿入していくロジックです。小規模データやほぼ整列済みの配列に適しており、大規模データに対しての効率はよくないとされています。
2番目の要素から順に処理を開始し、ソート済みの内側の範囲で挿入位置を探索します。要素を後方にずらして入れ替えし、これを最後の要素まで繰り返します。本日の実装のサンプルでは配列変数の要素数は変化させていませんので、挿入というより入れ替えといった方が今回のサンプルは実勢に近いです。
プログラミングの3大ロジック構造とは
順次、分岐、反復の3つの制御構造(control structures)によって処理の流れを記述することを構造化プログラミングといいます。挿入ソートもこの構造で構成されます。
1.順次(sequence) 部分プログラムを順々に実行する。
2.分岐(bifurcation) 条件式が導出した状態に従い、次に実行する部分プログラムを選択して分岐する。
3.反復(repetition) 条件式が導出した特定の状態の間、部分プログラムを繰り返し実行する。ループ処理。
お題のソースコード
並べ替え対象のデータ群には15の要素を持つ「配列」という特殊な整数型の変数を用意します。
段ボール箱が15あり、その中に小さなボールが複数づつ入っている状態をイメージしてください。段ボール箱は1つづつ15並んでいるのではなく、1つの長い段ボール箱が5つのセクションで区切られているようなイメージが配列に近いです。ボールの数はおおむね右から左に向かって多くなり、同じ数が格納されていることはないとします。
Mindの場合、15の要素数の段ボール箱の配列要素番号は1からはじまり15で終わります。
段ボール箱は 15の 変数。
段ボール箱にボールの数を減らしながら入れるとは (・ → ・)
段ボール箱の 要素数で 回数指定し
段ボール箱の 要素数から 回数を 引いて 5を 加えて 段ボール箱(回数)に 入れる
繰り返す。
段ボール箱のボールの数を表示するとは (文字列 → ・)
整列前後は 文字列
整列前後に 入れ
整列前後を 一行表示し
「要素番号 」を 表示し
段ボール箱の 要素数で 回数指定し
回数を 二桁で数値表示し 「 」を 表示し
繰り返す
改行してから 「ボール数 」を 表示し
段ボール箱の 要素数で 回数指定し
段ボール箱(回数)を 二桁で数値表示し 「 」を 表示し
繰り返す
改行し 改行する。
段ボール箱を挿入ソートするとは (・ → ・)
段ボール箱の要素数1減は 変数
外側要素番号は 変数
内側要素番号は 変数
判定ボール数は 変数
一時要素番号は 変数
一時要素番号2は 変数
段ボール箱の 要素数から 1を 引いて 段ボール箱の要素数1減に 入れ
段ボール箱の要素数1減で 回数指定し
回数に 1を 加えて 外側要素番号に 入れ
判定ボール数に 段ボール箱(外側要素番号)を 入れ
回数を 内側要素番号に 入れ
ここから
内側要素番号が 1より 小さい ならば 打ち切り つぎに
※「内側要素番号 」を 表示 内側要素番号を 数値表示 「 外側要素番号 」を 表示 外側要素番号を 数値表示し 改行し
段ボール箱(内側要素番号)が 判定ボール数より 大きい
ならば
内側要素番号に 1を 加えて 一時要素番号に 入れる
※「一時要素番号 」を 表示 一時要素番号を 数値表示し 改行し
段ボール箱(一時要素番号)に 段ボール箱(内側要素番号)を 入れる
内側要素番号を 一つ減少する
さもなければ 打ち切り
つぎに
繰り返す
内側要素番号に 1を 加えて 一時要素番号2に 入れる
段ボール箱(一時要素番号2)に 判定ボール数を 入れる
回数を 数値表示し 「回目」を 表示し
「整列中」の 段ボール箱のボールの数を表示する
繰り返す。
メインとは (・ → ・)
段ボール箱にボールの数を減らしながら入れ
「整列前」の 段ボール箱のボールの数を表示する
段ボール箱を挿入ソートし
「整列後」の 段ボール箱のボールの数を表示する。
「段ボール箱を挿入ソート」が賞味のロジックです。処理経過がわかるように、入れ替えが生じた場合はその旨コンソールに出力しています。
ただし、内部では要素の入れ替えが反復実行されております。この内部での入れ替え反復処理のコンソール出力はコメントアウトしています。
お題のソースコードをコンパイル
では、コンパイルしてみます。Mind8によるコンパイル結果です。
C:\developments\vscode\mind9\algorithm>mind insertsort file
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> insertsort.exe
無事に成功しました。
実行結果
実行結果です。
C:\developments\vscode\mind9\algorithm>insertsort
整列前
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5
1回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 18 19 17 16 15 14 13 12 11 10 9 8 7 6 5
2回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 17 18 19 16 15 14 13 12 11 10 9 8 7 6 5
3回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 16 17 18 19 15 14 13 12 11 10 9 8 7 6 5
4回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 15 16 17 18 19 14 13 12 11 10 9 8 7 6 5
5回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 14 15 16 17 18 19 13 12 11 10 9 8 7 6 5
6回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 13 14 15 16 17 18 19 12 11 10 9 8 7 6 5
7回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 12 13 14 15 16 17 18 19 11 10 9 8 7 6 5
8回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 11 12 13 14 15 16 17 18 19 10 9 8 7 6 5
9回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 10 11 12 13 14 15 16 17 18 19 9 8 7 6 5
10回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 9 10 11 12 13 14 15 16 17 18 19 8 7 6 5
11回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 8 9 10 11 12 13 14 15 16 17 18 19 7 6 5
12回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 7 8 9 10 11 12 13 14 15 16 17 18 19 6 5
13回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 6 7 8 9 10 11 12 13 14 15 16 17 18 19 5
14回目整列中
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
整列後
要素番号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
ボール数 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
C:\developments\vscode\mind9\algorithm>
この入れ替え各回の内部では内側を遡って入れ替えて反復処理の中間変数のコンソール出力はコメントアウトしていますので処理内容には出力されていません。
おわりに
いかがでしたでしょうか?わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。
-
演算子を被演算子の中間に記述する中置記法 1 + 2、前に記述する前置記法(ポーランド記法)+ 1 2、後に記述する後置記法(逆ポーランド記法)1 2 +がある。日本語は1と 2を 足す。 ↩