はじめに
本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。どちらかというとある程度プログラミングに慣れている方を想定して、日本語プログラミング言語の特徴をご理解いただきたけるとよいかなという趣旨でございます。
今回の題材としては定番アルゴリズム:線形探索法を疑似言語ではなくコンパイル・実行可能なプログラミング言語の日本語で書いてみようというたてつけとなります。
ドリトル
ドリトルは、日本語に近い語順で記述できる、プロトタイプベースのオブジェクト指向の中間コードコンパイラ言語です。中間コードはJVMバイトコードで、Javaアプリケーションと同じ実行環境で動きます。また、教育目的で開発された日本語プログラミング言語であり、中学校・高校の教科書や副教材などに採用されています。語順はSOV型の日本語語順ですが(一部中置記法もあり)、単語間の分かち書きが必須であくまで形式言語です。
ドリトルの入手方法
ドリトルバージョン3(Windows版)を下記の公式サイトからダウンロードできます。
定番アルゴリズム:線形探索法とは
アルゴリズムは、問題を解決するための手順や計算方法を意味します。探索はデータの中から特定の条件に合致するデータを見つけ出すためのアルゴリズムで、いくつかの定番ロジックが存在します。
ここではその中のひとつ「線形探索法」をまず扱ってみます。「線形探索法」はシンプルなロジックである一方、探索効率はよくないとされます。データ数の増加に応じて実行時間はリニアに増加していきます。
このロジックはデータ群を一定の順序で「順々に」判定していきます。「順々に」は「順次」という概念が相当します。判定するこということは合致するかしないかという「分岐」という概念が登場します。また、この場合同じ判定操作を繰り返すことになりますので、通常「反復」という概念が登場します。
プログラミングの3大ロジック構造とは
順次、分岐、反復の3つの制御構造(control structures)によって処理の流れを記述することを構造化プログラミングといいます。
1.順次(sequence) 部分プログラムを順々に実行する。
2.分岐(bifurcation) 条件式が導出した状態に従い、次に実行する部分プログラムを選択して分岐する。
3.反復(repetition) 条件式が導出した特定の状態の間、部分プログラムを繰り返し実行する。ループ処理。
お題のソースコード
最初はもっともシンプルに反復(ループ)を使わずに、まさに順々に処理する手順を記述します。データ群には5つの文字列変数を用意します。
段ボール箱が5つあり、その4つ目に赤いボールが入っている状態をイメージしてください。
段ボール箱1=""。
段ボール箱2=""。
段ボール箱3=""。
段ボール箱4=""。
段ボール箱5=""。
赤いボール="赤いボール"。
改行コード = (0x0d!コード文字) + (0x0a!コード文字)。
表示エリア=テキストエリア!("")作る 300 200 大きさ 16 文字サイズ 。
表示エリア:追記する=「|s1|
自分!(改行コード+s1) 書く。
」。
段ボール箱の1つに赤いボールを隠す=「
段ボール箱4=(赤いボール)
」。
段ボール箱を順次で線形探索する=「
「段ボール箱1==(赤いボール)」!
なら 「表示エリア!"1つ目にあった!" 追記する」
そうでなければ 「表示エリア!"1つ目にはない" 追記する」実行。
「段ボール箱2==(赤いボール)」!
なら 「表示エリア!"2つ目にあった!" 追記する」
そうでなければ 「表示エリア!"2つ目にはない" 追記する」実行。
「段ボール箱3==(赤いボール)」!
なら 「表示エリア!"3つ目にあった!" 追記する」
そうでなければ 「表示エリア!"3つ目にはない" 追記する」実行。
「段ボール箱4==(赤いボール)」!
なら 「表示エリア!"4つ目にあった!" 追記する」
そうでなければ 「表示エリア!"4つ目にはない" 追記する」実行。
「段ボール箱5==(赤いボール)」!
なら 「表示エリア!"5つ目にあった!" 追記する」
そうでなければ 「表示エリア!"5つ目にはない" 追記する」実行。
」。
ルート!段ボール箱の1つに赤いボールを隠す。
ルート!段ボール箱を順次で線形探索する。
通常は異なる手順を順々に記述することが多いですが、ここでは基本的に等価な内容の反復にできそうなところ(いちおう判定対象の変数名がそれぞれ異なっている)をあえて順々に記述しています。
そして下記のようなヶ所が「分岐」しているところになります。このバージョンでは5か所あります。
「段ボール箱1==(赤いボール)」!
なら 「表示エリア!"1つ目にあった!" 追記する」
そうでなければ 「表示エリア!"1つ目にはない" 追記する」実行。
お題のソースコードをコンパイル・実行
では、コンパイル・実行してみます。実行環境はドリトル編集実行画面です。テキストエリアに出力しています。
1つ目にはない
2つ目にはない
3つ目にはない
4つ目にあった!
5つ目にはない
お題のソースコード(反復版)
つぎは反復を使ってみます。まさに同じ手順を順々に処理するところを反復で記述します。データ群には5つの要素を持つ「配列」という特殊な変数を用意します。
引き続き、段ボール箱が5つあり、その4つ目に赤いボールが入っている状態をイメージしてください。段ボール箱は1つづつ5つ並んでいるのではなく、1つの長い段ボール箱が5つのセクションで区切られているようなイメージが近いです。
段ボール箱=配列!"" "" "" "" "" 作る。
赤いボール="赤いボール"。
改行コード = (0x0d!コード文字) + (0x0a!コード文字)。
表示エリア=テキストエリア!("")作る 300 200 大きさ 16 文字サイズ 。
表示エリア:追記する=「|s1 s2|
自分!(改行コード+s1+s2) 書く。
」。
段ボール箱の1つに赤いボールを隠す=「
段ボール箱!4(赤いボール) 上書き
」。
段ボール箱を反復で線形探索する=「
「|回数|
「(段ボール箱!(回数) 読む)==(赤いボール)」!
なら 「表示エリア!(回数) "つ目にあった!" 追記する」
そうでなければ 「表示エリア!(回数) "つ目にはない" 追記する」実行。
」!(段ボール箱!要素数?)繰り返す。
」。
ルート!段ボール箱の1つに赤いボールを隠す。
ルート!段ボール箱を反復で線形探索する。
下記のヶ所が「反復」で記述しているところとなります。
段ボール箱=配列!"" "" "" "" "" 作る。
※~略~
段ボール箱を反復で線形探索する=「
「|回数|
「
※~略~
」!(段ボール箱!要素数?)繰り返す。
」。
「段ボール箱!要素数?」は配列の要素数5を返していますので5回反復します。回数はブロック内ローカル変数として、この反復処理回数の基数1からの回数がセットされます。
そして下記のヶ所が「分岐」しているところになります。「反復」形式で記述していますので、変数名が配列オブジェクト名となり、「読む」メソッドの引数=回数で指定されています。
※~略~
(段ボール箱!(回数) 読む)==(赤いボール)」!
なら 「表示エリア!(回数) "つ目にあった!" 追記する」
そうでなければ 「表示エリア!(回数) "つ目にはない" 追記する」実行。
※~略~
お題のソースコード(反復版)をコンパイル・実行
では、反復版をコンパイル・実行してみます。実行環境はドリトル編集実行画面です。テキストエリアに出力しています。
1つ目にはない
2つ目にはない
3つ目にはない
4つ目にあった!
5つ目にはない
おわりに
いかがでしたでしょうか?わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。