| パラダイム | 手続き型、イベント駆動型 |
|---|---|
| デザイン: | ダン・ウィンクラー |
| 開発者 | アップルコンピュータ株式会社 |
| 初登場 | 1987 |
| 影響を受けた | |
| 自然言語プログラミング、パスカル | |
| 影響を受けた | |
| ActionScript、AppleScript、ECMAScript、JavaScript、Lingo、LiveCode、SenseTalk、SuperTalk | |
HyperTalk は、1987 年に Dan Winkler によって作成され、 Bill AtkinsonによってApple ComputerのHyperCardハイパーメディア プログラムと連携して使用された、現在は廃止された高水準の手続き型 プログラミング言語です。HyperTalkの主な対象ユーザーは初心者のプログラマーであったため、HyperTalkプログラマーは通常「著者」と呼ばれ、プログラムの作成プロセスは「スクリプト」と呼ばれていました。HyperTalk スクリプトは英語の書き言葉に似ており、 Pascal プログラミング言語に似た論理構造を使用していました。
HyperTalk は、手続き型言語の基本的な制御構造をサポートしていました。繰り返しの for/while/until、if/then/else、および関数とメッセージの「ハンドラ」呼び出し (関数ハンドラはサブルーチンで、メッセージ ハンドラはプロシージャ) です。通常、データ型はプログラマーが指定する必要はなく、文字列と数値間の変換はバックグラウンドで透過的に行われました。従来の意味でのクラスやデータ構造はなく、代わりに特殊な文字列リテラル、またはカンマで区切られた「項目」の「リスト」がありました (後のバージョンでは、「itemDelimiter」プロパティで任意の文字を選択できました)。コードの実行は通常、UI ウィジェットのマウス クリックなどのイベントへの応答として開始されました。
1980年代後半、アップルはHyperCardのHyperTalkスクリプト言語を社内および従来のMac OSオペレーティングシステム内の標準言語として、またアップル製品と非アップル製品間のプロセス間通信に使用することを検討した[1] 。同社はSuperCardのような模倣品の開発に反対しなかったが、言語バリアント間の非互換性を避けるためにHyperTalk標準委員会を設立した[1] 。大文字と小文字を区別しない言語は当初インタープリタ方式であったが、HyperCard 2.0でジャストインタイムコンパイルが可能になった[2] 。
説明
基本的な操作
数学的計算を含むほとんどの基本的な操作では、HyperTalk は数学表記法で使用される順序よりも述語の自然言語順序を優先します。たとえば、HyperTalk のput割り当てコマンドでは、変数はステートメントの末尾に配置されます。
5 * 4を Resultに 代入する
一方、より伝統的なBASICプログラミング言語 (および他のほとんどの言語) では、同じことは次のように記述することで実現されます。
結果= 5 * 4
HyperTalk コードには、変数 theResult をオンザフライで作成するという副作用があります。スクリプトはputコマンドを使用して変数に任意の型または値を割り当てることができるため、HyperTalk は非常に 弱い型付けになっています。変数の型間の変換は目に見えず、自動的でした。つまり、文字列 "3" に数値 5 を掛けて数値 15 を生成したり、数値 5 を文字列 "3" に連結して文字列 "35" を生成したりできます。HyperTalk は、型を自動的に変換できない場合を除き、エラーを報告しません。
この言語のフロー制御とロジックは、条件文if ... then ... else ... end ifの構造を使用し、柔軟な構文に基づいたループをサポートするなど、他の一般的な言語とほぼ同じです。コメントの前には、2 つのマイナス記号が付きます。
repeat ... end repeat-- this is a comment
オブジェクト、コンテナ、スクリプト
HyperCard の主なユーザー インターフェイスの概念は、インデックス カードをエミュレートする表示システムであるカードでした。カードは通常、従来のフラット ファイル データベースのレコードと同様に、情報を格納するために使用されました。カードのグラフィカル レイアウトは、テキスト フィールドやボタンなどのさまざまな要素をマウスでカード上に配置すると作成されました。背景と呼ばれるマスター レイアウトの「カード」は、各カードの透明領域の背後に表示されました。フィールドやボタンなど、背景に配置されるオブジェクトは、複数のカード間で共通のレイアウトとして共有されますが、カード固有のコンテンツを持ちます。カード、背景、およびそれらに格納される関連データのコレクションは、スタック(カードのスタック) と呼ばれる 1 つのファイルに格納されました。これらのデータを含むオブジェクトはすべて、まとめてコンテナーと呼ばれます。
HyperTalk 関数、つまりスクリプトはscript、通常、スタックのコンテナの多くで使用可能な プロパティ内に格納されます。スクリプトは、 命令と命令を使用して、インスタンス変数に対応するコンテナのプロパティにアクセスできます。スクリプト プロパティはプレーン テキストを保持し、特別なプロパティはありません。スクリプトは、文字列変数を含む任意のテキスト コンテナに配置して実行することも、[a]コマンドを使用して他のスタックからインポートすることもできます。スクリプトは、画面上のテキスト フィールドに入力されたユーザー提供のテキストにすることもできます。動的 SQL に似た方法で、 コマンドを使用して任意のテキストを実行できます。 [3]getsetstart usingdo
コンテナを参照する
HyperTalk の重要な概念は、スタックの視覚的な階層に基づくナビゲーション システムを通じてコンテナーを参照する方法でした。スタック内のすべてのコンテナーには、作成時に一意の ID 番号が与えられ、オプションで名前を付けることもできます。スクリプトは、これらの識別子のいずれかと、演算子を使用して指定されたオブジェクトタイプを使用してオブジェクトを参照できます。この演算子は、読みやすく自己文書化されたコードofを作成する自然言語構文を使用します。たとえば、カードのボタンに格納されたスクリプトは、テキスト フィールドを使用して収集されたユーザー提供のテキストを取得し、そのテキストをtheValueという変数に格納する場合があります。
カードフィールド「typehere」の値 を theValueに入力します
インタープリタは、ステートメントのさまざまなコンテキストの側面を推測できます。たとえば、上記のステートメントでは、スクリプトは特定のカードのボタンのコンテキストで実行されるため、ボタン自体は通常バックグラウンドにあるにもかかわらず、識別子カードはユーザーが操作しているカードを参照するものと理解されます。さらに、「値」(ユーザーが送信したテキスト) はメイン プロパティであり、特に指定がない場合は操作のターゲットであると想定されます。同様に、「カード フィールド」はバックグラウンド フィールドではなくコマンドのターゲットであると想定されるため、その情報も省略できます。コンテナー タイプにも、プログラマが入力を節約するために使用できる短縮形があります。したがって、上記のコードは、次の短縮形と同等です。
theValueにfld "typehere" を入れる
特定のコンテキスト内のオブジェクト (たとえば、カードや背景) には、画面上のZ 順序に基づいて実行時番号も与えられます。ナビゲーションでの位置の使用を支援するために、HyperTalk には構文をさらに簡素化するさまざまな序数および基数参照システムも含まれています。フィールド "typehere" がカード上の唯一のフィールドであると仮定すると、上記のコードは次のように記述することもできます。
最初 の カード フィールドを theValueに 入れる
または:
カード フィールド 1を theValueに 入れる
アドレス指定スタイルの選択はプログラマーに任されていました。多くの場合、コードをより読みやすくするために、周囲のコードのスタイルに応じて、異なるステートメントで異なるスタイルが使用されていました。
HyperTalk には、ほとんどのオブジェクト指向言語meにある修飾子と同じように動作するコンテナが含まれており、現在のコンテナ オブジェクトに簡単にアクセスできます。あまり一般的ではないのは、特定の組み込み演算子の最後の操作の値を保持する変数です。たとえば、次のようになります。
selfit
「値はいくらですか?」
と尋ね、それをカードフィールド「表示」に入力します
この例では、 コマンドを使用してダイアログ ボックスaskを表示し、付随するテキスト フィールドに入力されたテキストを取得します。 を押すかクリックしてダイアログが完了すると、値が疑似変数に割り当てられます。2 行目では、代入演算子を使用してその値をカード フィールドにコピーします。
ReturnOKitput
コレクション
特定のタイプのコンテナーは、そのコンテナー タイプの複数形の名前を持つコレクションとしても使用できますcard fields。つまり、カード上のフィールドのコレクションは です。これらのコレクション自体が、独自のプロパティを持つコンテナーでした。これらの中で重要なのは、number反復処理や同様のタスクで広く使用される プロパティでした。たとえば、カード上のすべてのフィールドを非表示にしたい場合は、次のコードで実現できます。
i = 1で カードフィールドの数まで繰り返し、フィールドiを非表示にして繰り返し終了
このコードは、HyperTalk のもう 1 つの共通機能、つまり、プロパティに複数の名前と演算子がある可能性があることを明らかにしています。この場合hide、コマンドとそれに関連付けられた はshow、コンテナのvisibleプロパティの値を設定することによって動作します。したがって、 はhide field iとまったく同じです。同様の例として、ビジュアル更新を停止するコマンドがあります。これは の短縮形であり、 はHyperCard 自体のプロパティであり、これもコンテナです。HyperTalkには、構文を簡素化し、共通コードの読みやすさを向上させるために、
このような糖衣構文の例が数多くあります。set the visible of field i to falselock screenset the lockscreen to truelockscreen
HyperCard 2.2 以降では、コレクションのコレクションはコンテナの としても使用できましたparts。これにより、スクリプトは単一の反復子を使用してコンテナ内のすべてのオブジェクトをアドレス指定できるようになりました。
テキストの取り扱い
HyperTalk コンテナ モデルの注目すべき機能は、テキストの処理です。プログラム内のリテラル文字列であれ、テキスト フィールドに入力されたテキストであれ、すべてのテキスト コレクションは、それ自体がコンテナであり、その中に複数のコンテナ コレクションが含まれています。これにより、スクリプトは他のコンテナと同じナビゲーション コマンドを使用してテキストを解析できます。たとえば、スペースで区切られたデータ ファイルを解析しているときに、次のように 3 番目の列を抽出したい場合があります。
theFilesTextの3 番目の 単語を colThreeに入れる
この構文により、スクリプトはテキストを「たどって」特定のデータを見つけることができました。次の例をご覧ください。
カードフィールド「sometext」の5行目の3番目の単語の最初 の 文字 をtheCharに入れます
テキストをコンテナとして扱うこのプロセスは「チャンク化」と呼ばれ、関数は「チャンク式」と呼ばれていました。これらの同じ種類の式は、一連のファイル管理関数とともに、ファイル操作を処理するために使用されていました。次のコードは、既知のファイルを開き、そこから読み取り、データを抽出し、ファイルを閉じます。
mouseDown
でファイル「開くテキスト ファイルを選択してください。」に応答します。 空の場合は、終了mouseDownでそれをfilePathに格納します。ファイルfilePathがある場合は、ファイルfilePathを開きます。ファイル filePath から戻るまで読み取ります。それをcd fld 「some field 」に格納します。ファイル filePath を閉じます。カードフィールド「some field 」の文字1から10のtextStyleを太字に設定します。終了if終了mouseDown
HyperTalk には、 演算子を使用した部分文字列検索操作で文字列をチャンク化する関数も含まれています。次のコードは、ループの一部として をin使用して、指定されたパターンのすべての例を検索し、文字列内でそのパターンの位置を検索します。
inrepeatoffset
関数 replaceStr パターン、newStr 、inStr
パターンがinStrにある間繰り返します。 オフセット(パターン、inStr )をposに入れます。newStrをinStrの文字posから( pos +パターンの長さ) - 1まで入れます。繰り返し終了inStrを返します。終了replaceStr
リストとその他のコレクション
HyperTalk は、同じチャンク システムを使用して、配列やリストなどの構造を作成します。このような構造は、複数のデータ項目をコンマで区切って変数に配置することで作成されます。必要に応じて解析される文字列を使用して、さまざまな種類のデータを HyperTalk スクリプトにインポートできます。たとえば、画面上のオブジェクトの位置は、左上隅を基準とした X 座標と Y 座標を表す 2 つの数値で定義されます。次のコードは、座標のペアを保持するposという変数を作成し、これを操作して、カード上のすべてのボタンを左上から右下への対角線上に再配置します。
mouseUp
で、posに「100,100」を入れ、 x = 1でカードボタンの数を繰り返し、カードボタンxの位置をposに設定し、 posの項目1に15 を加えます。繰り返し終了、 mouseUp終了
チャンクitem化式は元々、カンマ区切り文字に基づいていましたが、HyperCard の後のバージョンではこれが の値に変更されitemDelimiter、任意のリストと構造を解析できるようになりました。
メッセージとイベント
HyperTalk はスクリプトの呼び出しにオブジェクト指向の概念を使用しており、スタック内のオブジェクトは「イベント」をメッセージとして送信し、そのメッセージは、構文を使用してイベントの受信を宣言したハンドラによって処理されますon。たとえば、ほとんどの GUI コンテナは、mouseDownマウス ボタンがクリックされたときにメッセージを送信し、マウス ボタンmouseUpがコンテナの上にあるときにマウス ボタンが放されたときにメッセージを送信します。スクリプトは、次のようにしてこれらのイベントをキャプチャできます。
on mouseUp
-- ここに追加のコードを配置します
end mouseUp
イベントのメッセージは、まずイベントを作成したオブジェクト内のスクリプトに送信されました。たとえば、ユーザーがボタンをクリックすると、メッセージはmouseUpまずそのボタンに送信されました。ボタンのスクリプト オブジェクトにハンドラーがない場合mouseUp(またはスクリプトがまったくない場合)、メッセージはカード、背景、スタック、コマンドを使用してスクリプトが明示的にインポートされたスタックstart using、「ホーム スタック」(ユーザーが選択した常に開いている HyperCard スタック)、そして最後に HyperCard アプリケーション自体に渡されました。
ボタンのマウス クリックなどの多くの単純なイベントの場合、スクリプトは問題のオブジェクト (ボタン自体) 内に直接配置されます。たとえば、上記のサンプル コードを次のようにボタン ハンドラー内で使用するとします。
マウスアップ
時に、i = 1でカードフィールドの数まで繰り返し 、フィールドi を非表示にして繰り返し終了し、マウスアップを終了します。
コードが複数の場所から呼び出されている場合、またはイベントのグローバル ハンドラーとして使用されている場合、スクリプトはtarget関数を使用してイベントの元の送信者を特定できます。同様に、スクリプトは コマンドを使用して他のコンテナーにイベントを送信しsend、次にナビゲーション コードを使用してそのハンドラーのコードを含むコンテナーを参照できます。
カード「Veracity」のカードボタン「OK」に「mouseUp」を 送信します。
HyperTalk の文字列処理とdoコマンドを組み合わせると、カードにテキスト フィールドを配置し、フィールドのスクリプトに次のコードを配置することで、対話型インタープリターを構築できるようになります。
mouseUp
でclickLineを選択し、 clickLineの単語2をlinenumに格納し、 cd fld 1の行linenumを実行します。end mouseUp
clickLineは、最後にクリックされたフィールドの名前と行番号を のような形式で返すグローバル プロパティです。このコードは、まずクリックされた行のテキストをすべて選択し、次に行番号をローカル変数に抽出し、 を使用してテキストを HyperCard スクリプトとして実行します。
line 10 of card field 4do
メッセージmouseDownは、ユーザーがボタンをクリックするとボタンに送信され、mouseUpユーザーがボタン内でマウスを離してアクションをトリガーすると送信されます。同様に、HyperCard は、定期的なidleメッセージ、、、mouseEnter...mouseLeaveや、HyperCard スタック内の異なるカード間のナビゲーションに関連するさまざまなメッセージ、ユーザー入力 ( keyDown、、functionKey...)、およびシステム イベントを送信します。スクリプト作成者に関する限り、他の手続き型プログラミング言語のようなメイン イベント ループはありませんでした。
HyperCardの制御
一般的な高速アプリケーション開発プラットフォームとは異なり、HyperCard スタックは常にスタックのように見えました。メニュー バーは HyperCard のものであり、プログラマーのものではありません (デフォルトでは、スクリプトでメニューを追加、削除、変更できます)。単一のウィンドウは固定サイズでした (初期のバージョン)。また、場合によっては、操作の中心となるコマンドがアプリケーション自体の一部であり、HyperTalk 自体では直接使用できませんでした。
その良い例は、アプリケーションの一部である新しいカードの作成です。HyperTalk 言語自体から直接アクセスすることはできません。新しいカードは、[新しいカード] メニュー項目を使用してのみ作成でき、を使用してコードでシミュレートできますdoMenu "New Card"。HyperTalk はメニュー コマンドを呼び出しますが、メニュー コマンドは HyperTalk でハンドラーも呼び出します。[コピー] メニュー項目が選択されたときにカスタム コードを実行するには、ハンドラーを使用してスタックにスクリプトを配置しon doMenu itemName、それがitemName"コピー" であるかどうかを確認します。
HyperTalk では、ペイント ツールで必要な変更をスクリプト化し、コマンドとコマンドを使用してマウスの動きをシミュレートするだけで、組み込みの描画ツールをスクリプトで制御することもできます。
drag from start to endclick at position
寛容な意味論
HyperCard のプログラミング言語 HyperTalk と、一見類似しているように見える AppleScript などの言語との 1 つの独特な違いは、HyperTalk スクリプトでは受け入れる入力がより寛容であることです。
値が割り当てられたときの上記の変数の暗黙的な宣言、および値が型間で暗黙的に変換される方法 (たとえば、 を要求できるようにするcharacter 2 of 1234) とは別に、HyperCard は特定の式を認識し、そこからサブ値を抽出します。
例えば:
カード フィールド「リストボックス」の選択された行を theSelectionに入れます-- 'カード フィールド「リストボックス」の行 2 から 3' を返しますカードフィールド「リストボックス」の行1 を選択しますカードフィールド「リストボックス」の行( theSelectionのワード2 )を選択します(カードフィールド「リストボックス」の選択された行)を選択します-- 括弧は説明のためにのみ追加されています
または
ハープシコードを 演奏するc e g
ハープシコードを演奏する 「ce g」メロディーに「ce g」と入力するハープシコードを演奏するメロディー
最終結果は、スクリプト作成者にとっては、解析前の Bash スクリプトの変数の展開と似ているように感じられましたが、これは特殊なケースの構文であり、データがコードとして評価される落とし穴はありませんでした。たとえば、次のすべてはメロディーの構文エラーであり、関数呼び出しではありません。
ハープシコード を演奏する"ceg()"
theMelodyに"ce() g"を入力する ハープシコードを演奏するtheMelody
HyperTalk の拡張
HyperTalk 言語は HyperCard 自体と同様に衰退しましたが、プラグイン プロトコル、いわゆる外部コマンド (XCMD) と外部関数 (XFCN) によって関心が再燃しました。これらは、スタック (Macintosh 固有のリソースとして) にアタッチされたネイティブ コード コンテナーで、単一のエントリ ポイントと戻り値を持ちます。XCMD と XFCN は、HyperTalk スクリプトから通常のメッセージ ハンドラーや関数ハンドラーと同じように呼び出すことができ、HyperCard アプリケーションにメッセージを送り返すこともできました。XCMD の作者の中には、フル カラー サポート (ColorizeHC、HyperTint、AddColor)、複数の専用ウィンドウ (Prompt、Tabloid、Textoid、Listoid、ShowDialog、MegaWindows)、ドラッグ アンド ドロップ サポート、さまざまなハードウェア インターフェイスなどの高度な機能を言語に追加した人もいます。
ハイパートークの子孫
さまざまなスクリプト言語がHyperTalkのスーパーセット(総称してxTalk)を実装している:[4]
- CompileIt!-Talk – Tom Pittmanによる HyperCard スタックと XCMD で、HyperTalk コードからネイティブ 68000 マシン コード (XCMD や XFCN など) をコンパイルし、ネイティブ Macintosh ツールボックス ルーチンを呼び出すことができます。CompileIt はブートストラップされており、つまり、後のバージョンは以前のバージョンを使用してコンパイルされました。
- Double-XX-Talk – Double-XX は、CompileIt! の追加機能として出荷された軽量の HyperCard クローンであり、HyperCard なしで XCMD と XFCN を実行でき、小さな HyperTalk インタープリタも含まれていました。
- MediaTalk – Oracle Media Objectsの言語であり、Plus の後継であり、初のクロスプラットフォーム HyperCard クローンです。さらに、真にモジュール化された唯一のものです。
- PlusTalk – Spinnaker Software の Plus 言語 (元々は Format Verlag によって開発)。Oracle Media Objectsの基盤として使用されました。
- SenseTalk – NeXT 由来の HyperSense と VNC ベースのテスト ツール Eggplant の言語。
- SuperTalk – Bill Appleton による最初の HyperCard クローンであるSuperCardの言語。Appleton は、人気の高いWorld Builderアドベンチャー構築キットと HyperDA も作成しました。
- Transcript (旧称 revTalk および MetaTalk) – LiveCode (旧称 Revolution および MetaCard) ソフトウェア プラットフォームおよび開発環境に実装された言語。MetaCard は、Classic Mac OS、Mac OS X、Windows、Linux、および Solaris で実行された初期の Unix 由来の HyperCard クローンでした。
- XION - 元々はオープンソースの HyperCard クローンの言語でしたが、実現しませんでした。現在は OpenXION として実装されています。
- xTalk - Livecode のコミュニティ バージョンの開発が Livecode によって中止された後、オープン ソース バージョンが現在の OpenXTalk にフォークされました。このフォークは openxtalk.org Web サイトで開発中です。
これらのクローンと方言 (一般に xTalk 言語という名前で呼ばれる) は、例外処理、ユーザー定義のオブジェクト プロパティ、タイマー、マルチスレッド、さらにはユーザー定義のオブジェクトなど、現代のプログラミング言語に期待されるさまざまな機能を言語に追加しました。
次のような、構文と構造が HyperTalk の影響を受けている言語もあります。
- ActionScript – Adobe Flash用のスクリプト言語。
- AppleScript – Apple の Classic Mac OS の主なスクリプト言語であり、macOSでも引き続きサポートされています。
- Lingo – Macromedia Director のプログラミング言語は、xTalk のような構文から始まりましたが、その後のバージョンでは JavaScript に似た方向に進みました。
- JavaScript – Brendan Eichによって作成されたスクリプト言語。強化されたユーザーインターフェイスと動的なWebサイトを作成するために、 Webブラウザーの一部として一般的に実装されています。[5]その後、 ECMAScriptとして一般化され標準化されました。
- Hyperscript – JavaScript 拡張機能によって解釈される、HTML 内での読み取り可能なインライン スクリプトと動作の局所性を実現するように設計されたスクリプト言語。
onmouseupHyperTalkによって最初に普及した多くのメソッド名は、JavaScriptのイベントハンドラなど、後の言語に組み込まれました。 [6] Asymetrix ToolBookはHyperCardのクローンであると見なされることも多いですが、そのスクリプト言語はHyperTalkとほとんど似ていないようです。
参照
- Inform 7 – 英語に似た構文を持つプログラミング言語
注記
- ^ これは、テキスト ファイルから読み込むこともできます。
参考文献
- ^ ab Flynn, Laurie (1989-02-27). 「Apple が HyperTalk の標準化を検討」InfoWorld . p. 31.
- ^ Dave Kelly、「Tools of the Trade: CompileIt! 2.0!」、MacTech、第 7 巻第 9 号
- ^ Erland Sommarskog と Frank Kalis、「動的 SQL の呪いと祝福」、2011 年 6 月 23 日
- ^ Roman Knöll、Vaidas Gasiunas、Mira Mezini、「Naturalistic types」、Onward! 2011: 第 10 回 SIGPLAN シンポジウム「新しいアイデア、新しいパラダイム、プログラミングとソフトウェアに関する考察」の議事録、pp. 33–48、2011 年 10 月。
- ^ Eich, Brendan (1998)。「序文」。Goodman , Danny (編)。JavaScript Bible (第 3 版)。John Wiley & Sons。ISBN 0-7645-3188-3. LCCN 97078208. OCLC 38888873. OL 712205M.
- ^ Brendan Eich、「Splash 基調講演 2011、スライド 10」
外部リンク
- Pantechnicon HyperTalk Wiki ページ – HyperTalk 言語リファレンス (制御構造、イベント、組み込み関数など)
