連載 / プログラマー入門 図 7 玉入れアプレットの実行結果 ( 正しし明 ) C : \htm1\basket2>app1etviewer basket2. html status : applet loaded status : applet initialized status : applet started 10586(usagi) + 10222 ( kame ) basket count = 20808 20808 が一致しています。どうやら、玉入れ籠の穴はふさがった リスト 6 ウサギとカメの玉入れのサンカレコード ( 誤った例 ) ようです。 次回は Java アラカルト Java のスレッドは十分堪能できたでしようか。次回は、 題して「 Java アラカルト」です。これまでとりあげてい なかった雑多な話題や、 Java 独自の特徴を紹介します。 ・ Animal ・ java のソース ( あらい・みちこ ASTEC) ・ Basket. java のソース import 」 ava ・ applet. * ; lmport 」 ava. avt . * ; import j ava. lang ・ * ; public class Basket extends App1et int balls ; Anima1 usagi = null ; An imal kame null ; public void init ( ) kame = nev Anima1 (this) ; usagi = new Anima1 (this) ; / * ウサギとカメを作る * / balls = 0 ; / * 玉入れ籠を空にする * / public void start() balls = ba11s + 1 ; / * ポールの数を 1 個増やす * / public void countup() / * Basket は 1 秒待つ * / kame . start ( ) ; usagi ・ start() ; / * ウサギとカメが玉入れを開始 * / implements Runnab1e Thread th = nev Thread(this) ; th. start() ; public void run() / * 1 秒待っ * / Thread. S1eeP(1000) ; usagi . finish() ; kame. finish() ; 90 System. out. println(usagi ・ count ( ) + ” (usagi) + ” / * ウサギとカメの玉数の合計 * / int sum = usagi ・ count ( ) 十 kame. count ( ) ; import 」 ava. lang. * ; public class Anima1 extends Thread { Basket parent ; int C ount ; boolea れ done ; public Anima1(Basket p) parent = p; public void run() done = false; count = 0 ; while (done) { COUIit 十十 ; parent . countup() ; public int count ( ) return count ; UNIX MAGAZINE 1996.6
プログラマ ー入門 荒井美千子 Java(5) ウサキとカメの駆けっこ 目か覚めたときは木の根元にいました。 82 ログラムの処理の流れ " と紹介しましたが、あっさりしす ころで、スレッド " ってなんでしよう ? 先月号では、、、プ 予告どおり、今回は Java のスレッドの話題です。と スレッドの正体 くれるでしよう。 回されるかもしれませんが、慣れてくればいい仕事をして になったり、と多芸多才 ( ? ) です。最初はなにかと振り は、気絶 (hangup) したり、昼寝 (sleep) したり、迷子 こともあります。ましてや、こオ功、らお話しするスレッド ときには、物語の登場人物だって思いどおりに動かない 説教を垂れることになってたはすなんだけど・ 「おかしいなあ。たしか話の筋では、ここでウサギさんに でたってもやってこないウサギさんを待ち続けていまし そのころ、山の項上にたどり着いたカメさんは、いつま ていても仕方ないので、ウサギさんは家へ帰ってしまいま ともあ日も暮れてきたし、いつまでもば一つとし るなら宝くしのはうがよかったのに」 「あれ一、こオ功ゞ当たって気絶してたのかあ。どうせ当た たんこぶまでできています。傍らには太い木の枝が どうも思い出せません。頭がすきすきすると思ったら、 「うーん、なんでこんなところで寝てたんだろう ? 」 ぎていて、いまひとつ雰囲気がつかめなかった方もいるで しよう。なかには、スレッドの概念は知っているけれど、 Java のスレッドは初めてなので、 ・プログラムのなかでどのように動くか なんの役に立つのか ・スレッドの使い方刎列 を知りたくて、このページを開いた方もいるかもしれませ んね。 Java のスレッドは、はかのオペレーティング・システ ムや言語のスレッドとかならすしも同しではありません。 そのため、 Java のスレッドの知識が、そのまま別の状況 にも応用できるとはかぎりません。 しかし、スレッドの難しさはプログラムの文法やライプ ラリの使い方にあるのではなく、スレッドの利用によって 必勺に並列プログラミングになってしまうところにあり ます 1 。その意味では、 Java でスレッドのプログラムを書 いた経験は、きっと違う竟でも活かぜるでしよう。 スレッドとは何か ? スレッドという用語を使うと、とても偉い 2 もののよう な感しがします。しかし、スレッド・プログラムはそれは ど特別なことではありません。関数を呼び出すことを、、関 数に胸を渡す " と表現しますが、この制御がスレッドに あたります。 1 2 こまで読んで、 そもそも並列処理をしたいがためにスレッドを使うのですから、並列プロ グラミングになるのは当然なのてすが・・・ 偉いには、、優れている " の意未と、困難である " の意床がありますが、 さて、あなたグ鴈いまどちらでしよう。 UNIX MAGAZINE 1996.6
プロクラマー入門ーの 連載 + kame . count() + " (kame) / * バスケットのなかの玉数 * / System. out . println(balls + " (basket) " ) ; import Java. lang. * ; lmport java. awt . * ; import java ・ applet . * ; ・ Basket ・ java のソース リスト 7 ウサギとカメの玉入れのサンカレコード ( 正しし咽 J) public class Basket extends App1et implements Runnab1e { int ba11s ; Anima1 usagl Anima1 kame Ⅱ u11 ; Ⅱ u11 ; public void init() / * ウサギとカメを作る * / usagi = new-Anima1(this) ; new Anima1 (this) ; kame public synchronized void countup ( ) / * ポールの数を 1 個増やす * / ba11s = balls + 1 ; public synchronized void reset ( ) / * ポールの数を 0 にする * / balls = 0 ; public VOid start() / * 玉入れ籠を空にする * / reset() ; / * ウサギとカメが玉入れを開始 * / usagi ・ start() ; kame. start() ; / * Basket は 1 秒待つ * / Thread th = new Thread(this) ; th. start(); public VOid run() / * 1 秒待つ * / Thread. S1eeP(1000) ; usagi . finish() ; kame . finish(); while (true) { if (!usagi. isA1ive() & & !kame. isA1ive()) { bre ak ; UNIX MAGAZINE 1996.6 91
となります ( 誌面の都合上、て折り返しています。以下 同様 ) 。つまり Applet のサプクラスとなり、 Runnable lnterface も継承するわけです。この、、動くアプレット ' は、すでに先月号に登場しているので見覚えがあるでしょ 連載 / プログラマー入門ー スレッド・プロクラミンクの例 スレッドの作り方カ紛かったところではた分かってい ない ? 大丈夫、もうすぐ具Ⅲ列カ咄てきます ) 、 Java でス レッドを利用するときの典型的な 3 つのパターンをみてみ / ヾターン 2 / ヾターン 1 ましよう。 トて処理を実行する パターン 3 : Thread の複数のサプクラスのオプジェク : アプレットを複数のスレッドで動かす . アフレットを 1 つのスレッドで動かす UNIX MAGAZINE 1996.6 プルコードの一部です。普通のアプレットの定義に、 などの場合には去も直てす。リスト 1 は、パターン 1 のサン たくない ・メインのアプレットの衄 ( キーポード入力 ) を阻害し したい ・アニメーションなどでとにかく簡単にアプレットを動か ターン 1 刎列です。 最初に紹介するのは、スレッドを 1 つだけ生成するパ アプレットを 1 つのスレッドで動かす ら始めてください。 的に合ったパターンのサンプルコードを真似するところか 3 つ紹介します。初めて Java のスレッドを使う方は、目 これらのパターンのソースコードの書き方の例を、次に したクラスの関数として作ります。 を複数作ります。それぞれのスレッドの処理は、べースに パターン 3 は、任意のクラスをベースにしたスレッド ドの処理をアプレットクラスの関数として作ります。 スにしたスレッドを複数作ります。このガ去では、スレッ パターン 2 は、アプレットクラスのオプジェクトをベー ものです。たいていの処理はこの去で - ト分でしよう。 パターン 1 は、スレッドが 1 つだけのもっとも簡単な リスト 1 アプレットを 1 つのスレッドて動かすコード lmport j ava. applet . * ; xmport 」 ava ・ lang. * ; public class Simp1eAction extends Applet lmplements Runnab1e ・・・クラス定義の内容 public VOid run() アプレットの動作 ・ RunnabIe lnterface を承している ・ public void run() 関数を定義している の 2 点が追加されています。これだけで、あーら不思言 あなたの Java プログラムがたちまち自重加勺に動きだしま す。 最初刎列なので、サンプルコードを詳しく説明していき ましよう。 地貢の、 import 」 ava ・ applet . * ; import 」 ava. lang. * ; は、使用するパッケージ ( Java のクラスライプラリ ) の 指定です。 java ・ applet. *" は Applet の / ヾッケージ Java. lang. *' は Runnable のノヾッケージ です。 public class Simp1eAction extends App1et lmplements Runnab1e は、すでに説明したアプレットの宣言です。動くアプレッ トを定義しているので、 lmplements Runnable" の宣 public void start ( ) / * スレッドの生成 * / Thread th = new Thread (this) ; / * スレッドの開始 * / th. start() ; 言もあります。 85
連載 / プログラマー入門ーの 図 2 里档てとスレッド アプレット開始 ユーザーの入力 1. Thread のサプクラスにする 2. Runnable lnterface を使う 1 の Thread はスレッドを実現する Java のクラスで メインのスレッド ( ユーザーの入力を す。 Thread のサプクラスのインスタンス ( オプジェクト ) 受け取るスレッド ) を作って起動すれば、新たなスレッドとして動き始めま す。 2 の lnterface を使う方法は、 Java 特有の手法です。 スレッドの終了 言士様をシンフ。ルにするため、 Java には多重継承があ りません。しかし、多重継承かできないと不便なことがあ 計算用スレッドは、結果か得られるまでひたすら計算に ります。 ~ 頁する 先月号で説明したように、 のように彳難リ分担すれば、シングルスレッドのときのよう アプレットは Applet クラスのサプクラスとして定義す に、やりかけの仕事を中断する必要はありません。 る さらにマルチスレッドなら、個々の新直の言 t 算を別々の という約束事があるので、アプレットの親クラスは Ap ー スレッドでおこない、、、入力された数値は即座に階乗を計 plet です。ところが、動くアプレットを作るためには、 算し始める " の牛も簡単にクリアできます。これをシン Applet と Thread の両方の機能を継承する必要があり グルスレッドで実現しようとすると・・ 、考えただけで ます。 も面倒そう。 しかし、思い出してください。 Java では多重継承の機 たとえは・、 1 人で風呂に水を満たしながら料理をしたと 能がないので、 AppIet と Thread の両方を継承すること しましよう。うまく見張らないと水を溢れさせたり、料理 はできません。 を焦がしてしまいます。でも、それぞれを別の人がやれは このような状況に対処するための手段が lnterface で うまく鮹夬できますね。 す。 Thread クラスを継承する代わりに Thread と似た 図 2 は、この処理をマルチスレッドで実現した場合のス 機能をもつ RunnabIe lnterface を指定すれば、動くオ レッドの人生を示しています。一番上のキ勦ワプレットの プジェクトを作ることができます。 メインのスレッドで、アプレットか開始してから停止する lnterface はいわば制限付きの継承です。では、使い方 までを表します。ューザーの入力はこのメインスレッドで から説明しましよう。 処理されます。 メインスレッドから枝分かれしたードイ則の 3 本の線は、階 class class-narne 乗を計算するスレッドを表しています。階乗の言 1 算にかか る日判りはまちまちなので、スレッドの生イ判判りにはばらっ きがあります。これらのスレッドは計算結果を表示して停 止します。 Java でスレッドを扱うには レ ス 計算をおこなう implements をれ / 佖 ce - れ 0 打と e のように interface-name lnterface をイ吏うと宣言 しておいて、約束事で決まっている関数を用意すれは、動 くクラスを作ることができます。 そこで、動くアプレットを作るには、 class class-name extends App1et implements Runnab1e スレッドの利用法が分かったところで、次は Java のス レッドの使用法に移りましよう。アプレットのなかでス レッドを生成するには、おおまかに 2 通りのガ去があり ます。 84 UNIX MAGAZINE 1996.6
NEWS 142SPECrate-fp95 (2CPU 時 ) キーポード、マウス ) 、 624 万 3 , 000 円 ( 2 アップグレード対応予定など。 3 ) キャッシュ ( 命令 / データ ) は IMB / 1 CPU 、同 ) 。 外形寸法 (HXWXD) は 44.5X27.3x 日立製作所 (Tel 03 ー 3763 ー 2411 ) も、 50.8cm 、重量は 36kgo MB 4 ) 主記慮は 32MB ( 最大 IGB) 、、 HITACHI 9000V シリーズ〃「 VQ210 価格は 474 万 2 , 000 円 (ICPU 、主記憶 5 ) HD は 2GB ( 最大 8GB) XC 」として販売を開始した。 J210XC と 128MB 、 HD IGB 、 17inch カラーモニ の違いは、主記憶が 128MB ( 最大 IGB) 、 6 ) I/F は、 IEEE 802.3 LAN 、 SCSI—2 ター、キーポード、マウス、 HP—UX 使 (Single Ended/Fast Wide) x 各 1 、 RS HD が IGB ( 最大 8GB ) 、 OS は HP—UX 用権付き ) から。 232CX2 、セントロニクス、オーディオ 9.0 / 10. x 、 64bit CPU の PA ー 8000 への OS は HP—UX 9.05 以上。 ◆おもな仕様 外形寸法 (H xWxD) は 44.5X 24.6X 54cm 、重量は 36kgo 価格は 439 万円 ( ICPU 、 主記憶 64 MB 、 HD2GB 、 20inch カラーモニター VQ 21 OXC J210XC PA -7200 ( 120MHz ) IMB/IMB ( 命令 / データ ) 183.9 / 4.64 305.7 / 8.3 82.8 / 142 (2CPU) 32MB(1GB) 128MB(1GB) 2GB(8GB) 1GB(8GB) IEEE 802.3(Ethernet) 、 RS232C X 2 、 SCSI-2(SingIe Ended/Fast Wide) >< 各 1 、 セントロニクス、オーディオ HP-UX 9.05 以上 HP-UX 9.0 / 10. x 外形寸法 (H x W x D) 44.5 X 24.6 X 54crn 44.5 X 27.3 X 50.8crn 重量 36kg C P U 最大 CPU 数 キャッシュ S PECint92/95 SPECfp92/95 SPECrate-int95/fp95 主記憶 ( 最大 ) H D ( 最大 ) 2 ・ SunS0ft OS は、日本語 SoIaris 1.1.1 (JLE 1.1.3 ー U 1 ) 以上、または日本語 Solaris 2.3 以上。 インストールに CD—ROM ドライプが必 須。 日本サン・ソフト (Tel 03 ー 5717 ー 5010 ) ドの自動並列化、 GUI 構築ツールでの 価格は、 VisuaI WorkShop for C 十十 は、ソフトウェア統合開発ツール「 Sun- Windows 95 サポート、高速ライプラリ が 701 , 000 円、 WorkShop for C が 521 , Soft WorkShop V2.0 」 ( 日本語版 ) の販 の提供。 000 円、 Performance WorkShop for 売を開始した。 動作環境は、 SPARC システムと互換 Fortran 90 が 105 万円、 WorkShop for おもな特徴は以下のとおり。 機。主記憶 32MB 以上、スワップ領域 FORTRAN 77 が 755 , 000 円、 SPARC- コンパイラの最適化機能の強化、 C コー 64MB 以上、ディスク領域 100MB 以上。 works/Visual XP が 116 , 000 円。 ソースレベノレ・デノヾッガ、 Java のクラス Java/Web アフリケーション開発用ソフトウェア 依存関係および相互関係のグラフィック ス表示、 Java 用パイトコード・コンパイ ラ / ランタイム・インタープリタ、 Java ア WorI<ShopV2.O 日本語版 ■ SGI チスレッド Java コード用グラフィカル・ 日本シリコングラフィックス (TeI 03 ー 5488 ー 1834 ) は、 Java 、 Web べースの アプリケーション開発用ソフトウェア 「 Cosmo Code 」の販売を開始した。 おもな特徴は以下のとおり。 VRML 2.0 に対応。 3D 空間でオプジ ェクトを動作させたり、 Java アプリケー ションの開発が可能。開発者用のツール として、ソースコード・アナライザ、マル 2 UNIX MAGAZINE 1996.6
連載 / プログラマー入門ーの リスト 5 Thread のサプクラスを手堋したプログラム ウサギを走らせる処理を実行する public void run() public class Usagi extends Thread { import j ava ・ lang ・ * ; Usagi ・ java のソース カメを走らせる処理を実行する public void run() public class Kame extends Thread { import j ava ・ lang ・ * ; Kame. java のソース usagi ・ start() ; Usagi usagi = new Usagi(this) ; } else if ( u が押された ) { kame . start() ; Kame kame = new Kame (this) ; if ( k が押された ) { public boolean KeyDown(Event evt , int key) public class RpnAnima1s extends App1et { import 」 ava. lang. * ; import Java ・ applet . * ; RunAnimals ・ java のソース 終了する前に、次の、、 k " か胛されると、さらにもう 1 つ します。このサンフ。ルでは、 Kame オプジェクトの処理が run() か実行さ run() の処理カ鮗るとスレッドカ止 があります。 start() のなかから、 Kame オプジェクトの れはちょうど、スレッドを生成して起重丿けるのと同し効果 Kame オプジェクトを生成して start() て起動します。 キーポードから k が入力されたとき、アプレットは のサンフ。ルコードです。 スと Usagi クラスのオプジェクトを管理するアプレット リスト 5 は、 Thread のサプクラスである Kame クラ 88 図 5 玉入れアプレットの実行結果 ( 誤った例 ) C : \html\basketl>appletviewer basketl. html status : applet loaded status : applet initialized status: applet started 55415(usagi) + 56096 ( kame ) basket co ⅡⅡ t = 99356 Kame オプジェクトが生成されます。 Usagi オプジェクトは、キーポードから、、 u " が入力さ れたときに生成されますが、それ以外は Kame オプジェ クトと同様です。 この場合、アプレット以外のクラスを作らなくてはなら ないので、簡単な処理のためにもったいないほどの手間が かかります。しかし、個々のスレッドで異なった処理や複 雑な処理を実行したいのなら、この去カ。ったりです。 マルチスレッドと同期 マルチスレッド・プログラムを目指すには、もう 1 つ慮 えておいてほしいことがあります。マルチスレッドでは、 個々のスレッドは非同期に ( 足並みを揃えないで ) 重川乍し ます。ときにはこれが、タイミングにかかわるトラブルの 原因になることがあります。次に、非同期の失敗例と、非 期を正しく処理した例の 2 つを紹介します。 ウサギとカメの玉入れ 運動会の季節です。ウサギとカメは今度は玉入れをしま した。玉入れの籠が 1 つしかなかったので、同し籠に玉 を入入れた玉の数を自己申告することにしました。カ メとウサギが正直者なら、籠のなかの数と自己申告された 数の合言 t が -- 一致するはすです。 この状態をプログラムにしたのか末尾のリスト 6 です。 Animal クラスは run() 関数のループのなかで自分で数を 数えながら、 Basket のカウンタも増やしていきます。処 理を開始してからおよそ 1 を ) と、各 Animal オプジェ クトの finish() 関数か呼び出さスレッドの処理を中 止します。 本来なら、 run() を終了した点で、 AnimaI のそれぞ れのオプジェクトか数えた数 (count 刎の合計と籠の なかの玉の数 (balls 変数の価は一致するはすです。と ころが、実際には図 5 の表示のように、なぜか両者は一致 しません。 111511 UNIX MAGAZINE 1996.6
図 1 連載 / プログラマー入門ー プロセス川のスレッド支流 スレッ スレッド支流 プロセス川 「ほいしや、普通のプログラムだって制御があるんだか ら、スレッド・プログラムじゃないの ? 」 と考えたあなたは偉い ! 普通のプログラムだって、 1 つの処理の流れからなる ( シングル ) スレッド・プログラムです。 プロセスとスレッド 「制御の流れがスレッドなら、スレッドってプロセスの ことじゃないか」 と考えたあなたはちょっと惜しい ! 、処理の流れ " という定義では、たしかにプロセスとスレ ッドを区別できませんが、プロセスを並列実行できる処理 の流れに細分化したのがスレッドです。 プロセスとスレッドの関係は、川のようなものです。 複数の支充 ( とべ充 ) からなる川を想像してください ( 図 1 ) 。川本が 1 つのプロセスだとすると、それぞれの支充 がスレッドです。 上充のどこかで 2 つに分かれた支充 ( とべ充 ) は、同し 川の一部でもそれぞれ独立して流れます。同様に、プロセ ス中のスレッドはそれぞオリ虫立して動きます。ときには、 支充が途中てオ占れてしまうことがあるように、プロセスの 途中で終了するスレッドもあります。 スレッドはなんの役に立つか ? スレッドの最大のご利益は、並列里ができることで しよう。しかし、なせプログラムに並列処理をさせたいの でしよう ? それは、 ・複数の CPU を利用して全体の処理嗤を矢噌したい ・ 1 つのプログラムに並行して実行したはうがよいものが 含まれている UNIX MAGAZINE 1996.6 からです。複数の CPU ( 中爽寅算装置 ) を備えたコンピ ュータでは、スレッド単位で CPU を割り当てるので、シ ングルスレッドよりもマルチスレッドにしたほうカワ。ログ ラム全体の処理嗤田カくなる可能性があります。しかし 普通は、このようなことはオペレーティング・システム屋 さんが意識することであって、 Java プログラマーが気に することではありません。 あなたが作った Java のページを見ている人のコンピ ュータには、 CPU が 1 個しかないかもしれません。贅沢 にも CPU が 2 個あったとしても、 Web プラウザなど、 ほかのプロセスが一方の CPU を占有してしまい、けっ きよくあなたのプログラムのスレッドは 1 個の CPU を 順番に使うことになるかもしれません。 CPU を複数備えたコンピュータ上で、限られたアプリ ケーションだけを起動し、そのうえで Java を実行する のなら未があるでしようが、あまり現実的ではないです ね。 しかし、複数士事を同時にこなしたいときには、マル チスレッドの本領が発揮されます。同しような独立した処 理を、不定期なタイミング ( たとえば、キーポードカ甘甲さ れたとき ) でおこないたいときには、スレッドにスケジュ ーリングをイモをるのカ立一番です。 たとえば、次のような条件で、ユーザーが次々と入力す るたくさんの数値の階乗を計算するプログラムを考えてみ ましよう。 ・ユーザーの入力はなるべくすみやかに受け付ける ・入力された新直は即座に階乗を計算し始める 言 1 算結果を即座に表示する シングルスレッドのプログラムが、ユーサーの入力をス ムーズに受け付けるためには、 階乗の言算中にときどき入力を調べる ・入力があったら階乗の言 t 算途中で割り込む のどちらかのガ去で対処することになります。いすれにし ろ、複雑なプログラムになりそうでうんざりです。 しかし、階乗の引算とユーサーの入力を別々のスレッド ( マルチスレッド ) にすれば、問題は一気に角夬します。 ・入力用スレッドは、とにかく入力がきたかどうかを見 張る 83
連載 / プログラマー入門ー 92 return count ; public int count ( ) setdone(false) ; public void finish() parent . countup ( ) ; count 十十 ; while (isdone()) { count = 0 ; setdone(true) ; public void run() done = d; synchronized void setdone (boolean d) return done ; synchronized boolean isdone ( ) parent = p , public Anima1 (Basket p) boolean done; count ; int Basket parent ; public class AnimaI extends Thread { import 」 ava. lang. * ; ・ Animal. java のソース kame ・ stop() ; usagi ・ stop() ; / * ウサギとカメを停止する * / public void stop() { System. out . println(balls + " (basket) " ) ; / * パスケットのなかの玉数 * / ”十 sum) ; + kame . count ( ) + " (kame) System. out. println(usagi. count() + " (usagi) + " / * ウサギとカメの玉数の合計 * / int sum usagi ・ count() + kame. count() ; UNIX MAGAZINE 1996.6
OLE.COM と CORBA by Michael A. Food メ ■ f 「 om LJNIX REVIEW オプジェクトやオプジェクト・システムの世界で重量 級選手といえば、 Microsoft の COM(Component Ob- ject Model) と OMG (Object Management Group 、 マサチューセッツ州フラミンコつの CORBA(Common Object Request Broker Architecture) である。しか し、両モデルを直接上交することはできない。というのも、 CORBA はたんに f 士様だが、 COM は実装を含むからだ。 つまり、 CORBA はオプジェクト・モテルであり、 COM は独自のオプジェクト・モデルをもつオプジェクト・シス テムなのである。 現在のオプジェクト・システムの多くは、 CORBA オ プジェクト・モデルをベースにしている。 CORBA 準オ プジェクト・システムの ORB(Object Request Broker) には、 DEC の ObjectBroker 、 Hewlett-Packard の ORB 十、 IBM の SOM(System Object Model) 、 lona Technologies の Orbix などがある。このような製品の多 様生は、オープンシステム市場の利点ではあるが ( 1 つの 標準からさまざまな製品が生まそれらは互いに最良の ものを顧客に提供しようとする ) 、 COM と CORBA と の直接の上交をますます難しくしている。 OLE(Object Linking and Embedding) 用のオプジ ェクト・モデルと実装である COM は、デスクトップ・ア プリケーションとして使用さソフトウェア・コンポー ネント相々漣用のバイナリ標準を提供する。 ORB は、大 規模分散システムを構築するためのインフラストラクチャ として利用されている。 Microsoft は、企業クラスの分散 システム向けに COM の分散バージョンの開発を進めて いる。一方で、 IBM は Apple と協力し、デスクトップ・ コンポーネントモデルである OpenDoc のべースに SOM UNIX MAGAZINE 1996.6 を利用する竹喋を進めている。 ■ オプジェクト・モデルの相違 ます、 COM と CORBA はオプジェクト・モデルが 異なる。オプジェクト・モデルは、所定のシステムにおけ るオプジェクトのアーキテクチャ定義である。各オプジェ クト・システムには、オプジェクトか従う固有のアーキ テクチャ規則が必要である。たとえば C 十十プログラマー であれは、クラスが多冊陸承やイ反想方式などをサポートす る C 十十オプジェクト・モテルにれ親しんでいることだ ろう。 C 十十で書かれたクラス定義とコードが C 十十オプ ジェクト・モデルに従っていなけれは、コンパイラは工 ラーを出す。 SmaIItaIk 、 Java 、 Objective C などのオ プジェクト・フログラミング言語にもオプジェクト・モ デルがある (NeXT の PDO 、 OracIe のオプジェクト・ データベース Oracle 8 や、 Lotus Notes などのオプジェ クト・システムも同様である ) 。つまり、あらゆるオプジェ クト環竟がオプジェクト・モデルをもっているのだ。 COM と CORBA はともに、関数とメソッドの集合 であるインターフェイスを利用しており、これを通してプ ログラマーはオプジェクトを操作する。これは、クライア ントとオプジェクトが通信するための取決めである。実際 のところ、プログラマーはオプジェクトそのものにではな く、インターフェイスにアクセスする。インターフェイ スという概念は新しいものではなく、ごく去も丘では Sun Microsystems の Java にもみられる。継承 ( つまり実 装の再利用 ) のみをサポートする、強く型づけされたオプ ジェクト環竟においては、インターフェイスの念は大き な障害となる。 C 十十のようなオプジェクト竟は、一リ 用の面でクラスライプラリとフレームワークに依存する。 135