はじめに
本記事シリーズは母国語のプログラミング言語が存在するという文化的価値をアピールするためのもので、プログラミング一般の入門を意図するものではありません。とはいっても題材としては定番アルゴリズム:線形探索法を疑似言語ではなくコンパイル・実行可能なプログラミング言語の日本語で書いてみようというたてつけとなります。
なでしこ
なでしこ(V1)は、日本語に近い語順で記述できる、オープンソースのインタプリタ言語で実装言語はDelphi(デルファイ)です。
現在はWebアプリケーションでもあるAltJSのV3に開発がシフトしました。実装言語はNode.js(JavaScript)。V1は新規の機能は追加されていませんが現在もメンテ・利用されつづけています。なでしこは2005年に登場し、今年2025年で生誕20周年を迎えました。
なでしこの入手方法
なでしこバージョン1(Windows版)を下記の公式サイトからダウンロードできます。
定番アルゴリズム:線形探索法とは
アルゴリズムは、問題を解決するための手順や計算方法を意味します。探索はデータの中から特定の条件に合致するデータを見つけ出すためのアルゴリズムで、いくつかの定番ロジックが存在します。
ここではその中のひとつ線形探索(法)をまず扱ってみます。線形探索(法)はシンプルなロジックである一方効率はよくないとされます。データ数の増加に応じて実行時間はリニアに増加します。
線形探索(法)はデータ群を一定の順序で「順々に」判定していきます。「順々に」は「順次」という概念が相当します。判定するこということは合致するかしないかという「分岐」という概念が登場します。この場合、同じ判定操作を繰り返すことになりますので、通常「反復」という概念が登場します。
プログラミングの3大ロジック構造とは
順次、分岐、反復の3つの制御構造(control structures)によって処理の流れを記述することを構造化プログラミングといいます。
1.順次(sequence) 部分プログラムを順々に実行する。
2.分岐(bifurcation) 条件式が導出した状態に従い、次に実行する部分プログラムを選択して分岐する。
3.反復(repetition) 条件式が導出した特定の状態の間、部分プログラムを繰り返し実行する。ループ処理。
お題のソースコード
最初はもっともシンプルに反復(ループ)を使わずに、まさに順々に処理する手順を記述します。データ群には5つの文字列変数を用意します。
段ボール箱が5つあり、その4つ目に赤いボールが入っている状態をイメージしてください。
段ボール箱1とは文字列。
段ボール箱2とは文字列。
段ボール箱3とは文字列。
段ボール箱4とは文字列。
段ボール箱5とは文字列。
赤ボールは「赤いボール」。
ボールを隠し
順次探索する。
●ボールを隠す
赤いボールを段ボール箱4に代入。
●順次探索する
もし、段ボール箱1が赤いボールならば
「1つ目にあった!」と表示、終わる
違えば
「1つ目にはない」と表示
ここまで
もし、段ボール箱2が赤いボールならば
「2つ目にあった!」と表示、終わる
違えば
「2つ目にはない」と表示
ここまで
もし、段ボール箱3が赤いボールならば
「3つ目にあった!」と表示、終わる
違えば
「3つ目にはない」と表示
ここまで
もし、段ボール箱4が赤いボールならば
「4つ目にあった!」と表示、終わる
違えば
「4つ目にはない」と表示
ここまで
もし、段ボール箱5が赤いボールならば
「5つ目にあった!」と表示、終わる
違えば
「5つ目にはない」と表示
ここまで。
通常は異なる手順を順々に記述することが多いですが、ここでは基本的に等価な内容の反復にできそうなところ(いちおう判定対象の変数名がそれぞれ異なっている)をあえて順々に記述しています。
そして下記のようなヶ所が「分岐」しているところになります。このバージョンでは5か所あります。
もし、段ボール箱1が赤いボールならば
「1つ目にあった!」と表示、終わる
違えば
「1つ目にはない」と表示
ここまで
お題のソースコードをコンパイル
では、コンパイルしてみます。コンパイラはなでしこ1です。
C:\nadesiko\nadesiko_1_588>cnako linearsearch.nako
[エラー] linearsearch.nako(20): 文法のエラー。『もし...ならば』の書式に誤りがあ
るか式が複雑すぎます。
[エラー] linearsearch.nako(14): 前回と同様の理由でエラー。
コンパイルに成功すると実行に進行しますので、とりあえずエラー状態の様子です。これは「ならば」の直前に余計なひらがながまじったせいでした。
実行結果
実行結果です。
C:\nadesiko\nadesiko_1_588>cnako linearsearch.nako
1つ目にはない
2つ目にはない
3つ目にはない
4つ目にあった!
無事に成功しました。
お題のソースコード(反復版)
つぎは反復を使ってみます。まさに同じ手順を順々に処理するところを反復で記述します。データ群には5つの要素を持つ「配列」という特殊な変数を用意します。
引き続き、段ボール箱が5つあり、その4つ目に赤いボールが入っている状態をイメージしてください。段ボール箱は1つづつ5つ並んでいるのではなく、1つの長い段ボール箱が5つのセクションで区切られているようなイメージが近いです。
段ボール箱は、「空 空 空 空 空」。
赤いボールは「赤いボール」。
ボールを隠し
線形探索する。
●ボールを隠す
赤いボールを段ボール箱¥3に代入。
●線形探索する
段ボール箱を反復
もし、それが赤いボールならば
「{回数}つ目にあった!」を表示、終わる
違えば
「{回数}つ目にはない」を表示
ここまで
ここまで。
下記のヶ所が「反復」で記述しているところとなります。
段ボール箱は、「空 空 空 空 空」。
※~略~
段ボール箱を反復
※~略~
ここまで。
「段ボール箱を反復」は段ボール箱の要素数でイテレータ風に反復します。
そして下記のヶ所が「分岐」しているところになります。「反復」形式で記述していますので、変数名が「それ」で指定されています。「回数」は1を初期値とするカウンタ予約変数です。配列の要素番号は0から始まるので注意してください。
※~略~
もし、それが赤いボールならば
「{回数}つ目にあった!」を表示、終わる
違えば
「{回数}つ目にはない」を表示
ここまで
※~略~
お題のソースコード(反復版)をコンパイル
では、コンパイルしてみます。コンパイラはなでしこ1です。
コンパイルに成功すると実行に進行しますので、とりあえずエラー状態の様子です。
C:\nadesiko\nadesiko_1_588>cnako linearsearchloop.nako
[エラー] linearsearchloop.nako(12): 記述ミスがあります。プログラムを見直してください。1個の語句が無意味です。命令の未定義、プラグイン不足の可能性もあります。(「(変数)それ」助詞「が」)
[エラー] linearsearchloop.nako(11): 『反復』構文内でエラーです。
[エラー] linearsearchloop.nako(10): 前回と同様の理由でエラー。
これは「もし、」の記述が漏れていたためでした。「もし、」がないと比較演算子相当の助詞「が」がエラーになるという流れです。
実行結果(反復版)
実行結果です。
C:\developments\vscode\mind9\algorithm>linearsearchloop
1つ目にはない
2つ目にはない
3つ目にはない
4つ目にあった!
C:\developments\vscode\mind9\algorithm>
おわりに
いかがでしたでしょうか?わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにちの日本語のポップスやアニメソングなどが海外でそのまま歌われるような近況を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。
祝!日本語プログラミング言語なでしこ生誕20周年1
-
なでしこのバージョン1が正式リリースされた2005年をもって生誕と想定 ↩