はじめに
本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。題材としては定番アルゴリズム:選択ソートを疑似言語ではなくコンパイル・実行可能なプログラミング言語の日本語で書いてみようというたてつけとなります。日本語プログラミング言語はドリトルを使用してみます。
ドリトル
ドリトルは、日本語に近い語順で記述できる、プロトタイプベースのオブジェクト指向の中間コードコンパイラ言語です。中間コードはJVMバイトコードで、Javaアプリケーションと同じ実行環境で動きます。また、教育目的で開発された日本語プログラミング言語であり、中学校・高校の教科書や副教材などに採用されています。語順はSOV型の日本語語順ですが(一部中置記法もあり)、単語間の分かち書きが必須であくまで形式言語です。
ドリトルの入手方法
ドリトルバージョン3(Windows版)を下記の公式サイトからダウンロードできます。
定番アルゴリズム:選択ソートとは
アルゴリズムは、問題を解決するための手順や計算方法を意味します。ソート(整列・並べ替え)はデータの並び順を特定の条件で並べ替えるためのアルゴリズムで、いくつかの定番ロジックが存在します。
ここではその中のひとつ選択ソートをまず扱ってみます。選択ソートは配列の未整列部分から最小値(または最大値)を探し、それを先頭と交換する操作を繰り返すシンプルなロジックとなります。
未整列部分から最小値を探し出し、その最小値を未整列部分の先頭と入れ替え、ソート済み部分を1つ増やします。これを全要素が整列するまで反復します。
未整列部分から最小値を探し出すという処理にはなんらかの探索アルゴリズムを適用する必要があります。ソート側のアルゴリズムは効率よりシンプルさを重視していますので、ここでは線形探索を適用します。
こちらの線形探索は特定の値を探索する事例ですが、今回の線形探索は最小値を特定する処理なので若干内容は異なりますのでご注意ください。
プログラミングの3大ロジック構造とは
順次、分岐、反復の3つの制御構造(control structures)によって処理の流れを記述することを構造化プログラミングといいます。選択ソートもこの構造で構成されます。
1.順次(sequence) 部分プログラムを順々に実行する。
2.分岐(bifurcation) 条件式が導出した状態に従い、次に実行する部分プログラムを選択して分岐する。
3.反復(repetition) 条件式が導出した特定の状態の間、部分プログラムを繰り返し実行する。ループ処理。
お題のソースコード
並べ替え対象のデータ群には15の要素を持つ「配列」という特殊な整数型の変数を用意します。
段ボール箱が15あり、その中に小さなボールが複数づつ入っている状態をイメージしてください。段ボール箱は1つづつ15並んでいるのではなく、1つの長い段ボール箱が5つのセクションで区切られているようなイメージが配列に近いです。ボールの数はおおむね左から右に向かって小さくなり、同じ数が格納されていることはないとします。
ドリトルの場合、15の要素数の段ボール箱の配列要素番号は1からはじまり15で終わります。
段ボール箱=配列!19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 作る。
改行コード = (0x0d!コード文字) + (0x0a!コード文字)。
表示エリア=テキストエリア!("")作る 600 200 大きさ 16 文字サイズ 。
表示エリア:改行してから表示する=「|s1 s2|
s1=s1+""。
「(s1!長さ? ) ==1」!
なら 「自分!(改行コード+s2+s1+s2) 書く。」
そうでなければ 「自分!(改行コード+s1+s2) 書く。」実行。
」。
表示エリア:表示する=「|s1 s2|
s1=s1+""。
「(s1!長さ? ) ==1」!
なら 「自分!(s2+s1+s2) 書く。」
そうでなければ 「自分!(s1+s2) 書く。」実行。
」。
段ボール箱の数を表示する=「
「|回数|
「(回数) ==1」!
なら 「表示エリア!(回数) " " 改行してから表示する」
そうでなければ 「表示エリア!(回数) " " 表示する」実行。
」!(段ボール箱!要素数?)繰り返す。
」。
段ボール箱のボールの数を表示する=「
「|回数|
「(回数) ==1」!
なら 「表示エリア!(段ボール箱!(回数) 読む) " " 改行してから表示する」
そうでなければ 「表示エリア!(段ボール箱!(回数) 読む) " " 表示する」実行。
」!(段ボール箱!要素数?)繰り返す。
」。
段ボール箱から最小値の要素番号を線形探索する=「|開始要素番号 ; 現在の要素番号 暫定最小値要素番号|
暫定最小値要素番号=開始要素番号。
現在の要素番号=開始要素番号 + 1。
「現在の要素番号 <= (段ボール箱!要素数?)」!の間
「
「(段ボール箱!(暫定最小値要素番号) 読む)>(段ボール箱!(現在の要素番号) 読む)」!
なら
「暫定最小値要素番号=現在の要素番号。」実行。
現在の要素番号=現在の要素番号 + 1。
」実行。
(暫定最小値要素番号)。
」。
段ボール箱を選択ソートする=「| ; 現在の要素番号 最小値要素番号 一時退避のボール数|
現在の要素番号= 1。
「現在の要素番号 <= (段ボール箱!要素数?)」!の間
「
最小値要素番号=ルート!(現在の要素番号) 段ボール箱から最小値の要素番号を線形探索する。
「(現在の要素番号) !=(最小値要素番号)」!
なら
「 一時退避のボール数 = 段ボール箱!(現在の要素番号) 読む。
段ボール箱!(現在の要素番号) (段ボール箱!(最小値要素番号) 読む) 上書き。
段ボール箱!(最小値要素番号) (一時退避のボール数) 上書き。
」実行。
現在の要素番号=現在の要素番号 + 1。
」実行。
」。
表示エリア!"並べ替え前の状態" "" 表示する。
ルート!段ボール箱の数を表示する。
ルート!段ボール箱のボールの数を表示する。
ルート!段ボール箱を選択ソートする。
表示エリア!"並べ替え後の状態" "" 改行してから表示する。
ルート!段ボール箱の数を表示する。
ルート!段ボール箱のボールの数を表示する。
「段ボール箱を選択ソートする」が賞味のロジックです。内部で「段ボール箱から最小値の要素番号を線形探索する」を実行しています。
お題のソースコードをコンパイル・実行
では、コンパイル・実行してみます。実行環境はドリトル編集実行画面です。テキストエリアに出力しています。
並べ替え前の状態
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 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
かなり芸のない出力ですが、イメージわきましたでしょうか?降順だった数列が昇順に並び変わっていることがわかります。
おわりに
いかがでしたでしょうか?わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。