Telescriptは、 General Magic社がMagic Capシステムの一部として開発した、エージェント指向のプログラミング言語です。Telescriptプログラムは、High Telescriptと呼ばれる改良版C言語ライクな構文を使用し、実行時にはLow Telescriptと呼ばれるスタックベースの言語にコンパイルされました。Low Telescriptは、ホストコンピュータ上の仮想マシンインタプリタ、すなわち「Telescriptエンジン」内で動作しました。
Telescript の基本モデルはJavaと似ていますが、アプリケーションの実行場所が主に異なります。Java は、Java アプリケーションをあらゆるプラットフォームにダウンロードしてローカルで実行できるように設計されました。Telescript は基本的にこの逆で、機能が限られたエンドユーザー機器が Telescript プログラムをサーバーにアップロードして、サーバーの機能を活用できるようにしました。Telescript は実行中のプログラムを移行することも可能でした。この言語には、プログラムのコードとシリアル化された状態をマーシャリングし、別の Telescript エンジン (デバイスまたはサーバー上) に転送して実行を継続し、最終的に元のクライアントまたはサーバー デバイスに出力を返す機能が含まれていました。
General Magicは元々 Apple Inc.の社内チームとして開発され、1990年にスピンオフした。1992年に同社がメディアで注目を集め始めると、Appleはタブレットコンピュータ「Newton」で同じ市場に参入することを決定した。General Magicは市場で独自の地位を確立することができず、Telescriptサービスはモバイルコンピューティングとは無関係の新製品に取って代わられ、間もなく廃止された。
1990年、マーク・ポラットは当時のアップルCEOジョン・スカリーに対し、コンピューティングの未来はデスクトップパーソナルコンピュータではなく、コンピューティング能力、通信システム、ネットワークアクセス可能なサーバー上のデータを組み合わせたはるかに小型のポータブルデバイスにあると説得した。[ 1 ]彼は、ポータブルコンピュータは常に接続先のマシンよりも処理能力が低いことを指摘し、それを設計の一部にすべきだと提案した。デスクトップシステムのタスクを実行できるポータブルコンピュータを構築しようとするのではなく、ポータブルデバイスはサーバーの計算能力を目に見えない形で利用して同様の結果を生み出すべきだというのである。[ 2 ] [ 3 ]
スカリーは、ポラットが「Pocket Crystal」というコードネームでコンセプトの研究を開始することを許可した。初期チームの主要メンバーはポラット、そして有名なMacintosh開発者のビル・アトキンソンとアンディ・ヘルツフェルドだった。チームはすぐに上層部から無視され、リソースの確保に苦労し続けた。彼らは再びスカリーに、Pocket Crystalを別会社としてスピンオフするというアイデアを持ちかけた。スカリーはこれに同意し、ハードウェア部門に新たなパートナーを迎えるというアイデアにも同意した。新会社General Magic(GM)は1990年5月に設立され、Apple、Sony、Motorolaがそれぞれ10%の株式を保有した。同社にはすぐに、ジョアンナ・ホフマン、スーザン・ケア、ダン・ウィンクラー、ブルース・リーク、フィル・ゴールドマンなど、他のMacintosh出身者が加わった。[ 1 ]
1992年までに、GMはソニー、モトローラ、松下電器産業、フィリップス、ブリティッシュ・テレコム、AT&Tコーポレーションなど、マジックキャップ環境で作業する多数の企業と開発契約を締結した。これにより、かなりの報道の「話題」が生まれた。[ 3 ]アップルはこの頃、フルサイズのiPadにより近い、より大型のハンドヘルドタブレット型コンピュータの設計であるニュートンプロジェクトを開始していた。ゼネラルマジックの報道での成功を受けて、アップルはニュートンをまさに同じ市場に位置づけ直し、1993年に発売を急いだ。アップルはまた、ゼネラルマジックの株式を売却し、ゼネラルマジックを訴えた。ゼネラルマジックのパートナーは1994年までハードウェアを発売しなかったが、その頃にはニュートンがパーソナルデジタルアシスタント (PDA)のあるべき姿をほぼ定義しており、PDAシステムは手書き認識機能で評価されるようになっていた。マジックキャップはポイントアンドクリックインターフェースだった(ハイパーカードや現代のiOSに似ている)。[ 2 ]
1995 年までに、同社はかつての面影を失い、元の開発者のほとんどが去ってしまった。1996 年、スティーブ・マークマンが後任として雇われ、彼はケビン・スラースを雇って会社を新しい方向に導かせた。新しいチームは、電話ベースのパーソナルアシスタントシステムである Portico を開発し、これは現在OnStarの基盤として存続している。元のハンドヘルドグループは 1998 年に DataRover Mobile Systems Incorporated としてスピンオフし、後に 2000 年に Icras に改名され[ 4 ] 、 2001 年に閉鎖されるまで、いくつかの垂直市場にサービスを提供した。 [ 5 ]元の会社の残骸は 2004 年に清算された。[ 3 ]
Telescript は、エージェントと呼ばれる小さなプログラムがプレイスと呼ばれるコンピューティング サービスとやり取りするという概念に基づいて設計されており、これらのサービスはすべて、Telescript クラウドと呼ばれるものをホストする 1 つ以上のサーバーのクラスタ上で実行されます。ユーザーの携帯端末は、機能が制限されているものの、そのようなプレイスの 1 つでした。このモデルでは、ほとんどの情報とサービスは、AT&T などの通信事業者がホストするより大規模なサーバー コンピュータ上で実行されるプレイスによって提供されると想定されていました。初期の文書でも、これをクラウドで実行していると表現しています。[ 1 ]ユーザー向けのプログラムは、このようなエージェントの複数で構成され、ローカルで、プロバイダーのホスト上で実行される場合もあれば、サードパーティ サーバーに転送される場合もあります。通信を調整するために、Telescript には、ユーザーを一意に識別するテレネームと、デバイスがネットワーク間を移動してもデバイスを識別するテレアドレスの概念も含まれていました。 [ 6 ]
例えば、ユーザーが購入したい新しいバーベキューグリルの価格を調べるよう依頼するショッピングアプリケーションを考えてみましょう。従来のクライアント/サーバーモデルでは、アプリケーションは複数のクエリを作成し、複数のサービスに送信し、結果を集めて表示します。Telescriptモデルでは、アプリケーションは代わりに、リクエストからのデータで構成された新しいエージェントを作成し、そのエージェントに名前と住所を付与し、処理のためにサーバー上のストアに送信します。サーバーはリクエストを直接処理することも、エージェントを実際のベンダーの場所など他の場所に渡してさらに処理することもできます。結果はエージェントの内部データフィールドに格納され、ネットワーク経由でユーザーのデバイスに送り返されるか、結果データのみを運ぶ新しい「メッセンジャー」エージェントが生成され、ネットワークデータ転送を最小限に抑えるために送り返されます。[ 7 ]
このモデルは、対話型プログラムの場合のデータ交換の方法においても、従来のソリューションとは異なります。たとえば、ユーザーが以前の検索で見つけたバーベキューグリルのいずれかを購入することを選択した場合、従来のシステムでは、注文フォームへの入力と支払いの確認は、ユーザーのデバイスとリモートサーバー間の直接通信によって行われ、プロセス全体を通して「ライブ」通信チャネルが必要になります。Telescriptモデルでは、購入を完了するために必要な情報を持つ新しいエージェントがベンダーの店舗に送信され、店舗またはベンダーのエージェントとやり取りした後、成功または失敗を返して戻ってきます。主な通信はリモートサーバー上のエージェントと店舗の間で行われるため、ネットワーク経由の通信はプロセスの開始時と終了時のみ必要となります。[ 8 ]
Telescript はオブジェクト指向 (OO) であり、オブジェクトの状態や通信を記述するために、あまり一般的ではない用語がいくつか使用されていました。属性は、他の言語でインスタンス変数やフィールドと呼ばれるものに対応します。メソッド呼び出しはリクエストと呼ばれ、メソッドの実装を実行する行為は実行と呼ばれていました。このような呼び出しはすべて、成功または失敗を示すメッセージで応答し、リクエスト元のオブジェクトは、必要に応じてそれらを捕捉して応答することができました。メソッド呼び出しへのデータの受け渡し方法に関するヒントは制約と呼ばれ、一般的な「参照渡し」や「値渡し」などを網羅していました。[ 9 ]
Telescriptは、データのライフサイクルに関して言えば、基本的にステートレスでした。プログラム内のすべてのデータ(インスタンス変数とローカル変数の両方)は常にシリアル化されていました。エージェントはいつでも起動または中断でき、状態を失うことはありませんでした。この同じメカニズムにより、エージェントはホスト間で容易に通信することができました。
Telescript の制御とレイアウトは C 言語に影響を受けていますが、その正確な構文はかなり異なっていました。明らかな違いの 1 つは、定義レベルで C スタイルの波括弧を丸括弧に置き換え、論理およびフロー制御ステートメント内のステートメントをグループ化するために波括弧を残し、名前とその定義を区切るためにコロンを使用することでした。次のコードは、Pie型のオブジェクトのインターフェースを定義します。[ 10 ] [ N 1 ]
パイ: interface(Object) = ( 公共 名前: 文字列; initialize: op(name: String); );
キーワードの使用に注目してくださいop。これは、他の言語で見られるfunctionまたはに相当しますsub。 Pie の実装は 1 つ以上のオブジェクトで使用でき、 Visual Basic .NETの構造と同様の方法でclassに整理できます。はヘッダー ファイルをインポートするために使用されますが、インポートは に対してローカルであり、ファイル全体に対してではありません。[ 11 ]modulesnamespace#includemodules
Telescript のエージェントとプレイスの概念は、Process のサブクラスである Agent と Place という 2 つのクラスをサブクラス化することによって簡単に呼び出すことができました。コードの明瞭性を高めるために、これら 2 つのクラスを 1 つのファイルに配置したり、単一のモジュールにまとめたりすることもできます。次のコードは、パイを販売するストアを実装するために必要なエージェントを定義します。[ 12 ]
PieStoreModule: モジュール = ( #include "pie.i" PieBuyer: class(Agent) = ( 公共 ライブ: スポンサー付き op() = { *.go(*.destination); myPie = place@PieSeller.sellPie(); *.go(*.originPlace); }; ); PieSeller: class(Place) = ( 公共 sellPie: op() Pie = { aPie: パイ | なし; aPie = *.getPieFromStock; if (aPie = nil) { PieBuyer(*.distributorTicket, Permit(nil)); aPie = *.waitForPie(); パイを返す; }; }; ); );エージェントである PieBuyer オブジェクトには、liveすべてのエージェントで使用される標準の起動メソッドである という単一のメソッドが含まれています。[ 13 ] PieBuyer を作成して呼び出すだけで、ほとんどのオブジェクト指向言語で見られる操作liveと同様の方法で メソッドが呼び出されますnewが、このメソッドはセットアップ後に呼び出されます。* は、オブジェクト自体、この場合は PieBuyer エージェントを参照する、より一般的に実装されているselfまたはの代わりに使用されますMe。このコードは基本的に、オブジェクトが作成されると、作成時に指定された場所 (*.destination) にオブジェクト自身 (*.go) を送信する必要があることを示しています。そこに到着したら、対応する場所オブジェクト (この場合は PieSeller) に sellPie を指示する必要があります。そのコマンドが完了すると、エージェントは元の場所に戻ります。呼び出し元のアプリケーションは、myPie 変数を調べることで結果を調べることができます。[ 12 ]
PieSeller オブジェクト (Place) には、メソッド が 1 つだけ含まれていますsellPie。このメソッドは、aPie というローカル変数を定義し、Pie オブジェクト、またはパイがない場合は「nothing」とします。次に、独自の getPieFromStock メソッド (ここでは示されていません) を呼び出して aPie に値を設定しようとし、そのメソッドが値を返したかどうかを確認します。たとえば、在庫が空の場合など、成功しなかった場合は、独自の新しい PieBuyer オブジェクトを作成し、そのリクエストを別のショップに送信して、応答を待ちます。そのショップはリクエストを別のショップに転送する可能性があり、これを繰り返します。この一連のイベントが、パイが手に入ったか失敗したかにかかわらず終了すると、PieSeller プレイスは最終的に呼び出し元の PieBuyer にそれを返します。[ 12 ]
オブジェクトは通常、それを作成した場所が「所有」します。所有権は、機能とセキュリティ設定も付与します。言語は、own {}構文を通じてオブジェクトの所有権を取得できます。または、この場合、sponsoredキーワードを使用して、実行場所の所有権内で実行する必要があることを示します。これは、たとえば、エージェントに在庫内の在庫を表示する機能(通常は非公開の値)を付与するために使用できます。を使用することは、sponsoredコードをown {}ブロック内に配置するのとまったく同じ結果になりますが、呼び出し元で実行できます。[ 14 ]
SetTelescriptには、、、、、ListなどDictionary、いくつかの組み込みコレクション型が含まれています。Collection最後のは基本的にテキストインデックス付きのリスト(辞書の半分)です。Telescriptでよくあるエラーの原因の1つは、コレクション全体としてはエージェントに渡せるものの、その中の個々のアイテムは場所が所有していたことです。そのため、を使用するとreturn MyCollection[someIndex];、ユーザーのデバイスにはnullとして返されます。解決策は、追加の構文である、DictOwnedおよびColOwnedヒントを使用することでした。これにより、返された値の所有権が戻り時に変更され、元の場所に戻るときに結果にシリアル化されます。[ 15 ]
サブクラスはフレーバーとして知られていました。上記の PieBuyer クラスはAgent のフレーバーです。Telescript にはミックスイン クラスの概念も含まれており、他のクラスに含めることができるコードのみを含むクラスを作成することで、多重継承に似た機能を提供していました。ミックスインはフレーバーではありませんでした。[ 16 ]
多くの現代的なオブジェクト指向言語と同様に、Telescript はインターフェースと実装を分離し、.iインターフェース用のファイルと.t実装用のファイル (t は "t"elescript の t ) に配置しました。珍しいことに、この言語は.d、複数の.iファイルを結合する 3 番目のタイプのファイルも定義しました。[ 17 ]コンパイルされたコードは ファイルに配置され.s、ファイル内のリンカ命令によって制御されました.l。[ 18 ]外部アプリケーション フレームワークにより、 C++コードを Telescript から呼び出すことができました。 [ 19 ]
引用文献
参考文献