Indyといっしょ Vol.6 COSMO Codeで Javaる

村崎 達哉 SoftwareDesign 1996年8月号(技術評論社)

謹んでJavaさせていただきます

Java、Java騒ぐなといいたい。Javaなんて、所詮C++から毛が一本抜けたようなものではないか、と考えています。毛とはポインタの利用や多重継承のことです。C++を長年やってきたプログラマからすれば、恐るるに足りません。どちらかといえば、歓迎しているくらいです。

なぜ、歓迎するかといえば、C++は表現力が豊かすぎて、やっぱりあまりにも難しい言語だし(習得するのに2年はかかると思います)、かといって、Microsoftの術中にはまって、いつまでもBASICにこだわり続けるアナグラマー(アナクロなプログラマー、一穴主義のプログラマーの意 by 村崎)にはなりたくないし.....

そうだ、この際、なぜやっぱりJavaなのかというのを箇条書きにしてみましょう。これは、誰にでも当てはまる一般的な利点というのではなく、私個人にとっての利点ということで、普遍性があるとは申しません。

1.C++は、歴史上最高に複雑な文法を持つコンピュータ言語ではないか?!その開発には、きわめて明晰な頭脳と、豊富な経験を要する。何よりも学習のための初期投資がばかにならない。したがって、OSを開発したり、リアルタイム性の強いプログラムを開発するとき以外は、もっと扱いやすい言語がほしい。
多重継承やテンプレート、演算子のオーバーローディングなどといったものは、確かにすばらしい機能ですが、それを必要とするプログラマはほんの一握りです。

2.でも、今更まるっきり新しい言語を覚えるのもかったるし、Javaに影響を与えたといわれているSmalltalkはすばらしい言語ですが、風前の灯火だし...

3.Microsoftの手のひらの上で躍らされて、貴重な人生を浪費しているあなた、自分の人生に疑問を持ったことはありませんか?Windowsのプログラムという余りにローカルな世界で生命を消耗させて、睡眠不足で目を充血させ、長時間の座りすぎで痔にかかり、ヒーヒーいっていたり、毎晩の午前様のせいで、奥様に最後通牒を渡されていたりしませんか。確かに今はプログラムのメインストリームはWindowsプログラムかもしれません。しかし、プログラミングの広大な世界からすれば、Windowsの何千というAPIを覚えて、やれOLEだOCXだ、と思ったら今度はActiveXだときたもんだ、こんなことが正しいプログラマ道だと思いますか。人生には、愛があり、自然との融和があり、タオの原理に支配されている宇宙とのハーモニーを探求する深くホーリーな部分がなければならないのではないでしょうか。

プログラマ道も重箱の隅を突つくような短命な技術ではなく、より、普遍性のある、寿命の長い技術の習得に時間をかけるべきです。DOSのとき一生懸命にCONFIG.SYSやAUTOEXEC.BATをカスタマイズしたりしていませんでしたか、そうゆうあなたは気を付けたほうがいいですよ。私には、少なくともJavaの方がまだ、一般的で応用性のある技術のような気がします。Javaは今でも十分マルチプラットフォーム、アーキテクチャニュートラルな開発言語です。

4.ネットワーク指向の初めての言語であるということで、TCP/IPやSocketのことを詳しく知らなくてもネットワーク対応プログラムを書けるそうで、それがうれしい。これは私に限ったことではないかもしれません。

5.最後に、これまでのソフトウェアの状況がインターネット&WWWの出現によってリセットされたようなところがあります。どうゆう意味かというと、これまで巷にはごまんというアプリケーションが氾濫していましたが、その多くがインターネット対応を迫られています。インターネット対応といっても、これは簡単ではありません。
Netscape Navigatorのようなブラウザ上で動作させるとなると、そのアーキテクチャから検討し直さなければなりません。すなわちこれまで大きくシェアーを伸ばしてきたアプリケーションも、これから開発されるアプリケーションも同じスタートに立っているということです。だから、私にもあなたにもソフトウェアでミニBill Gatesになるチャンスがあるということです。


ソフトウェアファミリー

上記で、Javaの効能について述べましたが、はっきりいって私はそれほど詳しくはありません。数ヶ月前に川崎であった「Java Day」に出席したのと、「インターネットをより楽しくするHotJava入門」(中山茂著、工学図書)を読んだぐらいです。でも、この本はシンプルでツボを押さえていて、教科書風ではありますが、C++プログラマの私にはピッタリでした。ただ、さすが工学図書、カラーページ1つなくデザインは最低で、決して売れないでしょう。しかし、だから買ったのかもしれませんが。

そのJavaに詳しくない私が、どうしてJavaについて書けるかというと、それは取りも直さずSGIのCOSMO(コズモ)シリーズのCOSMO Codeのおかげです。あと、C++をやっているという根拠のない自信があるからかもしれません。

ここで、COSMOについてざっと説明しなければなりません。What's COSMO? これに答えられるのは、米国SGIの開発担当者だけでしょう。なぜなら、まだ、それを見た人がほとんどいないからです。現時点ではCOSMO Code Ver1.0の出荷のみ開始されています。このSDが出るころには、COSMO PlayerやCOSMO Mediaも出荷されているかもしれません。
SGIのWEBから引用するCOSMOシリーズは、インターネットWWW(World Wide Web)にインタラクティブマルチメディアと3Dグラフィックスを実現する先進の技術を統合した強力なソフトウェアセットだということです。
いや〜大風呂敷ですね。SGIのインターネットにかける意気込みを感じます。5月号でも4つのモジュールの説明を簡単にしましたが、もう一度おさらいをしてみましょう。

・ COSMO Create(オーサリングソフトウェア)
インタラクティブなWWWページや、マルチメディアタイトルを作るためのオーサリングツールです。
HTMLやVRML、Javaなどを編集します。

・ COSMO Code
Javaプログラミング言語用の最先端の拡張開発環境です。
コンパイラ、ソースデバッガ、ソースブラウザ、デジタルメディアならびに3Dライブラリを含んでいます。

・ COSMO Player
ブラウザです。リアルタイムオーディオ、フルモーションビデオ、2D、3Dグラフィックスなど、
あらゆるメディアを表示す高速計量ブラウザです。他のブラウザのプラグインとしても利用できます。

・ COSMO MediaBase
World Wide Webおよびイントラネットに対し、強力なマルチメディアデータのマネージメントと配信サービス機能を提供します。

これだけでは、何のことかよく判らないですね。Webの説明を読んでると、何でもできます、夢のようなツールです、といった印象を受けますが、やっぱり実物を見ないことには、何ともいえません。今回は、この中でCOSMO Codeの実物を評価してみました。


JDKとCOSMO Code

図.1 Cosmo Codeの画面

これが、COSMO Codeの画面です。(図.1)
ウインドウのキャプションにはCOSMO Code Debuggerとあります。ロードモジュールの名前はJdev(Java Development Kit?)です。このことから、COSMO CodeはJDKの特にデバッガを拡張した開発キットであるようです。

といっても私はJDKを使い込んだ経験はありませんが。まあ、シマンテックのCafeやボーランドのLatteのような統合環境と思っていただければ結構です。
ただ、Cafe(既に出荷されています)やLatte(96年後半発売)は非常に低価格で販売されるので、ワークステーションメーカであるSGIがどの程度の価格で販売しているのかが見物です。Webで見た範囲では、価格については情報を入手できませんでした。

話しは脱線しますが、インターネットのソフトウェアの価格破壊は、ソフトウェアを生業(ナリワイ)としているものにとって恐ろしいものがあります。
NetscapeがNavigatorをただで配布するのは、ネビゲータユーザにとってはラッキーでも、何でもかんでもインターネットのソフトはただか、限りなく無料に近いと思っている人々が増えているような気がして背筋が寒くなります。
MicrosoftなんかブラウザもWebサーバーもただなら、SQLサーバーまでただにしようとしているというではありませんか。SQLで思い出しましたが、一見勢いのあるデータベースのトップメーカー、Oracleなんかの苦悩も察することができます。今まで数千、数億円単位の商売していたのに、急に商売の単位を2桁も3桁も下げなければならなくなったのですから。
切り札として出てきたWebサーバー、その名もWebServer1.0は、何とOracleのデータベース込みで破格の79万円(NT版)でした。それがこの6月には38万円になったのです。ほんと、後は体力勝負といったところです。でもまだ体力のあるところはいいです。弱小、零細ソフトハウスはどうすればよいのでしょうか。

ちょっと愚痴っぽくなってしまいました。さて、それでは本題のCOSMO Codeをつかってみましょう。私がお借りしているマシンにインストールされていたCOSMO Code Ver 1.0には2つのサンプルプログラムがついていました。その中のimpression.javaというサンプルを例にとって開発の手順を説明します。「impression」は印象という意味ですが、このプログラムは元絵を、印象派風にデジタル処理するプログラムです。(図.2)
もちろん、アプレットとして、Netscape NavigatorやHotJava上で動作します。これらのサンプルを入手したい方は

http://www.sgi.co.jp/Fun/free/java-apps.html

のURLにアクセスしてみてください。(図.3)ゲームなど面白いアプレットが集められています。

図.2 サンプルプログラムimpression.java

図.3 SGI社Javaアプレットのページ

あっ、そうそう、書き忘れる前に言っときますが、COSMO Code自身も試用版があって、ダウンロードすることが出来ます。といってももちろんIRISを使用できる環境にないといけません。使用してみたいひとは、次にアクセスしてみてください。

http://www.sgi.com/SurfZone

です。ただし、ここを利用するためにはSurfZoneの会員にならなければなりません。
そのためには次にアクセスして、レジストレーションします。(図.4)

図.4 SurfZone

http://www.sgi.com/Products/Evaluation/evaluation.html

開発手順を簡単に説明します。

1.COSMO Code にはJDKのIRIX版が/usr/javaにインストールされています。JDKのコンパイラ javac を使ってコンパイルします。

/usr/java/bin/javac -g Impression.java

-g フラグはデバッグのためにシンボルテーブルを生成するオプションです。

2.アプレットを表示するHTML文書を作ります。この場合だと imppaint.htmlなどと名前を付ければよいでしょう。
その中で

<applet code="Impression.class" width=350 height=400></applet>

というタグを使ってアプレットを実行するよう記述します。

3.アプレットの簡易表示ツール appletviewer(図.5)を使って表示してみます。

/usr/java/bin/appletviewer imppaint.html

図.5 アプレット ビュアー

4.表示されるようであれば、実際にWebブラウザで表示してみます。これで万事OK、すなわちいずれのことも当初の設計どおり動作していれば、もうこれ以上やることはありません。しかし、ちょっと複雑なアプレットとなると、コンパイルが通ったからといって、動作は保証できませんし、細かいチェックはやっぱりデバッガに任せた方がよいものです。そこで、COSMO Code Debuggerの登場とあいなります。

5.COSMO Code の使い方は、次のセクションで私のJava処女プログラムを使って説明するとします。COSMO Codeの起動は、アイコンカタログウインドウのWebToolsからアイコン「Jdev」をクリックするか、コマンドラインで次のように入力します。

jdev imppaint.html

デバッグする前に、実行ディレクトリに書き込みのパーミッションが許可されているか?
Impression.classはすでにコンパイルされているか?確認しておく必要があります。


僭越ですがJavaさせていただきます

やっぱりデモプログラムだけでは面白くありません。簡単でもオリジナルJavaプログラムをデバッグしてみたいと思うのが人情です。ここで紹介するプログラムは多面体がクルクル回っているだけの簡単なプログラムです。6、7年前にCでコーディングして(リスト1省略)、X68000やトランスピュータや、なんとデータフローCPU(非ノイマン型CPU)の上で遊んでたプログラムです。それをJavaに移植してみました。

お愛敬で、クリックすると反対方向に回転するようにしました。本当は、ベクトルのクラスは別クラスとして実装したかったのですが、時間がもったいないので1つのファイルに1つのクラスで実装してしまいました。工夫した点といえば、スレッドを使用している点です。やっぱりこれからのプログラムはスレッドですよ。ただ、ここではJavaのプログラムの説明はしません。あっちもこっちもJavaの記事であふれていますし、本もたくさん出ています。そちらを参考にしてください。

それでは、上記の開発手順に沿ってプログラムを開発してみましょう。

1.このプログラムは正12面体が回転するプログラムなので、RotatePolyhedron.javaという名前を付けました。言いませんでしたが、Javaのプログラムには普通java拡張子が付いています。それをjavacでコンパイルして拡張子class付きのクラスファイル、バイトコードファイルにコンパイルします。

javac -g RotatePolyhedron.java

これでバイトコードRotatePolyhedron.classができます。当然このプログラムはアーキテクチャニュートラルなオブジェクトですから、WindowsでもMachintoshでもSolarisでも動きます。

スレッドのところだけは多少プログラムの説明をしときましょう。


      // アプレットスタート
      public void start() {       // starts the thread
          .........
          
          s = new Solid();

          resize(400, 400);

          if (ct == null) {
             ct = new Thread(this, "RotatePolyhedron");
             ct.start();
          }
      }

アプレットが呼ばれると、この関数でスレッドが生成されます。


      // スレッド実行
      public void run() {
          while(ct != null) {
              repaint();            // call paint function
              try {
                  ct.sleep(300);    // 0.3秒毎にスレッドを目覚めさせる
              }
              catch(InterruptedException e) {}
          }
      }

run()メソッドがスレッドの実行を行うスレッド本体です。スレッドは0.3秒毎に目を覚まして再描画します。そして、アプレットが終了されると、スレッドも息の根を止められてしまいます。


      // アップレット終了
      public void stop() {
          ct = null;
          ct.stop();
      }
その他、リストにプログラマならどんなことやっているかぐらいは分かるようにコメントを入れておきました。

2.アプレットを表示する簡単なHTML文書を用意してRotatePolyhedron.htmlとしました。これがないとアプレットも表示できません。


      <!-- RotatePolyhedron.html -->
      <html>
       <head>
          <title> RotatePolyhedron.html </title>
       </head>

        <body>
          <h1> Rotating Polyhedron </h1>
          <applet code ="RotatePolyhedron.class" width= 400 height=400></applet>
        </body>
      </html>

3、4ははしょって5に行きましょう。

jdev RotatePolyhedron.html

5.COSMO Code Debuggerが起動したら、さっそくRunアイコンをクリックしてRotatePolyhedronアプレットを実行してみます。(図.6)するとappletviewerが現れてアプレットの実行が開始されます。

図.6 アプレットの実行

6.Debuggerときたらブレークポイントです。ブレークポイントをかけなければ何も始まりません。Jdevには3つのブレークポイントのかけかたがあるようです。ソース行番号、メソッド、例外処理でかける方法です。(図.7)ブレークポイントの前後をデバッグするにはいつものように、StepアイコンやReturnアイコンを使ってデバッグします。(図.8)

図.7 ブレークポイントダイアログ 図.8 ステップアイコンによるデバッグ

7.やはり、ブレークさせたらデータの評価をしなければなりません。(図.9)このようにして、6、7を繰り返せばどんな複雑なプログラムでもたちどころに完璧なプログラムに仕上がります。ほんとかな。

図.9 データの評価

8.しかし、デバッグにおいてオブジェクト指向プログラムは手続き型のプログラムとはまた一味違った難解さを持っています。手続き型のプログラムでは、木構造的に関数が呼ばれていくので、時間的に近い関数群は同一ファイルか同一モジュールに含まれることが多いので、デバッグのときにデータや関数を探すのにはそれほど苦労しません。ところが、オブジェクト指向プログラムは、クラス単位で分けられていて、実行時間的に近い関数が必ずしも同一モジュールにコーディングされているとは限りません。また、オブジェクト指向システムはイベントドリブンプログラムと表裏一体なので、これが、また関数を追いかける作業を難しくしています。

そこで、最近のデバッガにはクラスや関数のブラウザがサポートされています。これはSmallTalkの残した大きな遺産です。そして、Jdevにもやっぱりクラスブラウザがサポートされています。(図.10)

図.10 クラスブラウザ

9.はい、こうやって出来上がったのが(図.11)のアプレットです。大したプログラムではありませんが、Javaの文法から始めて3日は移植にかかりました。

図.11 完成したアプレット


「Indyといっしょ」最終回

初めてJavaしてみて感じたことは、Javaも十分難解だなということです。
JavaのスクリプトバージョンであるJavaScriptの方は、機能をWWWをコントロールするスクリプトとして限定することで、もっと容易に扱えるのかもしれません。 しかし、Java言語の方は、言語として十分な機能を持たせなければならないし、また、オブジェクト指向のメリットを享受するためには、オブジェクト指向のパラダイムに慣れるスキルを積まなければなりません。その上、サウンドやビデオ、3Dグラフィックスなどのマルチメディアデータのコントロールもしなければならないし、通信やセキュリティの機能も使いこなさなければならないのです。C++より文法が簡単なだけ(???)それなりに記述が冗長にならざるお得ないところもあるようです。

結局、十分な機能を持った言語は、現時点ではこれ以上は簡単にはできないでしょう。21世紀を迎えて、人工知能が進化し、最初に数行のスクリプトを書けば(あるいは音声入力)複雑なことの大半はみんなAIが理解し実行してくれるようになったら、話はちがいますが。
それまでは、インターネットの時代でも、僕らプログラマは、まだまだ社会から必要とされているのです。自分のアイデンティティの喪失という危機を乗り越えたところで、今月はこれでおしまいとします。

6回にわたって「Indyといっしょ」をお送りしてきましたが、十分な調査時間が取れなくて、どうしても不十分な説明になってしまいました。特にインターネット関連の話題は、2、3ヶ月前の資料は使えないくらい、すぐに情報が陳腐化してしまうので、ほとんどはWebの情報をもとにしましが、情報が膨大で私自身消化しきれませんでした。しかし、とにかくインターネットの最大のメリットは、これまでなかなか入手困難だった最新の情報を即座に入手できることだということをつくづく感じさせられました。
もしインターネットがなかったら、日本でIndy関連の情報を入手するのは結構大変でしょう。日本シリコングラフィックス(株)さんの手を毎回わずらわせることになります。これでは、遠慮して得たい情報を得られないかもしれません。ところがインターネットのおかげで、米国と同等の情報を即座に入手できるのです。ほんとにすごいことです。

また私がプログラマのためにどうしてもプログラムの記事に偏ってしまいました。本当はアーティストや画像処理屋さんや流体屋さんなどの利用者側に立った記事の方がより多くの人にアピールするのかもしれません。いや待て、そんな普通の人がこの孤高のコンピュータ誌「SD」を読んだりするだろうか????難しいところです。

IRIXシリーズからIndyが出てから3年以上たったと思います。そろそろ、新しい名前を持った新人が登場してもおかしくない頃です。新機種は、いったいどんな意味を持った、どんな名前のマシーンになるのでしょうか。アレ、ところでIndyってどういう意味でしたっけ。ありがとうございました。


前にもどる