はじめに
本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。題材としては定番アルゴリズム:バブルソートを疑似言語ではなくコンパイル・実行可能なプログラミング言語の日本語で書いてみようというたてつけとなります。日本語プログラミング言語はドリトルを使用してみます。
ドリトル
ドリトルは、日本語に近い語順で記述できる、プロトタイプベースのオブジェクト指向の中間コードコンパイラ言語です。中間コードはJVMバイトコードで、Javaアプリケーションと同じ実行環境で動きます。また、教育目的で開発された日本語プログラミング言語であり、中学校・高校の教科書や副教材などに採用されています。語順はSOV型の日本語語順ですが、(単語間の分かち書きや一部中置記法もあり)あくまで形式言語です。
ドリトルの入手方法
ドリトルバージョン3(Windows版)を下記の公式サイトからダウンロードできます。
定番アルゴリズム:バブルソートとは
アルゴリズムは、問題を解決するための手順や計算方法を意味します。ソート(整列・並べ替え)はデータの並び順を特定の条件で並べ替えるためのアルゴリズムで、いくつかの定番ロジックが存在します。
ここではその中のひとつバブルソート(基本交換法)をまず扱ってみます。バブルソートは隣り合わせの値と比較して交換を繰り返していくシンプルなロジックとなります。総当たりで並べ替えるため、効率はよくないとされます。
先頭から順に隣り合わせの値と比較し、左の値が大きければ入れ替える、小さければそのまま。これを入れ替えが発生しなくなるまで反復します。
プログラミングの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増) 読む) 上書き。
段ボール箱!(内側要素番号1増) (一時退避のボール数) 上書き。
」実行。
」!(段ボール箱!要素数?)繰り返す。
」!(段ボール箱!要素数?)繰り返す。
」。
表示エリア!"並べ替え前の状態" "" 表示する。
ルート!段ボール箱の数を表示する。
ルート!段ボール箱のボールの数を表示する。
ルート!段ボール箱をバブルソートする。
表示エリア!"並べ替え後の状態" "" 改行してから表示する。
ルート!段ボール箱の数を表示する。
ルート!段ボール箱のボールの数を表示する。
「段ボール箱をバブルソートする」がバブルソートの賞味のロジックです。
ドリトルにはコンソールアプリケーションはありませんので、テキストエリアに出力しています。
表示エリアの動作定義で
「(s1!長さ? ) ==1」!
の直前の
s1=s1+""。
は、引数s1の型をドリトルコンパイラに文字列変数型と認識させるために空列を追加しています。ほんとは型を明示した書き方またはキャスト構文があるのかもしれません。
お題のソースコードをコンパイル・実行
では、コンパイル・実行してみます。実行環境はドリトル編集実行画面です。
並べ替え前の状態
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
ちょっと芸のない出力ですが、イメージわきましたでしょうか?降順だった数列が昇順に並び変わっていることがわかります。
おわりに
いかがでしたでしょうか?わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。