はじめに
近年、情報技術の重要性が高まる中、望ましいスキルとしてプログラミング技能を獲得しようとする人が増えています。しかし、多くのプログラミング言語は英文字ベースであり、英文字いわゆるローマ字の識字が不慣れな方々にとっては習得のネガティブバイアスとなることがあります。この記事では、日本人ネイティブが識別しやすい日本字を使った「日本語プログラミング言語」に焦点を当て、その魅力や特徴、歴史などを実際の言語使いが詳しく解説していきます。
プログラミング言語とは?
プログラミング言語とは、人間同士が意思疎通に用いる自然言語に対して、人間がコンピュータに手順を認識させ、人間側もどのような手順であるかを認識しておくため、ある程度人間にもわかるように自然言語の語彙も一部使った形式的な言語です。
高水準言語とは?
コンピュータは0と1に相当する信号しか認識しないため、0と1の組み合わせからなるマシン語に対して英文字を割当てたものをアセンブリ言語といい、これが最初のコンピュータ用形式言語です。アセンブリ言語は、あまりにも自然言語から遠い言語体系であったため、低水準言語とカテゴライズされました。それよりは若干言語っぽい形式言語Fortran、C言語などが登場し、高水準言語と呼ばれました。高水準言語には、C言語の後継言語C++/Java/C#、英語の自然文らしさを取り入れているオランダ発のPythonなどがあります。
日本語プログラミング言語とは?
あくまで形式言語と高水準言語の範疇で、主に英文字ではなく日本文字(日本漢字、ひらがな、カタカナ)を使ったプログラミング言語のことです。それ以上でもそれ以下でもなく、自然言語の日本語の語順を取り入れる入れないは必須要件ではありませんが、その点は各種の日本語プログラミング言語の特徴をなしているとも言えます。
日本語プログラミング言語の魅力
日本語プログラミング言語の魅力はなんといっても日本人の思考言語と近い言語イメージでアルゴリズムを考案できることです。また、あくまで形式言語ですから、定義に由来した単語の記述となりますが、いろいろな再定義法をつかって形式言語上で日本語の表現の多様性を実装することも可能な点は、仕事というよりは遊び心をくすぐります。なんといっても母語のプログラミング言語が存在するということは、その国の国民の文化や技術力の強さの一面でもあるように思われます。
英字識別の壁はあるのか
文字列の識別が日本字オンリーに制限される人々にとっては、プログラミングの基本的な概念やロジックに集中して学習することもできます。英字文字列の識別にさほど制限がない人々にとっても、いろいろなプログラミング言語の多様性を学ぶ上ではメジャーな文字以外の文字による形式言語に接することで、そのプログラミング言語が大事にしている概念などを学ぶことができる場合もあります。
初心者やプログラミング教育に最適かはひとそれぞれ
高校生にもなってくると、大学は英文科に進みたい、外国語学部に進みたい、日本文学が学びたいなど、個人の好みや文字の識別範囲は多様化していき、外国語を専門とする学部へ進めば、その専門の言語の文字識別(や音声認識)も能力が広がっていきます。
ですので、最初に触れる形式言語としてのプログラミング言語が、英字ローマ字なのか、日本字なのか、はたまた別言語なのかはひとそれぞれとなります。英字識別が得意となった人々にはムリに日本語プログラミング言語で最初から取り組む必要はないでしょう。
短縮された記号表現のが壁になりやすい
今日のプログラミング言語は多様な実装環境に対応するためさまざまな記号表現が多用されており、プログラミングスキル習得のハードルを引き上げている要素となっています。しかし、その些末な利用規則を詳細に把握することは若干アプリケーションの実現や実装の本質的なところから離れている面もあります。もちろん実装環境上で効率よくアプリケーションを実装していく手段としての意義を否定するものではなく、アプリケーションのコアなロジックの実装と併存して最終的な成果物を実現する上では不可欠の要素となります。
日本語プログラミング言語の歴史
1980年代前半ごろまでのパソコンは非常に非力で、日本語の入力や出力がネックになっていました。その後、PC-DOSに独自の日本語規格を実装した日本電気製パソコンが日本市場を席捲すると日本語ワープロソフト一太郎も登場し、パソコン上での日本語の入出力はようやくあたりまえの操作となりました。このころに最初の本格的な日本語プログラミング言語Mindなどが登場し始めます。
1990年代の後半からパソコンの性能もあがり、日本語OSとしてもMS-Windowsが日本市場を席捲し、日本電気製パソコンの独占的地位が消滅します。プログラミング言語の主流もコマンドベースのアプリケーションからウィンドウGUIを操作できるアプリケーションが容易に生産できるものとなります。このころ、プロデルやなでしこの前身であるTTSneoやひまわりがWindows用日本語プログラミング言語として登場します。
代表的な日本語プログラミング言語3選
プロデル
プロデルは、日本語に近い語順で記述できる、オブジェクト指向の中間コードコンパイラ言語です。中間コードは共通言語ラインタイム(CLR)1で、.NETアプリケーションと同じ実行環境で動きます。実装言語はC#。インタプリタ版もあります。
プロデル言語を.NET CoreのCLR中間コードにコンパイルするバージョンとしてスミレがあり、Webアプリケーションの次世代実行環境であるのWebAssemblyアセンブリ言語をコンパイル出力するようにしたスミレ畑があります。
なでしこ
なでしこは、日本語に近い語順で記述できる、オープンソースのインタプリタ言語(V1の場合)です。実装言語はDelphi(デルファイ)です。
実装言語がC#の中間コードコンパイラ言語V2がありましたが、v2の開発は中断されてWebアプリケーションでもあるAltJSのV3に開発の力点をシフトしました。V1はメンテナンスフェーズとして新規の機能は追加されていませんが現在も利用されつづけています。
Mind(マインド)
Mind(マインド)は自然な日本語で記述できるスタック指向の軽量中間コードコンパイラ言語です。単語間の分かち書きが必須で自然言語処理系ではありません。Forth言語のスタック操作処理を継承しているため、逆ポーランド記法2の範囲で分かち書きされた日本語単語の語順が自然と日本語の語順となるという意味の「自然さ」で、あくまで形式言語です。独自の軽量中間コードのランタイム実行で非常に高速です。実装言語はCまたはMind。
実際に日本語プログラミング言語でプログラミングする
では実際にこれらの3つの日本語プログラミング言語でプログラミングコードを書いてみます。これらのコードは実際に動作します。参考にこれらのコードと基本的に等価なコードをJavaで書いた例も併記いたします。
筆者的には日本語プログラミング言語のソースコードがすべて日本字じゃなければイヤという感覚はないので、変数名は半角英字小文字大文字で記述しています。
ただし、全体的に支配的な文字がどっちなのかは例を見ていただくとわかりやすいかと思われます。
プロデル
※コンソール
【count:整数】は、0
【countMax:整数】は、0
もしプログラムのコマンドライン引数が無なら
countMax=0
そうでなければ
例外監視
countMax=プログラムのコマンドライン引数(1)
発生した場合
countMax=0
監視終わり
もし終わり
開始日時は、今日
count < countMaxの間、繰り返す
count =count +1
繰り返し終わり
終了日時は、今日
時間差は、終了日時-開始日時
「処理回数:」& count& 「回」をコンソールへ表示して改行する
「処理時間:」& 時間差の合計ミリ秒数& 「ミリ秒」をコンソールへ表示して改行する
なでしこ
※【なでしこ実行モード】cnako
countとは整数
countMaxとは整数
count=0
countMax=0
もし コマンドラインの配列要素数 < 2 ならば
countMax=0
違えば
エラー監視
countMax=コマンドライン[1]を整数変換
エラーならば
countMax=0
ここまで
ここまで
開始日時は、システム時間
(count < countMax)の間
count = count + 1
ここまで
終了日時は、システム時間
経過時間は、終了日時-開始日時
「処理回数:{count}回」を表示する
「処理時間:{経過時間}ミリ秒」を表示する
Mind
メインとは
countMaxは 変数
countは 変数
合否は 変数
startTimeは 変数
stopTimeは 変数
spanTimeは 変数
起動引数個数が ゼロ?
ならば countMaxに 0を 入れ
つぎに
起動引数(1)を 数値変換し countMaxと 合否に 入れ
合否が 偽?
ならば countMaxに 0を 入れ
つぎに
※開始時間(秒)
日時を値で得る startTimeに 入れる
countに 0を 入れ
ここから
countが countMax 以上 ならば 打ち切り
つぎに
countを 一つ増加し
繰り返し
※終了時間(秒)
日時を値で得る stopTimeに 入れる
stopTimeから startTimeを 引き 1000を 掛け spanTimeに 入れる
「処理回数: 」と countを 文字列変換し 合成し 「回」を 合成し
一行表示し
「処理時間: 」と spanTimeを 文字列変換し 合成し 「ミリ秒」を 合成し
一行表示すること。
Java(参考)
import java.lang.System;
/**
* プログラム型
*/
class Program
{
/**
* メイン
* @param args 引数
*/
public static void main(String[] args) throws Exception
{
int countMax=0;
int count=0;
if (args.length != 1) {
countMax=0;
}
try
{
countMax=Integer.parseInt(args[0]);
}
catch (Exception e)
{
countMax=0;
}
//開始時間(ナノ秒)
long startTime = System.nanoTime();
while(count < countMax){
count+=1;
}
//終了時間(ナノ秒)
long stopTime = System.nanoTime();
long spanTime = stopTime - startTime;
System.out.println("処理回数: " + count + "回");
System.out.println("処理時間: " + (spanTime / 1000000) + "ミリ秒");
}
}
おわりに
いかがでしたでしょうか?わたしはわが国に母語によるプログラミング言語が存在することを誇りに思っております。言語は文化。こんにち、日本語のポップスやアニメソングなどが海外でそのまま歌われるような事例を鑑みますと、純然たる技術基盤として超強力な米欧発プログラミング言語勢と存在意義を争うこともなく、日本語の文化として海外でも日本語プログラミング言語の愛される日が来るのやもしれません。