はじめに
本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。とはいっても題材としては定番アルゴリズム:選択ソートを疑似言語ではなくコンパイル・実行可能なプログラミング言語の日本語で書いてみようというたてつけとなります。
なでしこ
なでしこ(V1)は、日本語に近い語順で記述できる、オープンソースのインタプリタ言語で実装言語はDelphi(デルファイ)です。
現在はWebアプリケーションでもあるAltJSのV3に開発がシフトしました。V3の実装言語はNode.js(JavaScript)。V1は新規の機能は追加されていませんが現在もメンテ・利用されつづけています。なでしこは2005年に登場し、今年2025年で生誕20周年を迎えました。
なでしこの入手方法
なでしこバージョン1(Windows版)を下記の公式サイトからダウンロードできます。
定番アルゴリズム:選択ソートとは
アルゴリズムは、問題を解決するための手順や計算方法を意味します。ソート(整列・並べ替え)はデータの並び順を特定の条件で並べ替えるためのアルゴリズムで、いくつかの定番ロジックが存在します。
ここではその中のひとつ選択ソートをまず扱ってみます。選択ソートは配列の未整列部分から最小値(または最大値)を探し、それを先頭と交換する操作を繰り返すシンプルなロジックとなります。
未整列部分から最小値を探し出し、その最小値を未整列部分の先頭と入れ替え、ソート済み部分を1つ増やします。これを全要素が整列するまで反復します。
未整列部分から最小値を探し出すという処理にはなんらかの探索アルゴリズムを適用する必要があります。ソート側のアルゴリズムは効率よりシンプルさを重視していますので、ここでは線形探索を適用します。
こちらの線形探索は特定の値を探索する事例ですが、今回の線形探索は最小値を特定する処理なので若干内容は異なりますのでご注意ください。
プログラミングの3大ロジック構造とは
順次、分岐、反復の3つの制御構造(control structures)によって処理の流れを記述することを構造化プログラミングといいます。選択ソートもこの構造で構成されます。
1.順次(sequence) 部分プログラムを順々に実行する。
2.分岐(bifurcation) 条件式が導出した状態に従い、次に実行する部分プログラムを選択して分岐する。
3.反復(repetition) 条件式が導出した特定の状態の間、部分プログラムを繰り返し実行する。ループ処理。
お題のソースコード
並べ替え対象のデータ群には15の要素を持つ「配列」という特殊な整数型の変数を用意します。
段ボール箱が15あり、その中に小さなボールが複数づつ入っている状態をイメージしてください。段ボール箱は1つづつ15並んでいるのではなく、1つの長い段ボール箱が5つのセクションで区切られているようなイメージが配列に近いです。ボールの数はおおむね左から右に向かって小さくなり、同じ数が格納されていることはないとします。
なでしこの場合、15の要素数の段ボール箱の配列要素番号は0からはじまり14で終わります。
段ボール箱は「19
18
17
16
15
14
13
12
11
10
9
8
7
6
5」。
選択ソートする。
●選択ソートする
「整列前 」を表示
「要素番号 」を継続表示
段ボール箱で反復し
「{回数-1} 」を継続表示
ここまで
「」を表示
「ボール数 」を継続表示
段ボール箱で反復し
「{それ} 」を継続表示
ここまで
「」を表示
「」を表示
開始要素番号は整数
最小値要素番号は整数
一時退避のボール数は整数
箱要素数は整数
段ボール箱の配列要素数を箱要素数に代入
開始要素番号=0
1の間
もし、開始要素番号>箱要素数-1ならば、抜ける
ここまで
開始要素番号で線形探索し、
それを最小値要素番号に代入
もし、開始要素番号<>最小値要素番号ならば
段ボール箱[開始要素番号]を一時退避のボール数に代入
段ボール箱[最小値要素番号]を段ボール箱[開始要素番号]に代入
一時退避のボール数を段ボール箱[最小値要素番号]に代入
//処理経過表示処理ここから
「 要素番号{開始要素番号}と{最小値要素番号}を入れ替えました。」を継続表示
「{段ボール箱[開始要素番号]} ⇔ {段ボール箱[最小値要素番号]}」を表示
//処理経過表示処理ここまで
ここまで
開始要素番号=開始要素番号+1
ここまで
「 」を表示
「整列後 」を表示
「要素番号 」を継続表示
段ボール箱で反復し
「{回数-1} 」を継続表示
ここまで
「」を表示
「ボール数 」を継続表示
段ボール箱で反復し
「{それ} 」を継続表示
ここまで
「」を表示。
現在の要素番号は整数
最小値要素番号は整数
箱要素数は整数
現在ボール数は整数
最小ボール数は整数
●線形探索(開始要素番号で)
最小値要素番号=開始要素番号
現在の要素番号=開始要素番号+1
段ボール箱の配列要素数を箱要素数に代入
1の間
もし、現在の要素番号>箱要素数-1ならば、抜ける
ここまで
現在ボール数=段ボール箱[現在の要素番号]を整数変換
最小ボール数=段ボール箱[最小値要素番号]を整数変換
もし、最小ボール数>現在ボール数ならば
最小値要素番号=現在の要素番号
ここまで
現在の要素番号=現在の要素番号+1
ここまで
最小値要素番号で戻る。
「選択ソートする」の「開始要素番号は整数」から「開始要素番号=開始要素番号+1」の次の「ここまで」が賞味のロジックです。処理経過がわかるように、入れ替えが生じた場合はその旨コンソールに出力しています。
整列前と整列後の状態表示は関数化すると非同期実行っぽくなったので「選択ソートする」の中でとりあえずべた書きしています。
お題のソースコードをコンパイル・実行
では、コンパイル・実行してみます。コンパイラはなでしこ1のcnakoです。
C:\nadesiko\nadesiko_1_588>cnako selectsort.nako
整列前
要素番号 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ボール数 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5
要素番号0と14を入れ替えました。5 ⇔ 19
要素番号1と13を入れ替えました。6 ⇔ 18
要素番号2と12を入れ替えました。7 ⇔ 17
要素番号3と11を入れ替えました。8 ⇔ 16
要素番号4と10を入れ替えました。9 ⇔ 15
要素番号5と9を入れ替えました。10 ⇔ 14
要素番号6と8を入れ替えました。11 ⇔ 13
整列後
要素番号 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ボール数 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
C:\nadesiko\nadesiko_1_588>
最小値を線形探索している反復処理は暗黙に行っていますので処理内容には出力されていません。この点を除くと入れ替え処理自体の数はバブルソートよりかなり少なくなっています。
おわりに
いかがでしたでしょうか?わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。
祝!日本語プログラミング言語なでしこ生誕20周年1
-
なでしこのバージョン1が正式リリースされた2005年をもって生誕と想定 ↩