SK8 (「スケイト」と発音)は、1988年から1997年までAppleのAdvanced Technology Groupで開発されていたマルチメディアオーサリング環境である。これは「ステロイドを使ったHyperCard」 と説明され、HyperCardのHyperTalkプログラミング言語のバージョンと最新のオブジェクト指向アプリケーションプラットフォームを組み合わせたものを目指した。プロジェクトの目標は、クリエイティブデザイナが複雑なスタンドアロンアプリケーションを作成できるようにすることだった。SK8の主なコンポーネントは、オブジェクトシステム、付属のプログラミング言語、グラフィックスおよびコンポーネントのライブラリ、統合開発環境であるProject Builderで構成されている。

SK8はその歴史の大半において研究プロジェクトに留まり、AppleScriptなど他のAppleのプロジェクトに影響を与え、またプロトタイピングプラットフォームとしても使用された。1993年頃、Apple製品部門からSK8ランタイムのリリースに向けたチームが任命されたが、Macの性能の限界とPowerPCチップへの移行により、このような大規模なプロジェクトは困難なものとなった。当初の構想の大部分が完成したが、Mac OSの一部としてのリリースが容易でなかったため、1996 - 1997年に活発な開発は終了し、1997年にプロジェクト全体のMacintosh Common Lispソースコードが公開された。

## 歴史

SK8プロジェクトは、1987年にAppleに入社したRuben Kleimanによって作成された。彼は、柔軟でオブジェクト指向のユーザインターフェイスとマルチメディア開発環境を開発するためにAppleに入社した。プロジェクト名は、彼がスケイトボードに興味を持っていたことに由来している。偶然にも、この時点で、ダイレクトマニピュレーションインターフェイスとスクリプト言語を備えたHyperCardが出荷されようとしていた。 HyperCardは単純なアプリケーションには最適だが、限られた相互作用モデル(カードの「スタック」)を使用していたため、潜在的な適用性が制限されていた。 SK8は、これらの利点をより幅広いプログラミングの役割に拡張しようとした。

後にSK8となる初期の研究は、ビジュアルプログラミングよりもインフラストラクチャーに重点を置いた。クライマンが最初に取り組んだのは、動的なプロトタイプベースのオブジェクトシステム、MacFramesで、推論エンジンのプラグインを備えるフレーム/オブジェクトシステムだった。MacFramesは、環境設定により、IntelliCorpのKEEを含む多種多様なオブジェクトシステムのエミュレーションに使用された。この研究は、Appleで実際のアプリケーションやプロトタイプを開発しているユーザと共同で行われ、SK8で使用されているオブジェクトモデルを生み出した。 MacFramesは、Appleに買収されてMacintosh Common Lispになった、Coral Lispで開発された。

当時のMacintoshには、一般化されたプロセス間通信(IPC)システムがなかった。Kleimanは、Mac用のIPC initを作成して、MacFrameが他のプロセス(特にHyperCard)と通信できるようにした。これにより、HyperCardをMacFrameのビジュアルプログラミングフロントエンドとして使用できるようになった。 MacFramesのもう1つの目標は、分散処理をオブジェクトシステムに組み込むことだった。RPC APIを使用する代わりに、オブジェクトのプロパティに目的の値を設定し、結果のコールバックを行うだけであった。MacFramesは、自動化されたブラックボックステストシステムを作成するためにAppleのQAグループによって使用された。

SK8 Project Builderは、インタラクティブなコントロールや一般的ではあるが非侵襲的な接着を構築するためのツールを含む、豊富なダイレクトマニピュレーションツールのセットを提供するために作成された。目的は、ビジュアル開発環境を構築するためのビジュアル/ダイレクトマニピュレーションインターフェイスを提供することだった。このシステムを使用すると、さまざまなタスクに合わせたまったく異なる開発環境を開発できるということである。SK8グラフィックシステムの最初のバージョンは、HyperCardを拡張するように設計されており、カードが単一の「背景」テンプレートではなく、複数のレイヤーを持つことができる。

SK8システムは当初Lispでプログラムされていた。これは、一般使用には難しすぎると考えられた。さらに、Appleで使用されているさまざまな言語の数についての懸念が高まっていた。また、Mac OSを近代化するための幅広い取り組みの一環として、新しい統一されたスクリプト言語が望まれていた。1989年、クライマンはデビッド・キャンフィールド・スミス、ラリー・テスラーとともに、AppleScriptの最初のバージョンの設計と実装を行った。このバージョンのAppleScriptはSK8オブジェクトを使用していたが、2年後にApple製品部門がAppleScriptオブジェクトと通信するためのつなぎにApple Eventを使用してAppleScriptを再実装した。その後、オリジナルのプロトタイプはSK8Scriptと改名され、それ自体も1992年にアセンブラで再実装された。

Advanced Technology Groupの研究者たちが、プロジェクトにSK8を使用し始めると、大学や企業も参加し始めた。このシステムは、Newton 、QuickTimeインターフェース、プロセス間通信のプロトタイプを開発するために使用され、子供向けの学習ツールであるStagecraftを含む多くのタイトルのプロトタイプを作成するために使用された。

パフォーマンス上の理由から、1992年と1993年にSK8はゼロから再実装された。AppleのCambridge Research Centerで働いていたMacintosh Common Lispオブジェクトストアは分離され、SK8のストアに直接接続された。SK8Scriptデバッガはアセンブラ言語レベル(以前はLispで)で再実装され、コンパイラとランタイムのパフォーマンスが向上した。

## 概要

SK8システムには、オブジェクトシステム、グラフィックスおよびコンポーネントオブジェクト、SK8Script言語、およびProjectBuilder環境が含まれる。

### オブジェクトシステム

SK8オブジェクトシステムは、JavaScriptと同様にプロトタイプベースだが、JavaScriptとは異なり、オブジェクトプロパティ自体がオブジェクトだった。したがって、プロパティは、値を設定または取得するためのキーとして機能する単なる名前ではなく、さらに任意の動作を持っていた。これにより、プロパティがインテリジェントな動作をした(たとえば、推論エンジンをトリガーしたり、RPCネットワークのエンドポイントとして機能したりできる)。それらは「スマートプロパティ」と考えられる。アイデアは、アプリケーションプログラマーが、オブジェクトに組み込まれるAPIを学習するのではなく、オブジェクト操作に集中させることだった。プロパティ名を管理する階層的な名前空間は実装されなかった。

### SK8Script

1989年まで、SK8のスクリプト言語はLispだった。これは、HyperTalk (HT)の影響を強く受けたSK8Scriptに変更された。SK8ScriptとHyperTalkの違いの多くは、HTの概念の一般化であり、HyperCardユニバース内のオブジェクトとの緊密な統合を取り除き、任意のオブジェクトと対話できる一般化された構文に置き換えていると見なせる。

HyperTalkと同様に、SK8Scriptシステムのコアコンセプトは、従来のシステムのオブジェクトとほぼ同等の「コンテナ」と、それらのコンテナを識別して列挙できる「チャンキング」システムである。HTは、オブジェクトとコレクションに対処するための複数の方法を提供するというアイデアを導入した。これにより、プログラマは、コンテキストで最も自然に見える構文を選択し、別の場所でまったく異なる構文を使用できるようになった。SK8Scriptも同様のシステムを提供した。

### グラフィックとコンポーネントオブジェクト

SK8の世界は、Actor on a Stageを使ったマルチメディア指向のシステムで構成されていた。Actorは、プロトタイプのActorオブジェクトをベースにしたオブジェクトで、2Dグラフィックスをサポートするために必要な基本フレームワーク(例えば、オブジェクトの位置やサイズなど)を含んでいた。Actorは、Stageという不可視の背景オブジェクトに配置されることで可視化され、ユーザイベントを捕捉してインタラクティブ性を提供した。SK8では、従来のウィンドウは他のグラフィックオブジェクトと同じようにオブジェクトとして扱われた。ActorがStage上にあると、ウィンドウのようなオブジェクトとして振る舞えるようになった。例えば、ドーナツ型のウィンドウの穴の不透明度は0%で、中身はテキストオブジェクトをスクロールさせたり、フレーム内でムービーを再生させるなど、ウィンドウのように振る舞う複雑なオブジェクトを簡単に設計することができた。「ハロ」と呼ばれるオブジェクトは、リサイズハンドルやその他のウィジェットを提供し、ビジュアル開発環境での操作を可能にした。

すべてのSK8 Actorには、他のActorを含めることができる。階層はチャンク式を使用してナビゲートできるため `set the visible of the first Rectangle in CoolOval to true と`できる。次に、オブジェクトをUIに表示するには、`insert CoolOval into the stage`など`insert`コマンドを使用してオブジェクトをステージに移動する。これにより、楕円と長方形の両方が表示される。

GUIはActorだけで構成されていた。ウィンドウのようなオブジェクトは、他のオブジェクト(例えば、閉じるボタンやウィジェット)を含む不透明な矩形から構築することができた。各Actorの描画スタイルはレンダラで制御され、GUI構築の手助けをしました。例えば、BevelRendererを使用すると、Actorの周囲のエッジをベベル化し、Windows 3.xのコントロールやNeXTSTEPのタイトルバーのようなエフェクトを生成することができた。その他のレンダラーには、カラーやイメージの塗りつぶし、グラデーション、タイル、ブレンドなどがあった。プログラミング用語に違いはなかったが、長方形などの基本的なオブジェクトは「ジオメトリアクター」として分類され、ボタンなどの従来のGUI要素は「インターフェイスアクター」として知られていた。

Stageは、マウスダウンのクリックやキー押下など、ユーザーが生成したイベントを取り込み、Actorに送る。どのオブジェクトが先にメッセージを受け取るかは、視覚的な階層によって決定される。StageはZオーダーで、前面に近いオブジェクトが先にメッセージを受け取る。メッセージは、do inherited コマンドでクラスやプロトタイプの階層に渡すことができた。

### Project Builder

SK8 Project Builderは、ビジュアル開発環境を構築するための環境だった。コード編集、デバッグ、グラフィックスおよびスマートコンポーネントライブラリ、ランタイムターゲティングのサポート、およびダイレクトマニピュレーションのグラフィカルインターフェイスビルダーシステムを提供した。 Builderシステムの重要な要素は、開いているプロジェクト内のすべてのオブジェクトの分類されたリストを保持する「Overviewer」パネルだった。ライブラリ、ユーザが作成した関数やメソッド、変数などである。これらは、ダブルクリックするか、GUIビルダーでオブジェクトを選択すると表示される関連ポップアップメニューをクリックすることで検査や編集が可能であった。オブジェクトエディタでは、オブジェクトの「プロパティ」(インスタンス変数やクラス変数)と「ハンドラ」(メソッド)がそれぞれ1つのペインに表示される。

GUIビルダーには、ドラッグ&ドロップでビジュアルオブジェクトを構築するシステムが搭載されていた。SK8は従来の「スクリーン」を持たず、イベントやビジュアルオブジェクトを管理するための背景として、目に見えない「Stage」というオブジェクトを使用した。興味深い点は、伝統的な意味でのウィンドウは必要なく、また何かを表示することも期待されていないことである。実際、どんなビジュアル・オブジェクトでも(ドラッグ&ドロップやその他のスマートなプロパティによって)ウィンドウのような動作をさせることができました。しかし、SK8には、HyperCardにはなかった完全なメニューバーを編集し、プログラミングするためのシステムが含まれた。また、HyperCardで要望の多かった機能として、Macintoshのリソースをプロジェクトに出し入れできるメディアエディタがあった。SK8はこの機能をIDEに組み込んだ。その他、オンライン・ドキュメント・システム、システム全体のオブジェクトとコマンドのリスト、コード・エディターとデバッガー・ウインドウなどが含まれていた。

### システムとの相互作用

SK8Scriptは、OSの機能をコールイン/アウトするシステムを提供し、Macintosh Toolboxとより直接的に対話することを可能にした。HyperCardでは、任意のToolboxコードとの対話は、XCMDやXFCNと呼ばれるカスタムコードリソースによって処理され、ブラックボックスに機能がカプセル化されていた。これらのリソースは単一の操作で呼び出され返され、内部の操作は見えないようになっていた。SK8では、SK8Scriptはカプセル化されたコードと直接対話し、変数を設定し、関数を呼び出して結果を返すことができる。また、外部コードからSK8Scriptを呼び出し、変数を調べたり設定したり、関数を呼び出したりすることも可能だった。