Jスクリプトの使い勝手を学ぶ

 Jスクリプトは、標準的な装備のウィンドウズ搭載のパソコン(ウィンドウズ・マシン)上で動作するプログラムを組むための簡易言語の一つです。マイクロソフト社が、ネットスケイプ社との共同提案に基づいて、JavaやC言語やC++に近い言語仕様のものを作ったものです。それらの言語を習得している人(プログラマ)が習得しやすいというメリットを兼ね備えています。こと細かくはここでは説明いたしませんが、ネット上の情報によると、これまでのVisual BASIC(VB)あるいはVBスクリプトをもとにして、このJスクリプトが開発されたとも言われています。
 また、ウィンドウズ・スクリプティング・ホスト(WSH)の開発によって、インターネット・エクスプローラ(IE)によるネット上での使用から切り離されても、プログラミング言語として使えるようになりました。つまり、JスクリプトもVBスクリプトも、インターネットと接続していないウィンドウズ・マシン上で、プログラムとして組んで動作するということなのです。しかも、HTMLアプリケーション(HTA)のスクリプト・タグにそれらを組み込めば、比較的簡単に自前のウィンドウが作れて、自由に操作ができます。
 こうしたマイクロソフト社のコンピュータ・ソフトウェア開発(あるいは、その商品としての開発)には、ノウハウとして学ぶべきことが沢山あります。その背景には、マイクロソフト社独自のソフトウェア技術があって、ウィンドウズOSおよびその関連ソフトウェアを影から支えていると言えましょう。その詳細については割愛させていただきますが、そのことをざっくり知っておいていただければ十分だと思います。
 ところで、以前私はブログ記事において、軟着陸ゲームのVBスクリプトを掲載しました。どういうプログラムだったかを示すために、それを少し手直ししたものを今回のブログ記事の巻末付録として記述しておきます。さらに、それをJスクリプトに直すと、以下のようになります。

軟着陸ゲームClassicjs.hta

<TITLE>軟着陸ゲーム</TITLE>

<STYLE TYPE="text/css">
  BODY {background-color:rgb(80%,80%,80%);}
  SPAN.meter  {font-size:14pt;}
  SPAN.meter2 {{font-size:14pt; position:relative;top:-6;}
  DIV.mess    {font-size:14pt; text-align:center;}
  INPUT.kinbox {font-size:12pt; height:20pt; padding:2pt; margin:2pt 0pt 2pt;}
  INPUT.btnbox {font-size:12pt; height:20pt; padding:1pt; margin:2pt 0pt 2pt;}
</STYLE>

<BODY SCROLL = "NO" LEFTMARGIN = "0", TOPMARGIN = "0">

<BR>
<SPAN CLASS=meter> 高度: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<SPAN CLASS=meter> 速度: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<SPAN CLASS=meter> 燃料: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<BR><BR>
<SPAN CLASS=meter2> 消費燃料: </SPAN>
<INPUT CLASS="kinbox" type="text" name="keyin" size=5> 
<INPUT CLASS="btnbox" type="button" name="user" value="押す"><BR>
<BR>
<DIV CLASS=mess id=param></DIV>

</BODY>

<SCRIPT LANGUAGE = JavaScript>
//--------------------------------------------------------------
//
//                                           by Kuroda Kunio
//
//   『軟着陸ゲーム』
//
//--------------------------------------------------------------

  var grav = 5;         /* 重力 m/(s*s) */
  var hei, vec, fue;

window.onload = function() {

  resizeTo(260, 260);
  keyin.value = 5; /* 使用燃料の初期値 */
  hei = 500; /* 高度の初期値 */
  vec = -50; /* 速度の初期値 */
  fue = 120; /* 燃料の初期値 */
  meterdisplay();
  message("降下開始!", 'black'); /* 状況の初期設定 */
}


user.onclick = function() {

  if(param[3].style.color != 'black') {

     param[3].style.color = 'black';
     window.onload();
     return;
  }

  var csmfue = Math.round(keyin.value);

  if(csmfue > fue || csmfue < 0) { /* 消費燃料の入力補正 */
     csmfue = 0;
  }

  // 燃料・高度・速度の更新

  fue -= csmfue;
  hei += vec + Math.round((csmfue - grav) / 2);
  vec += (csmfue - grav);
  meterdisplay();

  if(hei <= 0) {
     if(Math.abs(hei) < 5 && Math.abs(vec) < 5) {

        message("着陸成功!!", 'blue');
     }
     else{
        message("着陸失敗。さようなら。", 'red');
     }
  }
  else{
     message("降下中", 'black');
  }
}


function meterdisplay() {

   param[0].innerText = hei;
   param[1].innerText = vec;
   param[2].innerText = fue;
}


function message(mes, col) {

   param[3].innerText = mes;
   param[3].style.color = col;
}

</SCRIPT>

 確かにこれは、JavaやC言語を習得している人にとって、使いやすい道具の一つと言えます。しかも、私のウィンドウズ・マシンは中古で、ウィンドウズ8のものと、ウィンドウズ7が標準搭載のものが2台あるのですが、どちらでも普通に動作します。Javaのソースプログラムは通常UnicodeUTF-8文字コードでテキスト保存するようですが、私のマシンではメモ帳(notepad.exe)でANSI文字コードでテキスト保存して、ファイル拡張子を.txtから.jsまたは.htaに変えています。ANSI文字コードで.jsファイル拡張子のJスクリプトは、ウィンドウズ・スクリプティング・ホスト(WSH)によって、また、.htaファイル拡張子のJスクリプトを含むテキストファイルは、HTMLアプリケーション・ホストによって動作します。
 しかし、ここまでの説明でしたら、通常の簡易言語の紹介とそれほど変わらないと思います。何らかのプラスアルファ(+α)が無い限り、ブログ記事などに私は書きません。実は、はてなダイアリー(現在のはてなブログ)の10年前の古い記事に『JavaScriptで日本語プログラミング言語を作る -あと味』というtaijiさんの記述がありました。その記事によりますと、「JavaScriptは、予約語以外は全部日本語でできる。」とのことでした。だいぶ昔からその記事が私には気になっていました。けれども、Javaスクリプト自体を公私共に使う機会がありませんでした。ただ、Javaスクリプトを活用したら日本語でコンピュータを動かせるかもしれないと、あやふやなアイデアだけを持っていました。
 そしてまた、はてな匿名ダイアリーでは「プログラム日本語で書ければいい気がするけど」といった書き込みも見られました。ネット上を見回しても、日本語の記述によってコンピュータが動作するプログラミング言語がいくつも見つかります。要するに、これまで学んできたコンピュータのプログラミングがどれも英文と数式の混合体で、私たち日本人は引け目を感じてきた、ということなのだと思います。
 さらに、ネット上を見回してみますと、2009年6月8日のとある投稿型情報ブログで近藤誠さんという人が『日本語スクリプトJapaScript』という記事を書かれていました。これは、コンパイラなどで使われている解析プログラム(parser:パーサ)を一切使わずに、日本語のみで記述したプログラムをJavaScriptと同じテキストファイル上で実行させるものでした。その実用性よりも、そのアイデアとかJavaの使い勝手の良さに私は魅(ひ)かれました。
 そういえば、今から30年以上も昔、私はUNIXとC言語を扱う仕事をしていました。UNIXやC言語が流行る以前のコンピュータ・ソフトウェア技術は、ある意味、頭打ちになっていました。その生産性にも限界が見え始めていました。ところが、UNIXとC言語は、その最初の開発者が『使い勝手の良いシステム』を目指したために、これまでとは全く違う設計思想の、発展性と生産性のあるコンピュータシステムが作られることとなりました。そして、それはマイクロコンピュータの分野で、マイクロソフト社のMS-DOSやウィンドウズなどに引き継がれたのだ、と私は思います。
 おそらく、その『使い勝手の良さ』こそが今日(こんにち)のコンピュータの最大の利点になっていることに気づいていない人が多いと思います。コンピュータという機械は、生まれつき使い勝手の良いもので、人間の手を離れて急激に進化するものだと考えている人が多いと思います。昨今のAIの活躍を見ても、そもそもコンピュータは『使い勝手の良い』ものだ、と多くの人たちが当たり前のことのように思っていることでしょう。しかし、この『使い勝手の良さ』は、誰か人間が考えついて機械にやらせているだけだということを見抜いている人は少ないと思います。ちなみに、UNIXとC言語の最初の開発者は、手持ちのコンピュータシステムでスター・トレックStar Trek)のゲームをやりたいという一心でシステムとプログラムを開発したと伝えられています。
 ところで、日本語プログラミング言語について、私は以前ブログ記事で言及したように、その有用性に期待しながらも、やや否定的な意見も持っていました。つまり、日本語の記述でコンピュータという機械が動くことに魅力がある反面、次のいくつかの点で足踏みしてしまうことを否めないからです。

 1. 3つの基本的な制御構造(逐次、分岐、反復)および、それらの組み合わせを日本語の文脈で表現するのが難しい。
 2. プログラムの生産性が向上するような日本語表現が要求される。
 3. 可読性が良くなってバグがみつけやすい日本語表現が要求される。

 そもそも日本語にしても英語にしても、人間が日常使っている言語は自然言語と呼ばれています。コンピュータが理解できる機械語やそれに変換できるプログラミング言語とは別物です。ということは、今日現存する日本語プログラミング言語は、すべて日本語で記述できても、後者であることが(当たり前だけれども)わかると思います。
 そこで、私はあるアイデアを思いつきました。『漢字かな混じり文』です。漢字は(当て字はともかく)表意文字として使われることが多く、かな文字は表音文字として使われます。表音文字表意文字を混ぜこぜにして使う言語というのは、世界的にも珍しいと思いますし、一長一短はあると思います。が、私の構想は、漢字とかな文字と英単語と数式・記号をわざと組み合わせて、疑似言語にしてしまうことです。英単語や数式・記号は、主に予約語演算子に使います。漢字やかな文字は、関数名や変数名やオブジェクト名などの識別子(identifier)に使います。そうやって、日本語ですべて記述するプログラミングをあきらめて、疑似言語風にプログラミングしてみたものが、以下のJスクリプトです。何の追加装備もせず、標準のウィンドウズ8やウィンドウズ7のシステム上で作ってあります。今さらながら、Jスクリプトの使い勝手の良さに感心させられます。

軟着陸ゲームClassicjsv.hta

<TITLE>軟着陸ゲーム</TITLE>

<STYLE TYPE="text/css">
  BODY {background-color:rgb(80%,80%,80%);}
  SPAN.meter  {font-size:14pt;}
  SPAN.meter2 {{font-size:14pt; position:relative;top:-6;}
  DIV.一言    {font-size:14pt; text-align:center;}
  INPUT.入力枠 {font-size:12pt; height:20pt; padding:2pt; margin:2pt 0pt 2pt;}
  INPUT.ボタン {font-size:12pt; height:20pt; padding:1pt; margin:2pt 0pt 2pt;}
</STYLE>

<BODY SCROLL = "NO" LEFTMARGIN = "0", TOPMARGIN = "0">

<BR>
<SPAN CLASS=meter> 高度: </SPAN><SPAN CLASS=meter id=表示></SPAN><BR>
<SPAN CLASS=meter> 速度: </SPAN><SPAN CLASS=meter id=表示></SPAN><BR>
<SPAN CLASS=meter> 燃料: </SPAN><SPAN CLASS=meter id=表示></SPAN><BR>
<BR><BR>
<SPAN CLASS=meter2> 消費燃料: </SPAN>
<INPUT CLASS="入力枠" type="text" name="使用燃料" size=5> 
<INPUT CLASS="ボタン" type="button" name="押しボタン" value="押す"><BR>
<BR>
<DIV CLASS=一言 id=表示></DIV>

</BODY>

<SCRIPT LANGUAGE = JScript>
//--------------------------------------------------------------
//
//                                           by Kuroda Kunio
//
//   『軟着陸ゲーム』
//
//--------------------------------------------------------------

  var 重力 = 5;         /* 重力 m/(s*s) */
  var 高度, 速度, 燃料;
  var 窓の大きさ = resizeTo;

window.onload = function() {

  窓の大きさ(260, 260);
  使用燃料.value = 5; /* 使用燃料の初期値 */
  高度 = 500; /* 高度の初期値 */
  速度 = -50; /* 速度の初期値 */
  燃料 = 120; /* 燃料の初期値 */
  メーターを表示する();
  メッセージ("降下開始!", 'black'); /* 状況の初期設定 */
}


押しボタン.onclick = function() {

  if(表示[3].style.color != 'black') {

     表示[3].style.color = 'black';
     window.onload();
     return;
  }

  var 消費燃料 = Math.round(使用燃料.value);

  if(消費燃料 > 燃料 || 消費燃料 < 0) { /* 消費燃料の入力補正 */
     消費燃料 = 0;
  }

  // 燃料・高度・速度の更新

  燃料 -= 消費燃料;
  高度 += 速度 + Math.round((消費燃料 - 重力) / 2);
  速度 += (消費燃料 - 重力);
  メーターを表示する();

  if(高度 <= 0) {
     if(Math.abs(高度) < 5 && Math.abs(速度) < 5) {

        メッセージ("着陸成功!!", 'blue');
     }
     else{
        メッセージ("着陸失敗。さようなら。", 'red');
     }
  }
  else{
     メッセージ("降下中", 'black');
  }
}


function メーターを表示する() {

   表示[0].innerText = 高度;
   表示[1].innerText = 速度;
   表示[2].innerText = 燃料;
}


function メッセージ(文句, 色) {

   表示[3].innerText = 文句;
   表示[3].style.color = 色;
}

</SCRIPT>

 余談ですが、ここに及んで一つ気づいたことがあります。Jスクリプトの頭文字『J』の意味は、これまではJavaの『J』のみでした。しかし、上記スクリプトのように、日本語(Japanese)の『J』もかけた二重の意味の『J』(つまり、Java-Japanese)を表す疑似言語プログラミングと見ることもできると思います。なお、このようなプログラミング指向は、あくまでも趣味的なお奨めであって、決して強制でも義務でもありませんから、なにとぞ悪しからず。

巻末付録
軟着陸ゲームClassic.hta

<TITLE>軟着陸ゲーム</TITLE>

<STYLE TYPE="text/css">
  BODY {background-color:rgb(80%,80%,80%);}
  SPAN.meter  {font-size:14pt;}
  SPAN.meter2 {{font-size:14pt; position:relative;top:-6;}
  DIV.meter   {font-size:14pt; text-align:center;}
  INPUT.kinbox {font-size:12pt; height:20pt; padding:2pt; margin:2pt 0pt 2pt;}
  INPUT.btnbox {font-size:12pt; height:20pt; padding:1pt; margin:2pt 0pt 2pt;}
</STYLE>

<BODY SCROLL = "NO" LEFTMARGIN = "0", TOPMARGIN = "0">

<BR>
<SPAN CLASS=meter> 高度: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<SPAN CLASS=meter> 速度: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<SPAN CLASS=meter> 燃料: </SPAN><SPAN CLASS=meter id=param></SPAN><BR>
<BR><BR>
<SPAN CLASS=meter2> 消費燃料: </SPAN>
<INPUT CLASS="kinbox" type="text" name="keyin" size=5> 
<INPUT CLASS="btnbox" type="button" name="Use" value="押す"><BR>
<BR>
<DIV CLASS=meter id=param></DIV>

</BODY>


<SCRIPT LANGUAGE = VBScript>
'//--------------------------------------------------------------
'//
'//                                           by Kuroda Kunio
'//
'//   『軟着陸ゲーム』
'//
'//--------------------------------------------------------------
Option Explicit

  Const Grav = 5 '重力 m/(s*s)
  Dim Hei, Vec, Fue

Call ResizeTo(260, 260)

Sub Window_onLoad()
  keyin.value = 5 '使用燃料の初期値
  Hei = 500 '高度の初期値
  Vec = -50 '速度の初期値
  Fue = 120 '燃料の初期値
  Call MeterDisplay()
  Call Message("降下開始!", "black") '状況の初期設定
End Sub


Sub Use_OnClick()
  Dim CsmFue

  If Param(3).style.color <> "black" Then
     Param(3).style.color = "black"
     Call Window_onLoad()
     Exit Sub
  End If

  CsmFue = CInt(keyin.value)

  If CsmFue > Fue Or CsmFue < 0 Then '消費燃料の入力補正
     CsmFue = 0
  End If

  '燃料・高度・速度の更新
  Fue = Fue - CsmFue
  Hei = Hei + Vec + Round((CsmFue - Grav) / 2)
  Vec = Vec + (CsmFue - Grav)
  Call MeterDisplay()

  If Hei <= 0 Then
     If Abs(Hei) < 5 And Abs(Vec) < 5 Then
        Call Message("着陸成功!!", "blue")
     Else
        Call Message("着陸失敗。さようなら。", "red")
     End If
  Else
     Call Message("降下中", "black")
  End If
End Sub


Sub MeterDisplay()
  param(0).InnerText = Hei
  param(1).InnerText = Vec
  param(2).InnerText = Fue
End Sub


Sub Message(mes, col)
  param(3).InnerText = mes
  param(3).style.color = col
End Sub

</SCRIPT>