曇っていても「Hello, World!」     〜 プログラムって何だ?


さて、第1回の講座に騙されて、いえ、感銘を受けてプログラマへの第一歩を踏み出された方が、全国で15人くらいはみえるでしょうか?
この数字は、国内で、某大手ソフト会社Micro○oft社のセキュリティ対策に手放しで安心感を覚えている人の合計に匹敵します。
(※注:全くの信憑性のない数字です。)
そして、まだ、NS Basicへの第一歩を踏み出せない方へお送りする第2回は、大胆にも「プログラミングのツボ」を伝授しましょう。
まずは、始める前のお約束です。

     「これ自分で作ったプログラムなんだよ。ビームしてあげるね」

って言ってみたくありませんか?

さてさて、プログラミング、聞いただけでは何をどうしてよいやら。空魚屋さんの第1回を読んだ後でも、

     「晴れていても曇っていても、自分には出来そうもないかも・・・」

と思った人が少なくとも60人はみえるのではないでしょうか?(※再度注、全くの信憑性のない数字です。)
でも、そんな講座(※注、悪意はありません。)のサンプルプログラムを上から下まで、ずっと眺めてみてください。ある1つのことに気付くはずです、いや、気付いて欲しいんですけど、気が付かないかも知れませんが・・・
えっと、全てのプログラムが「タップしたら」「タップすると」「タップした時」・・・こんなキーワードが目に付きませんか?(※注:気付いてください。)
そう、簡単なサンプルなのですが、ここにプログラムの基本が盛り込まれているのです。すなわち、

     【 何かをしたら、何かが起きる 】

というのがNS Basicプログラミングの大原理なのです。
例えば、最初のサンプルでは

     「ボタンをタップすると、"Hello,World!" の文字が書かれたダイアログが表示されます」

と書かれています。
これを大原理に当てはめてみれば、このようになります。

さて、突然ですが、この文中で「主語」と「述語」はどれですか?
と国語の授業のような質問ですが、これは「ダイアログ」が主語で「表示される」が述語ですね。英語流に言えば、S(主語)とV(動詞)と言っても良いでしょう。
プログラミングに文法や英語を持ち出して良いものか迷いましたが、まぁ「プログラム言語」と言うのは、よくわからん機械の言葉を、人間の言葉に近いものにしてしまえ、と「英語圏」の人が考えたことですから、英文法というのは、遠くて近かったりします。
おっと、英語と聞いただけで「戻る」ボタンを押したくなる人も多そうですから、この程度にしておきましょう。

話を戻しましょう。
この文中で、主となる部分(主語と述語)が「ダイアログが表示される」でしたから、残りの修飾部は「ボタンをタップした時」ですね。
だから何?と思うかもしれませんが、この原理の中でどこが重要かを探るために、文法を持出してみました。
要するに「プログラム」というのは、この主部「何をどうする」という動作の集まりなんですね。
でも、きっと疑り深いあなたは、(※注:悪意はありません)

「これは簡単なサンプルだからでしょ?実際、難しいプログラムでも『何をどうする』という簡単な原理で、プログラムが動いているの?」

と疑問に思うかもしれません。

では、ここでPalm標準のメモ帳を考えてみましょう。
大抵の場合、メモ帳は、Palmデバイスの右端のハードキーに割り当てられています。
(※注:最近の製品では手書きメモだったり、人によっては四川省だったりしますけど)
このメモ帳、起動する時点で、早速プログラムの原則に気付きます。


「ハードキーを押したら、メモ帳が起動される」

(※注:ちなみに、これはメモ帳自体の動作ではありませんが・・・)
メモ帳の起動画面は、前回の終了時の続きが表示されているはずです。入力中だったら入力画面が、一覧表示だったら一覧表示が表示されていますね。
そう、ここにも基本があります


「プログラム(メモ帳)が起動したら、前回の続きが表示される」

例えば、一覧だったと仮定しましょう。すると、下の方に「新規」のボタンがあるはずですので、新しいメモを入力するために「新規」をタップしましょう。
そうですね、


「新規ボタンをタップすると、新しいメモの入力画面が表示される」

が基本です。
(※注:あまり知られていませんが、新規ボタンを押さなくても、いきなり文字入力を始めれば、新規メモの入力画面になります)
次は、メモ帳への入力です。ここに「mizuno-ami」などとわざとらしく入力してみましょう。
ここにも基本がありました。


「文字が入力されたら、画面に入力された文字を表示する」

さて、とりあえず入力したら「終了」をタップしてみましょう。
もちろん


「終了ボタンをタップしたら、一覧画面に戻る」

となります。
あ、でも、これだとメモが保存されませんので、


「終了ボタンをタップしたら、編集中のメモを保存する」

という処理を加えておきましょう。

これで、メモ帳の大きな動作は出来上がりました。
このように一つ複雑なプログラムでも個々の処理はそれほど複雑ではない、と言うことがおわかりいただけたでしょうか?
(※注:「メモ帳は複雑なプログラムでは無いような気がします」というクレームはご勘弁ください)
イメージ的には、こんな感じですね。


さて、では「何かをしたら、何かが起きる」という原理をどうやってプログラムにするのでしょうか?
ここがミソなのですが、実は、これらの全部を一からプログラミングしていたらかなり大変なので、大抵の場合、そういうことはしません。
通常は、そのデバイスのOSや、プログラミングツールが助けてくれますので、負担はかなり軽くなっています(※注:よかったですね。)
ここでは、NS Basicとあなたの役割分担について説明しましょう。

この原理の中で、あなたが処理担当するのは「ボタンをタップするのが自分だから『何かをしたら』でしょ?」と思うかもしれません。

     「ボタンをタップする」→私
     「ダイアログを表示する」→Palm

確かに、Palmやパソコンを使っていると、自分が「何かをしたら」、Palmやパソコンが「何かを起して」くれているように感じます。
でも、プログラミングというのは、使う立場とは全く逆で「何かが起きる」という部分を書くことなのです。



     「ボタンをタップする」→使う人
     「ダイアログを表示する」→「ダイアログをPalmに表示させる」→あなたは命令者

プログラマー的視点は、使う側と使わせる側が逆転します。早く慣れちゃうことが大切です。
では、そう言う目で、空魚屋さんのサンプル「ボタンをタップすると、"Hello,World!"の文字が書かれたダイアログが表示されます」を見てみましょう。

まず、NS BasicのIDE画面で、ツールボックスからボタン選択し、配置します。

次に、配置したボタンをダブルクリックするなどして、プログラムコードを入力します。

こんな手順ですね。
(※注:もちろん、これをコンパイルして、エミュレータ上で実行するか、HotSyncして実機に送って実行しないと、結果はわかりません。)
この一連の手順の中で、実際にプログラム言語を使ったのは、

     MsgBox "Hello,World!"

この部分だけです。
このMsgBoxという「命令(コマンド)」は、「MsgBox 文字列」で指定した「文字列」をダイアログとして表示しなさい、という命令です。
これを使えば、簡単に画面上に「Hello,World!」と表示される訳です。
(※注:命令などと、難しい言葉が出てきましたが、今から慣れちゃえば大丈夫です。命令、って言っても、あなたがPalmに命令する立場ですからね!)
(※注:そして、Palmは頭が固いので、命令にも厳格な文法を要求します。覚えなくても、ハンドブック片手に命令してあげればOKです)

したがって、先ほどの原理と重ね合わせると、

この全体のうち、実際にプログラミングをしたのは「主語」と「述語」が含まれる部分だと言う事がわかります。
「何かをしたら」という修飾部に相当するプログラムコードは登場していませんよね?

では、その修飾部の「何かをしたら」は、具体的にどんな事をしたのでしょうか?
明らかに、残っているのは「ボタンを配置した」という作業ですね。そう、実は、これだけなんです。
特に苦労もなくボタンを画面に配置しただけですが、実は、NS Basicでは、このように必要な部品を貼りつけた時点で「何かをしたら」という部分の処理が出来てしまうのです。
(※注:押しつけがましい言い方ですが、これがVisual BASICなどの革命的な出来事なんです。今までは、この部分もプログラム言語で処理する必要がありましたから。)

従って、あなたがNS Basicを使ってプログラミングする場合、「何かをしたら」というきっかけを起す部品を画面に配置して、どうすれば良いのかをBASICの文法で「命令」をするだけなのです。
(※注:正確に言えば「何かをされたら」ですね)
ね、ちょっと簡単でしょう?
ウソ臭いですか?じゃあ、画面にボタンを配置して、そのボタンが押されたら「編集中のメモを保存する」という命令を書いておけばどうなりますか?
そう、メモ帳の終了時の処理ですね。ウソじゃなさそうでしょ?(ちょっと、短絡的ですね)

ちなみに、この「ボタンを押した」という「きっかけ」を、専門用語で「イベント」と言います。
プログラムは「イベント」が発生したら、あなたが命令したプログラムコードを実行しますので、このようなプログラムを「イベント駆動型」又は「イベントドリブン型」と呼びます。
(※注:まぁ、この名称は忘れても良いでしょう。PalmOSもWindowsもMacOSも、良く見りゃイベントドリブン型ですからね。ちなみに逆は「逐次実行型」です。)

このように「プログラムを作る」と言うことは、何かイベントが起きた時に「どうしたら良いのか」をPalmに教え込むことなのです。
「ボタンが押されたら、Hello,World!って表示しなさい」と命令する訳ですね。そして、ボタンが押されたかどうか、というイベントはボタンを画面に配置した時点で準備されますので、あなたはPalmに対して、いかにして「Hello,World!って表示」をさせるか考えることに注力すれば良いのです。
そして、プログラミングで面白いのは、Palmで扱える部品がボタンだけではない事です。
例えば、テキストフィールドやスクロールバー、リストボックス、ポップアップ等など、これらの部品は、使う側からすれば文字を入力したり、値を入力したり、変更したりと、目的に応じて配置されています。



色々な用途で使われる部品

これは、プログラマーさんが、そのプログラムを使う人のために便利な部品を配置してあるのです(※注:デザインですね。)
経験的に、使い勝手の悪いプログラムというのは、画面をみたらおおよそわかりませんか?そう、部品が適材適所じゃないんですね。
そういう意味で言えば、単に部品を画面に配置するデザイン作業は、難しいBASICのコマンドを記述するより簡単に思われがちですが、実際は使い方を左右する重要な作業の1つなんです。

さて、これらの部品は、例えば、次のような場合にイベントが発生します。

     ボタンなら、ボタンをタップした時
     スクロールバーなら、タップされた時
     テキストフィールドなら、カーソルが無くなったとき(別の部品にカーソルが移ったとき)

テキストフィールドは、ちょっと変わっていますが、その他の部品は、大抵「タップしたとき」にイベントを発生します。
(※注:考えてみれば、Palmでは「ペンでタップする」と言うのが一般的な動作ですから。)
だから、スクロールバーを配置して、タップしたときに「Hello,World!」とダイアログを表示させる事も可能です。
(※注:でも、あまり意味の無い例です。スクロールバーは、タップの動作そのものより、その値を使った方が便利ですからね。)
ちょっと専門用語ですが、このボタンなどの部品を「スクリーンオブジェクト」又は、単に「オブジェクト」と呼びます。
この呼び方を使えば「ボタンオブジェクトをスクリーン上に配置して、そのタップイベントに、Hello,World!を表示させるイベントコードを書く」となります。一気に専門的でしょ?
でも、原則は同じです。「何かをしたら、何かが起きる」、そして「あなたは命令者」これをお忘れなく。

そう言えば、画面上に配置できるボタンやスクロールバーなどのオブジェクトが「目に見える」場合、プログラムコードは、そのオブジェクトのイベントコードに書けば良いので、それほど難しくはありません。しかし、

     画面のタップ
     ハードボタンを押す
     ジョグダイアルを操作する

という極めて重要な動作には、オブジェクトがありませんね。これらはボタンオブジェクトのように画面上に気楽に配置できません。



例えば、ボタンやジョグなど

(※注:画面はここにあるのに、存在しないとは、などと哲学的な議論をしているわけではありません。)
そこで、NS Basicでは、これらの特殊なオブジェクトは全てその画面(フォーム)に対してイベントを発生する、と位置付け、実際にはここにプログラムコードを書きます。

フォームは他のオブジェクトとは違って、3つのイベントを処理できますが、これらの特殊なオブジェクトが発生させるイベントの処理は全て「Events Code」に記述します。
(※注:「After」や「Before」などは、別の機会で説明します。)

例えば、このEvent Codeに

     Sub Form1003_Event()
          Beep
     End Sub

と入れてみましょう(※注:実際に入力するのは「Beep」だけですね。)
このプログラムでは、特殊なイベントが発生するとビープ音を発しますが、ハードボタンを押しても、画面をタップしても、ジョグダイアルを回しても、はたまた、電源ボタンを押しても、ビープ音が発生しますね?
(※注:ハードボタンを押すと、割り当てられているプログラムが起動してしまいます。ハードボタンを試すときは、上下ボタンを使うと良いでしょう。)
つまり、どの動作に対しても、1ヶ所でイベントが処理されるのです。
したがって、どのイベントが発生したのか、区別できないとお話になりませんので、これらの特殊なイベントが発生したときには、そのイベントコードの先頭で、

     何が起きたの?

という処理コードを余分に書く必要があります。



一つ、余分な処理が必要です

ジョグを回した処理をしたいのに、ボタンを押したイベントまで処理されては困りますからね。
この具体的な処理方法については、別の機会に述べるとしますが、それ以外は他のオブジェクトと大差ないことを覚えておいてください。
つまり、原則は同じです。「何かをしたら、何かが起きる」です。

では、なぜプログラムが難しく感じるのでしょうか?
それは、今まで分解してきた基本的な処理が、プログラム言語の最小単位ではないからです。

例えば、メモ帳の最後の処理では、



終了ボタンをタップしたら、編集中のメモを保存して一覧画面に戻る

と書けますが、NS Basicには「編集中のメモを保存して一覧表示に戻る」という命令語はありません。
したがって、もう少し細かい単位に分解する必要があります。例えば、



1)終了ボタンをタップしたら、編集中のメモを保存する
2)終了ボタンをタップしたら、一覧画面に戻る

の2つに分解してみます。それでも「編集中のメモを保存する」という命令は用意されていません。
そこで、更に分解して、



     1)終了ボタンをタップしたら、メモ保存用のデータベースを開く
     2)メモ保存用データベースを開いたら、そこに編集中のメモを書き込む
     3)編集中のメモを書き込んだら、データベースを閉じる

という単位に分解しなければならないのです(※注:まだまだ粗いですが。)
これだと、例えば、データベースを開く「DbOpen」という命令に対応でき、やっとBASICの命令を当てはめる事が出来ます。
しかし、逆に、これを見ただけでは、「何をしているのか」という点が分かりづらいですよね。全体を眺めて「編集中のメモを保存している」と言われれば、なるほどそう言う気がする、という程度です。
つまり、命令したい事に対して、それほど複雑な命令を持っていないため、仕方なく単純な命令を組み合わせ、なんとか目的とする動作を作り上げる必要があり、このギャップがプログラミングの難しさでもあるわけです。
(作ってしまったものを眺めても、動作がわかりにくいですしね。)
言い換えてみれば、プログラミングは、難しいから難しいのではなく、簡単なものしかない所から難しいものを作らなければならないので難しいのです。

じゃあ、NS Basicにもっと便利な命令を沢山用意しておいてくれれば良いのに、と思うかもしれませんが、でも、そうすると、Palmに内蔵されているCPUを直接動かす命令とは、別物になってしまう訳なんですね。
つまり、CPUを動かす機械語というコードと、人間の言葉を比べて見て、BASICはどちらに近いかと言えば、BASICは(どちらかと言えば)人間の言葉に近い言語であると言われています。しかし、そうなると、CPU的には難解ですから、速度が遅くなるわけです。
大阪弁を標準語に翻訳するのと、インドのタミル語を日本語に翻訳するのでは、どちらが楽かと言われたら、答えは明らかですね(※注:日本人のあなた限定の質問です)
従って、人間が楽をすればするほど、CPUは理解するための余分なパワーを使ってしまい、動作速度に影響が出てしまいますが、それを何とかカバーして、実用的な速度が確保できる限界がBASICという言語の位置付けなのです。
一方の、CodeWarriorなどで書くC言語やC++は、どちらかといえばCPU寄り(※注:正確にはOS寄り)ですから、人間に難解な分、実行速度が速いわけです。
(※注:例えC言語でも、CPUが使う機械語に比べれば人間的ですが)

また、単純な命令をただ組み合わせるだけでなく、適切な順番で処理できるように考えなければならない点も、難しい点の1つでしょう。
先ほど、

と2つに分けましたが、順番を考えるならば、

ですね。先に一覧に戻ると、編集中のメモが消えてしまいます。
(※注:消えない様に作ることも出来ますが、あまり賢くありません。)

さて、プログラミングの原則と、難しい理由を長々と説明してきました。
いい加減疲れてしまったかと思いますが、それでも「何かをしたら、何かが起きる」原則で、簡単な動作しか出来ない命令を組み合わせて1本のプログラミングを組み上げるのは、苦労が多い以上に、知的で楽しい趣味ではないでしょうか?
(※注:NS Basicさえ買ってしまえば、後の費用がかからない所は、お父さんにも嬉しいですね。)
今回の「プログラミングのツボ」、まとめてみると、こんな感じです。

・原則は「何かをしたら、何かが起きる」イベント駆動型であること
・イベントの処理は、画面にオブジェクトを貼りつけるだけで、ほぼ完成
・簡単と言っても、画面のデザインは、使い勝手を左右する
・作り手は、イベントが発生した後の処理をPalmに命令するだけ
・命令は、オブジェクトのイベントコードを書けばよい
・ただし、画面に配置できない特殊なオブジェクトもある
・命令は、簡単な命令語しかないので、組み合わせなきゃ使えない
・ついでに、頭が固いので、命令語の文法をキッチリ守らなければならない

まずは、再度、空魚屋さんのコラムに目を通してみて下さい。なんとなく「はじめてみようかな」という気がしたら今回の講座は修了と言う事にしましょう



copyright(C)2002 Hacker Dude-san all rights reserved.