(57)【特許請求の範囲】
【請求項１】
計算機システムにおけるデータを管理するための方法であって、
前記計算機システムにおいてリアルタイムプログラムを準備するステップであって、当該リアルタイムプログラムが、１つ以上のリアルタイムコンポーネントを含むものと、
前記計算機システムにおける前記リアルタイムプログラムのコルーチンとして用いるために、非リアルタイムプログラムを準備するステップであって、当該非リアルタイムプログラムが、１つ以上の非リアルタイム・コンポーネント含むものと、
前記リアルタイムプログラムのリアルタイムコンポーネントと前記非リアルタイムプログラムの非リアルタイム・コンポーネントとの間でコンテキストを切り換えるために前記計算機システムのコンテキストスワップ・コンポーネントを準備するステップと、
前記非リアルタイム・コンポーネントの中から、前記リアルタイムプログラムの実行を停止させ得る問題の非リアルタイム・コンポーネントを識別するステップと、
前記問題の非リアルタイム・コンポーネントを、リアルタイムプログラムのコンポーネントとして使用するためにリアルタイム環境保護コンポーネントと置換するステップと、
前記リアルタイムプログラムをリアルタイム環境内で実行するステップと、を含み、
前記リアルタイムプログラムの実行中、前記非リアルタイムプログラムおよび前記コンテキストスワップ・コンポーネントにイールドする前記リアルタイムプログラムが、前記非リアルタイムプログラムのリアルタイム環境での実行を可能にすることを特徴とする方法。
【請求項２】
前記実行ステップ中、前記リアルタイムプログラムが、停止も中断もサスペンドもされないことを特徴とする請求項１記載の方法。
【請求項３】
前記リアルタイムプログラムが、コンパイラ型言語で記述され、前記非リアルタイムプログラムが、インタープリター型言語で記述されることを特徴とする請求項１記載の方法。
【請求項４】
前記非リアルタイムプログラムのインタープリター型言語及びその環境が、
ＢＡＳＩＣ言語及びそのインタープリターと、
Ｐｙｔｈｏｎ言語及びそのインタープリターと、
Ｒｕｂｙ言語及びそのインタープリターと、
Ｊａｖａ言語及びそのインタープリターと、
ＪａｖａＳｃｒｉｐｔ言語及びそのインタープリターと、から成るグループから選択されることを特徴とする請求項３記載の方法。
【請求項５】
前記リアルタイムプログラムのコンパイラ型言語及びその環境が、
Ｃ言語及びそのコンパイラと、
Ｃ＋＋言語及びそのコンパイラと、
Ｃ＃言語及びそのコンパイラと、から成るグループから選択されることを特徴とする請求項３記載の方法。
【請求項６】
前記リアルタイムプログラムが、計算機システム依存のアセンブリ言語で記述され、その環境を使用し実行されることを特徴とする請求項１記載の方法。
【請求項７】
前記問題の非リアルタイム・コンポーネントを前記リアルタイム環境保護コンポーネントと置換するステップが、前記問題の非リアルタイム・コンポーネントそれぞれを１つの前記リアルタイム環境保護コンポーネントと置換するためのコールバックテーブルを使用することを特徴とする請求項１記載の方法。
【請求項８】
前記リアルタイムプログラムの実行中、前記リアルタイムプログラムおよび前記コンテキストスワップ・コンポーネントにイールドする前記非リアルタイムプログラムが、前記リアルタイムプログラムの通常の実行を可能にすることを特徴とする請求項１記載の方法。
【請求項９】
計算機システムにおけるデータを管理するためのプログラムであって、
前記計算機システムは計算機可読記憶装置と接続されており、
前記計算機可読記憶装置にストアされたリアルタイムプログラム命令と、
前記リアルタイムプログラム命令のコンポーネントとして使用され得ない問題の非リアルタイム・コンポーネントを識別し、当該問題の非リアルタイム・コンポーネントを、リアルタイムプログラム命令のコンポーネントとして使用するためのリアルタイム環境保護コンポーネントと置換するために、前記計算機可読記憶装置にストアされている非リアルタイムプログラム命令を含み、
前記リアルタイムプログラム命令が、前記非リアルタイムプログラム命令にイールドし、前記非リアルタイムプログラム命令をリアルタイム環境で実行することを特徴とするプログラム。
【請求項１０】
前記リアルタイムプログラム命令が、前記リアルタイムプログラム命令と前記非リアルタイムプログラム命令との間でコンテキスト・スワップ・プログラム命令を実行するためのコンテキストスワップ・コンポーネントを含むことを特徴とする請求項９記載のプログラム。
【請求項１１】
前記計算機システムが更に、前記リアルタイムプログラム命令と前記非リアルタイムプログラム命令との間で引数をやりとりするための共有記憶領域を含むことを特徴とする請求項９記載のプログラム。
【請求項１２】
前記共有記憶領域が、コールバックテーブルから成ることを特徴とする請求項１１記載のプログラム。
【請求項１３】
前記計算機可読記憶装置が、スタックから成ることを特徴とする請求項９記載のプログラム。
【請求項１４】
前記非リアルタイムプログラム命令が、前記リアルタイムプログラム命令にイールドし、前記非リアルタイムプログラム命令をリアルタイム環境で実行することを特徴とする請求項９記載のプログラム。
【請求項１５】
前記計算機システムが情報通信システムであり、前記リアルタイムプログラム命令が、セッション開始プロトコル及びセッション記述プロトコルを含むことを特徴とする請求項９記載のプログラム。
【請求項１６】
前記計算機システムが、前記非リアルタイムプログラム命令を記述するＢＡＳＩＣインタープリターを含むことを特徴とする請求項９記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、２００７年８月８日に出願された米国特許仮出願第６０／９６４，０２７号の利益を請求する。
本発明は、情報通信システムに関する。より具体的には、本発明は、情報通信システムにおけるコルーチンの使用に関する。
【背景技術】
【０００２】
今日の情報通信システムは、範囲及び複雑さにおいて、非常に急速なペースで成長し続けている。この成長を可能にしたものの１つが、ＳＩＰ（セッション開始プロトコル）及びＳＤＰ（セッション記述プロトコル）のような新世代情報通信プロトコルの開発を順に促している低価格メモリーの可用性及び処理能力の可用性である。これら未来志向のプロトコルは、ＡＳＣＩＩ（情報交換用米国標準コード）ベースとした拡張が可能であって、以前のプロトコルよりもずっと人間が読みやすく、実行時におけるマシンの効率は、プログラマーの生産性よりもより高く評価されている。
【０００３】
これら新規プロトコルは、より旧式のプロトコルよりもそれらが支援する情報通信サービスに関するより大量の情報を運び、かなり特定の方法によって特定のアプリケーションにシステムを適合させる際に多くの柔軟性が、メッセージプロトコル中のデータを変更する機能から生じる。ＳＩＰ及びＳＤＰのようなプロトコルは、ＡＳＣＩＩを基本としているので、データは、エンドユーザー、特にネットワーク工学及び計画に責任ある技術者による自らの変更を与える。過去においては「複雑なバイナリーベース」のプロトコルの使用は、製造者によるそのようなカスタマイズを実装するための技術設計を要求していた。
【０００４】
情報通信システムの中には、従来、特殊アプリケーション用の任意の統合化ＢＡＳＩＣ（Beginner’s All-purpose Symbolic Instruction Code）インタープリターを組み込んでいるものもある。システム内で予定されている処理を独自に実行しているとき、ＢＡＳＩＣプログラムは、別の方法によって、外部ホスト計算機使用を必要としている特定用途に対する呼出し処理を制御するための、システム内のＣＴＩ（コンピューター・テレフォニー・インテグレーション）エレメントからのプロセス間メッセージを送信し受信し得る。ＢＡＳＩＣからいくつかのＯＳ（オペレーティングシステム）の制御に対するアクセスも提供されていて、製造者がリリースされたソフトウェアに対する不具合改修を実施可能である。製造者に提供されるこれらのＢＡＳＩＣプログラムは、新しいソフトウェアパッケージが問題を修正するためにリリースされるまで、いくつかのタイプの不具合症状を取り除き得る。
【０００５】
ＢＡＳＩＣは、特にＡＳＣＩＩ文字の文字列処理に適合した使い易い、より高水準の言語なので、エンドユーザー技術者又は製造者のどちらか一方によってカスタマイズされるＳＩＰ及びＳＤＰメッセージデータの変更を実装するために、ＢＡＳＩＣの利用を考慮することは当然である。高トラフィック期間中、ネットワーク負荷を低減するための有用な変更例は、時刻依存のＳＤＰ「オファー（ｏｆｆｅｒ）」内のデータを変更することにある。ＳＤＰプロトコルがメディアセッションによって要求されるビット伝送速度関連の情報を運ぶ理由により、これが作用する。
【０００６】
図１を参照されたい。ＢＡＳＩＣプロセス（１０）とその他のシステムプロセス（２０）との間の相互作用方法は１つであって、ＢＡＳＩＣは、システムスケジューラー（５）によって予定されているプロセスを単独で実行し、プロセス間メッセージ（ＩＰＭ）（３０）をその他のシステムエレメントに送信し受信する。そのような方法は、情報通信プロトコルプロセスのようなアプリケーションに適用されるとき、厄介かつ非効率双方である。ＢＡＳＩＣプロセス（１０）に情報を送信する必要がある任意のリアルタイム・システムソフトウェア（２０）は、それをＩＰＭ（３０）に送信し、その後、別のリアルタイムイベント入力を受け入れる間、応答をずっと待つ必要がある。
【０００７】
情報通信システムがリアルタイムでデータ処理する必要があって、ＢＡＳＩＣが予定されている独自処理として実行中の場合、ＢＡＳＩＣからの応答が大幅に遅れ得るという事実から、別のイベント入力をずっと受け入れている間、応答を待つ必要が生じる。より直接的なインターフェースによって、ＢＡＳＩＣは、その処理が望まれている正確な時点において単純なインライン関数コールとしての呼び出しが可能になる。これは、スケジューリング及びＩＰＭに関連するプロセスオーバーヘッドも回避する。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】米国特許仮出願第６０／９６４，０２７号
【発明の概要】
【発明が解決しようとする課題】
【０００９】
本発明の目的は、２つの異種プログラミング環境を実行しているシステムにおいて、関数に類似したインターフェースを実装するコルーチンを使用する方法を提供することである。
【課題を解決するための手段】
【００１０】
本発明は、ＢＡＳＩＣプログラムと、システムにおける（例えば）ＳＩＰ及びＳＤＰデータが変更される点との間の関数に類似したインターフェースを実装するためのコルーチンを使用する方法を組み込む。このコルーチンインターフェースは、エンドユーザーの視点からは直感的であって、システム設計者の視点からはリアルタイムの効果的及び柔軟性の双方がある。
【００１１】
本発明の方法は、そのコルーチンインターフェースを密結合コルーチンインターフェースから生じ得る望ましくない副作用からシステムを保護すると同時に、エンドユーザーに多くの柔軟性を与える使い易い方法によってユーザーがカスタマイズしたＳＩＰ変更及びＳＤＰ変更を提供するために適用する。
【図面の簡単な説明】
【００１２】
【図１】計算機システムにおけるＢＡＳＩＣプロセスと別のプロセスとの間の従来の通信方法を示す。
【図２】従来のサブルーチンコールの仕組みのプロセス概略図を示す。
【図３】コルーチンコールの仕組みのプロセス概略図を示す。
【図４】本発明のコンテキスト管理プロセスの流れ図を示す。
【図５】本発明のコールバック方法のプロセス概略図を示す。
【発明を実施するための形態】
【００１３】
コルーチン
通常、関数呼び出しは、階層的な方法で実行される（図２）。階層構造の最上部のルーチン「Ａ」（４１）は、いくつかの動作を実行するための階層構造のより下位ルーチン「Ｂ」（４２）を呼び出す。「Ｂ」が完了したとき、それは、「Ｂ」が呼び出された「Ａ」のその時点の「Ａ」に戻る。その後、「Ａ」は、再び「Ｂ」を呼び出し得る。更に、「Ｂ」は、階層構造のより下位ルーチン「Ｃ」（４３）も呼び出し得るが、下位ルーチンそれぞれは、最終的にその関数を完了し、階層構造のより高位のその呼び出し元に戻る。
【００１４】
コルーチンは、図２の当技術分野において周知のサブルーチンの仕組みの一般化である。Ｄｏｎａｌｄ  Ｋｎｕｔｈ，基本アルゴリズム，第３版．Ａｄｄｉｓｏｎ−Ｗｅｓｌｅｙ，１９９７．ＩＳＢＮ  ０−２０１−８９６８３−４．  １．４．２：Ｃｏｒｏｕｔｉｎｅｓ，１９３〜２００ページ及びその他多数の情報科学論文の参考文献を参照されたい。サブルーチンと対照にコルーチンは、２つのルーチン「Ａ」及び「Ｂ」が完全な対称方法で相互に呼び出す特別形式の関数呼び出しである（図３）。リアルタイムプログラム「Ａ」（５１）から非リアルタイムプログラム「Ｂ」（５２）への呼び出しは、それが最後に「Ａ」を呼び出した「Ｂ」における「Ｂ」の時点から再開する。その後、「Ｂ」が「Ａ」を呼び出したとき、それが最後に「Ｂ」を呼び出した「Ａ」の時点から再開する。これら特別な関数呼び出し形式は、多くの場合、「呼び出す（コール）」というよりも「Ｂ」に「イールド（ｙｉｅｌｄ）する」と呼ばれ、逆もまた同様に呼ばれる。
【００１５】
本発明において、図３のルーチン「Ａ」（５１）及び「Ｂ」（５２）の役割はそれぞれ、情報通信システムの呼び出し処理ソフトウェア及びＢＡＳＩＣプログラムによって実行される。実際に、ルーチン「Ａ」とルーチン「Ｂ」との間に非常に親密な関係があることが図３から確認され得る。
【００１６】
伝統的にコルーチンの概念は、通常、アップル社のＭａｃｉｎｔｏｓｈ（登録商標）計算機用の元々のオペレーティングシステム（ＯＳ）などの「協調マルチタスク」システムの適用にいくらか制限していた。これらのタイプのアプリケーションにおいてルーチン「Ａ」及びルーチン「Ｂ」双方は、システムのプログラマーによって、非常に対話的で親密なルーチン間の関係のために提供されることも通例である。対照的に本発明は、ルーチン「Ａ」を不可欠な製品部分として情報通信システムの製造者によって提供しているが、ルーチン「Ｂ」（ＢＡＳＩＣプログラム）を場合によって、ネットワーク工学及び計画に責任がある顧客の技術者が後で別個に記述する方法を組み込む。このＢＡＳＩＣプログラムは、その後、ロードされ、別の任意のＢＡＳＩＣプログラムと同一方法で実行されるが、本発明のコルーチンインターフェースを介し、前述されたテイラーサービスを提供するためのシステムと結合される。
【００１７】
本発明の目的の１つは、この２つの異種プログラミング環境を実行しているコルーチンの関係に対する結合を達成する方法を教示することである。
ＢＡＳＩＣインタープリターによって、通常、提供されるプログラミング環境は、特にプログラム開発段階の間、ユーザー視点から高度に対話的である。ユーザー（この場合、プログラマー）は、プログラムの命令文を入力し、プログラム全体又はそのより小さいセグメントのどちらか一方を実行し、中間結果を調査し、変更を実行し、再試行し得る。最終的に、完全で恐らく不具合のないＢＡＳＩＣプログラムをもたらす。この処理の間ずっと、プログラマーとＢＡＳＩＣとの間の継続的な相互作用が存在する。プログラマーは、端末上でデータを入力する。ＢＡＳＩＣは、端末出力及び場合によってエラーメッセージとともに応答する。
【００１８】
しかしながら、ＢＡＳＩＣプログラムが、前述されたコルーチンインターフェースのルーチン「Ｂ」の役割を引き受けたとき、それは、端末入力のような問題（sensitive）な非リアルタイムコンポーネントに対するプロンプトを禁止され、エラーメッセージの発行、ユーザー応答の待機、その実行を遅らせるどのような関数実行も禁止される。リアルタイム環境において、システムソフトウェアからコルーチンとして呼ばれたとき、ＢＡＳＩＣプログラムは、実質上、純粋計算に限定される必要がある。例えば、ＢＡＳＩＣプログラムが命令文「ＩＮＰＵＴ」を含んでいて、リアルタイムシステムプロセスからコルーチンとして実行される場合、そのリアルタイムプロセスは、命令文「ＩＮＰＵＴ」を満たすための端末入力を待つために、その時点において実行を停止する。イベントを適時に処理する役割を果たすリアルタイムプロセスの実行停止は、システム障害をもたらす。
【００１９】
したがってＢＡＳＩＣプログラム環境を、これらの危険な副作用を防ぐためのコルーチンとして使用するとき、その環境を変更し得る方法を教示することが、本発明のもう１つの目的である。
ＢＡＳＩＣインタープリター
好適実施例において、ＢＡＳＩＣインタープリターは、ルーチン「Ｂ」が記述されているプログラミング環境であって、それが実行される環境ではないと仮定されている。最終的に、ルーチン「Ａ」及びルーチン「Ｂ」双方は、プロセッサー上で実行する機械コード形式で作動する。ルーチン「Ａ」は、Ｃプログラミング言語又は、Ｃ＋＋やＣ＃のような別のコンパイラプログラミング言語で記述され、その後、コンパイルされ、リンクされ得、製造者によって提供される情報通信システムソフトウェアの一部になる。ルーチン「Ｂ」は、ＢＡＳＩＣプログラミング言語又は、Ｐｙｔｈｏｎ、Ｒｕｂｙ、ＪａｖａやＪａｖａＳｃｒｉｐｔのような別のインタープリタープログラミング言語で記述され得る。ＢＡＳＩＣインタープリターそれ自体は、Ｃ言語又は別のコンパイラ型言語で記述され得る。双方の場合、ルーチン「Ａ」の一部及びＢＡＳＩＣインタープリターは、望ましくは、アセンブリ言語が大部分、直接に機械語に解釈するので、速度及び効率のためにアセンブリ言語で記述された一部を組み込む。高水準のＢＡＳＩＣインタープリターが、どのようにユーザーのＢＡＳＩＣプログラムを処理するか簡潔に説明することが必要である。コンパイラ及びインタープリターの背後にある詳細な概念は、同業者によく知られていて、本明細書において記述しない。
【００２０】
コンパイラと対照的にＢＡＳＩＣインタープリターは、ユーザーのＢＡＳＩＣプログラムを機械語に変換せずにその後、その機械コードを後で実行する。代わりにＢＡＳＩＣインタープリターは、そのデータとしてユーザーのＢＡＳＩＣプログラムを読み出し、そのデータによって呼び出される動作を追加的に実行する。ＢＡＳＩＣインタープリターは、望ましくは、実行効率化のために簡略化された統合化形式でユーザーのＢＡＳＩＣプログラムを内部的に表すことによって、プロセッサーオーバーヘッドを最小化にするためのステップを実行する。しかしながら、ユーザーのＢＡＳＩＣプログラムは、まさにＢＡＳＩＣインタープリターが、ＢＡＳＩＣインタープリター内で既に提供されている適切な機械コードシーケンスを選択させて実行可能にする役割を果たす。例えば、式「Ｘ＋Ｙ」に遭遇したとき、インタープリターは、記号Ｘ及びＹに割り当てられた値の加算を実行するための機械コードを実行する。命令文「ＰＲＩＮＴ」に遭遇したとき、インタープリターは、命令文「ＰＲＩＮＴ」に指定されているデータを端末に出力するための機械コードを実行する。本明細書において重要なポイントは、コルーチンインターフェースの視点からはルーチン「Ａ」及び「Ｂ」は、単に正常な機械コードということである。
【００２１】
本発明を説明する際、最初に、ＢＡＳＩＣプログラムのライター（「ライターＢ」）の視点からの動作を説明し、システムコードのライター（「ライターＡ」）の視点からの動作があとに続くように説明することがより好都合である。これらの説明に続いて、詳細な動作方法を説明する。以下の説明において、用語「コンテキスト」は、プロセス実行中の実施中のプログラム環境（プロセッサー状態、マシンレジスターなど）を参照している。図３のルーチン「Ａ」は、それが実行するコンテキストを有していて、ルーチン「Ｂ」は、それが実行する別のコンテキストを有している。任意のルーチンが実行し得る前にコンテキストが確立されている必要があることが当業者に知られている。
ライターＢの視点からの動作
好適実施例において、ＢＡＳＩＣプログラムは、ＢＡＳＩＣプログラムを用いた特別関数呼び出しＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（ｃｏｎｔｅｘｔ）を実行することによって別のシステムコンポーネントが使用するためのコルーチンとして登録されていて、「ｃｏｎｔｅｘｔ」は、ＢＡＳＩＣプログラム実行の間、呼び出し時点において実施中のプログラム環境を参照している。ここに、引数を渡すために使用されるこの関数及びシステム変数の使用を示すＢＡＳＩＣプログラム例がある。このプログラムは、後で与えられるＣ言語プログラムを用いて動作する。
【００２２】
【表１】
0005421914.tif 000002
【００２３】
このプログラムの説明を後で詳細に１行ずつ与える。この時点では概要だけを最も重要な概念を対象にするために与える。
行２０の命令文が、端末を開放するためにＢＡＳＩＣプログラムを分離し、それからＢＡＳＩＣプログラムが実行される。これが実行されなかった場合、端末は、後でＢＡＳＩＣプログラムがコルーチンとして登録されるとき、使用不可能として表示される。命令文ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（１）が実行されるまでＢＡＳＩＣプログラムは、望まれ得る任意のタイプの計算を実行し得る。
【００２４】
行４０のＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（１）が最初に呼び出されたとき、イールドするコンテキストがまだ存在しないので、コルーチンの初期化が実行される。ＢＡＳＩＣプログラムの現在のコンテキストがコンテキスト１（ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）に対する引数）としてセーブされ、その後、ＢＡＳＩＣが後でコルーチンとしてイールドされるとき、望ましくない副作用又は危険な副作用、例えば問題（sensitive）な非リアルタイムコンポーネントの発生を防ぐための本発明によるいくつかの変更が、そのコンテキストに実行される。前述されたようにこれらの変更は必要であって、ＢＡＳＩＣプログラムが後で別のシステムプロセス（図３のルーチン「Ａ」）からコルーチンとしてイールドされたとき、ＢＡＳＩＣプログラムは、実際には、ＢＡＳＩＣとしてではなく、そのプロセスの一部としてずっと実行しているからである。
【００２５】
本発明によって問題（sensitive）な非リアルタイムコンポーネントに対して実行される変更は、以下である。
・命令文「ＰＲＩＮＴ」からのありとあらゆる端末出力又はエラーメッセージが無視され、表示されない。
【００２６】
・命令文「ＩＮＰＵＴ」からの端末入力又はＢＡＳＩＣプロンプトに返却された結果を読み出す任意の試行がＢＡＳＩＣからの速やかな退出をもたらし、制御が、呼び出しているシステムプロセスに逆にイールドする。
【００２７】
・（好適実施例において、ＢＡＳＩＣプログラムを終了するために使用される）命令文「ＢＹＥ」の実行が、ＢＡＳＩＣから速やかな退出をもたらし、制御が、逆に呼び出しているシステムプロセスにイールドする。
【００２８】
・望ましくない副作用を有し得る別の任意の特殊アプリケーション指向の関数が利用不可であって、実行された場合、タッパブル（ｔａｐｐａｂｌｅ）エラーをもたらす。
一方、これらのコンテキスト変更の目的は、コルーチンとしてＢＡＳＩＣを呼び出すシステムプロセスがＢＡＳＩＣコルーチンの間、リソースを待つか又は望ましくない動作どちらか一方を実行することを防ぐことである。コルーチンは、「純粋計算」を実行していると想定されている。
【００２９】
ＢＡＳＩＣプログラムは、ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）の最初の実行前は、それが正常に実行できる任意のものを自由に実行可能であって、システムへのアクセスを制限するコンテキスト変更が、ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）が最初に実行された後だけに効力が生じることに留意されたい。
【００３０】
この初期化プロセスを完了後、ＢＡＳＩＣは、（この例において）コルーチンのコンテキスト１の使用が利用可能なことを、潜在的な任意のユーザー（ルーチン「Ａ」）に示すフラグを設定する。コルーチンインターフェースの初期化後、ＢＡＳＩＣプロセスは、コルーチンとして実行中、致命的エラーがＢＡＳＩＣプログラム内で発生しているか又はプログラムが明示的に退出することを要求されているかどちらか一方の信号を受信するまで休止状態に入る。好適実施例において、この信号は、オペレーティングシステムのイベントであるが、適切な任意の信号手段が使用され得る。ＢＡＳＩＣプロセスは、コルーチンとしてそれがイールドされる前に、そのセーブされているコンテキストに対し、その後のどのような変更も防ぐためにこの休止状態に入る必要がある。
【００３１】
かくして、システムソフトウェアがコルーチンインターフェースを介し後でＢＡＳＩＣにイールドしたとき、ＢＡＳＩＣプログラムのコンテキストは、命令文ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（１）が最初に実行されていて、ＢＡＳＩＣプログラムがコルーチンとしてその時点から実行を途切れなく再開したとき、厳密に前の状態になっている。システムの残り（具体的にはシステムスケジューラー）については、コルーチンとしてＢＡＳＩＣにイールドされたシステムソフトウェアが、それ自身のプロセス内の関数呼び出しを単純に実行していて、元のＢＡＳＩＣプロセスは、休止状態のまま留まっている。これは、本発明における重要な概念である。
【００３２】
行４０において、システムソフトウェア（ルーチン「Ａ」）が、ＢＡＳＩＣコルーチンにイールドしたとき、ＢＡＳＩＣプログラムは、関数ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）の呼び出しから「戻った」ように示される。プログラムは、その後、「引数渡し」で後述されるように、それに渡される任意の引数にアクセスし、所望の任意の計算を実行し得る。結果は、その後、返される。一般に、プログラムは、その後、同一の関数ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）の呼び出しにループ・バックするが、これは要求されない。本例においては、行３０の命令文「ＲＥＰＥＡＴ」及び行２９０の命令文「ＵＮＴＩＬ  ０」が無限ループ構造を構成するので、これが生じる。関数ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）の呼び出しが再び実行されるとすぐに、その時点におけるＢＡＳＩＣのコンテキスト（ルーチン「Ｂ」）がセーブされ、制御は、前にそれがＢＡＳＩＣにイールドされた時点におけるシステムソフトウェア（ルーチン「Ａ」）に逆にイールドされる。再び、これを図３に示す。
【００３３】
当業者は、上記示されているものを代用するために記述され得る効果的な無制限数のあり得るＢＡＳＩＣプログラムが存在することに気づくだろう。本例は、関与する原理を単に示すことを意味していて、限定する方法で捉えられるべきでない。
引数渡し
ＢＡＳＩＣプログラムがいくつかの有用なデータ処理を実行するためのルーチン「Ａ」からルーチン「Ｂ」に往復して引数を渡すための仕組みを明確にする必要がある。これは、いくつかの変数が定義されている共有記憶領域を指定することによって実行され得る。ルーチン「Ａ」が、適切な値を変数にストアし得、ルーチン「Ｂ」が、その後、それらをリトリーブし得る。同様に、ルーチン「Ｂ」が、結果を変数にストアし得、ルーチン「Ａ」が、その後、それらの結果をリトリーブし得る。好適実施例において、ＢＡＳＩＣインタープリターは、読出し専用変数、書き込み専用変数、及び読出し書き込み変数の概念を支援する。従来のルーチン「Ａ」は、「ライターＢ」が入力として使用し得るいくつかの変数にアプリケーション特有の値をストアする。入力を渡し、結果を返すための同一の読出し書き込み変数の使用は、利点を有していて、入力に対する変更が要求されない場合、正確で不変の値が自動的に返却される。
上記ＢＡＳＩＣプログラムの詳細説明
ここで、上記与えられたＢＡＳＩＣプログラム例を詳細に説明する。このプログラムは、本発明によって教示されている特定の関数の使用を例示しているが、このコルーチンインターフェースを介し、呼び出されるＢＡＳＩＣプログラムによる別の多くのデータ操作の例が同業者に浮かぶだろう。したがって、この例を制限として捉えるべきでない。
【００３４】
行１０において、プログラムは、変数ＮＥＷＬＩＮＥ＄に改行文字（ＡＳＣＩＩ  ２０）を含む文字列を設定する。これは後で使用される。行２０において、プログラムは、プログラムを端末から分離するための関数を呼び出し、プログラムが後でコルーチンとして登録されたとき、端末が使用不可能に示されることを防ぐために起動される。行３０は、行３０から行２９０に及ぶ無限ループ構造を定義する。行４０によって、ＢＡＳＩＣは（最初だけ）詳細に前述したコンテキスト変更を実行し、その後、システムに逆にイールドし、システムからのその後の呼び出しをコルーチンとして待つ。システムがＢＡＳＩＣプログラムの呼び出しを必要とするとき、それは、いくつかの入力パラメータを設定し、その後、逆にＢＡＳＩＣにイールドする。行５０において、これがＢＡＳＩＣプログラムを実行再開させる。
【００３５】
この時点において、このＢＡＳＩＣプログラムの例の目的を再び述べることが有用である。システム管理者が、高トラフィックの間（例えば０８：００から１６：５９までの期間）実行される呼び出しに対するＳＤＰオファー処理を所望するため、これら呼び出しに対して要求されるネットワークリソースがより少なくなる。具体的に管理者は、時間０８：００から１６：５９までの間、ＳＤＰに提示されているいくつかのコーデック（符号化器／復号化器）選択を削除するためにＳＤＰオファー内部のデータ変更を所望する。これは、その期間、実行される呼び出しに対するデータ中の要求される場所において、ＳＤＰデータから「０」及び／又「８」を削除するということになる。
【００３６】
行５０において、ＢＡＳＩＣプログラムは、関数ＬＥＦＴ（ＴＩＭＥ＄，２）を呼び出す。
変数ＴＩＭＥ＄は、現在のウォール時刻の文字列（例えば「０９：２３：５０」）を返すシステム変数である。関数ＬＥＦＴは、この文字列の左の２つの文字を変数ＨＯＵＲ＄として抽出する。行６０において、システム変数ＷＯ＿ＡＲＧ１を０に設定する。この従来の変数は、ＢＡＳＩＣからシステムに渡される戻り値の１つである。それに０を設定することによって、プログラムは、ＳＤＰ動作が実行されなかったことを示す。そうでない場合、後で０でない値に設定し、これが状態の応答としてシステムに返却される。行７０において、現在のウォール時刻が、ＳＤＰ動作が発生する予定の数時間である０８：００と１６：５９との間にあるか決定するチェックが、実行される。要求されている期間中でなければ、命令文は、結果「偽」を評価し、制御は行２８０にスキップされ、そこから行２９０にスキップされる。行２９０において、命令文ＵＮＴＩＬ  ０が常に、条件「偽」（０を「偽」とみなす）を評価し、制御が行３０に戻され、その後、ＢＡＳＩＣが再びシステムに逆にイールドする行４０に戻る。どのようなＳＤＰ動作も生じなかったので、呼び出しは元のＳＤＰオファーを進める。
【００３７】
しかしながら、行７０において、現在のウォール時刻が０８：００から１６：５９までの期間内にある場合、命令文ＩＦが結果「真」を評価し、制御が行８０に渡される。行８０において、変数ＳＤＰ＄が、ＲＷ＿ＡＲＧ＿１＄に設定される。変数ＲＷ＿ＡＲＧ＿１＄は、従来のコルーチンが呼び出されたとき、システムによってＢＡＳＩＣに渡される入力引数の１つである。それは、元のＳＤＰオファーデータを表している。それは、読み出し書き込み変数であるので、ＢＡＳＩＣプログラムによって変更され得、システムにその結果として逆に返され得、この場合、これは、確実に発生することである。行８０において、変数ＳＤＰ＄にストアされているデータが、端末に印刷される場合、以下のように表示される。
【００３８】
【表２】
0005421914.tif 000003
【００３９】
上記の行それぞれは、ＡＳＣＩＩ  １０（改行）の文字を用いて終了している。行９０において、関数ＩＮＳＴＲは、テキスト「ｍ＝ａｕｄｉｏ」に関する文字列を検索し、それが見つかった文字列に「ＰＯＳ１」を設定する。行１００は、ＩＮＳＴＲが文字列を見つけたかチェックする（ＩＮＳＴＲは、文字列が見つからなかった場合、０を返す）。「ｍ＝ａｕｄｉｏ」がＳＤＰ内に見つからなかった場合、ＰＯＳ１が０になって、制御が行２７０にスキップし、前述のように最終的に行４０まで戻る。しかしながら、文字列「ｍ＝ａｕｄｉｏ」が見つかった場合、行１１０に移動し、ＳＤＰオファー内の文字列「ＲＴＰ／ＡＶＰ」を見つけようとする。一方、これが見つからない場合、行１２０のＰＯＳ２が０になって、行２６０にスキップし、その後、行４０に戻る。しかしながら、「ＲＴＰ／ＡＶＰ」が見つかった場合、「０」文字列を検索する行１３０にスキップする。前に示されたＳＤＰの例においては、これがボールド字体の「０」として見つかる。ＳＤＰに対する規則によって、行末のこの値は（本例においては値「１０１」も配置される）出現が許されているので、ＳＤＰオファーの行それぞれを終了する改行文字の後にくる「０」に対してもチェックする必要がある。行１４０において、これがチェックされる。行１５０が、どちらか一方の方法によって「０」を見つけたかチェックし、見つかった場合、行１６０が、元のＳＤＰの「０」の直前までの左部分（関数ＬＥＦＴ）を元のＳＤＰの「０」を超えて始まる右部分（関数ＲＩＧＨＴ）と連結することによって、新しいＳＤＰオファーテキストを作成する。これはＳＤＰオファーから「０」を削除する効果を有している。同様に行１９０〜２４０は、ＳＤＰオファーから「８」を削除する。双方の場合ともに、行１７０及び行２３０は、ＳＤＰ動作が成功したことをシステムに示す１を、システムの返却状態変数に設定する。最終的に行２５０において、新しいＳＤＰオファーが、読み出し書き込み変数ＲＷ＿ＡＲＧ＿１＄に逆にストアされ、システムに逆に渡される。その後、再び制御が行４０に戻り、ＢＡＳＩＣがシステムにイールドする。ここでシステムソフトウェア（ルーチン「Ａ」）は、ＢＡＳＩＣプログラム（ルーチン「Ｂ」）によって変更されたＳＤＰオファーに進む。
コルーチン多重コンテキスト
上記の例は、ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（１）を使用している。アクティブコルーチンの１より大きいコンテキストが存在し得る。例えば、システムソフトウェアが、従来によるＳＤＰデータ変更用にコンテキスト１を使用するためにコード化されている場合、コルーチンとしてこれを処理するＢＡＳＩＣプログラムは、ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（１）を使用する。コンテキスト２を使用するコード化された独立した別の処理（例えばＳＩＰ変更又はデバッガー）があり得る。別のＢＡＳＩＣプログラムは、これらのサービスに対し使用されるＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（２）を実行する。
「ライターＡ」の視点からの動作
前述したように「ライターＡ」は、Ｃ言語プログラムでシステムソフトウェア（ルーチン「Ａ」）を記述していて、それが、その後、コンパイルされ、リンクされ、製造者によって提供される情報通信システムソフトウェアの一部になると仮定する。以下に与えられるコードフラグメントに示されているように、このＢＡＳＩＣコルーチン（ルーチン「Ｂ」）を呼び出すコードの適切な時点のいくつかのステップが取り上げられているが、本プロセスは、実際、直接的な関数呼び出しに過ぎない。
【００４０】
【表３】
0005421914.tif 000004
【００４１】
上記Ｃ言語コードフラグメントの詳細説明
上記のコードフラグメントは、かなり直接的である。最初の命令文「ｉｆ」は、コンテキストが利用可能か否か確認するためのデータ構造変数をチェックする。ＢＡＳＩＣプログラムがまだ実行されておらず、その関数ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）が実行された場合、この変数はまだ０であって、どのような呼び出しもＢＡＳＩＣプログラムに対し実行されない。ＢＡＳＩＣプログラムがコルーチンインターフェースを初期化してない場合、この変数は０にならず、「ｉｆ」本体が実行される。
【００４２】
「コンテキストインデックス」は、ＢＡＳＩＣから実行される関数ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）呼び出しに使用される引数と一致する１に設定される。それを使用する別のＣ言語プログラムとともに実行する別のＢＡＳＩＣコルーチンが存在し得、この第２のプログラムの組は、従来の異なる「コンテキストインデックス」値（例えば２）の使用と一致する。
【００４３】
次の命令文は、ＢＡＳＩＣプログラムが変更するＳＤＰ文字列（「ｓｄｐ＿ｄａｔａ」）へのポインタを入力引数「ｒｗ．ｓｔｒ＿ａｒｇ」に設定する。これはＢＡＳＩＣへの読み出し書き込み変数であるので、変数「ｍａｘ＿ｌｅｎ」が、その文字列にストアするとき利用可能な記憶容量をＢＡＳＩＣに示すために設定される。これによってＢＡＳＩＣが、割り当てられた記憶容量を超えてこの文字列に対する記述することを防ぐ。次の命令文は、返却状態の値を初期化し、ＢＡＳＩＣプログラムが何らかの理由で値を設定しない場合、「真」をデフォルトとする。
【００４４】
変数「ｊｏｂ＿ｃｏｎｔｅｘｔ」は、その後、０ではない任意の値（本例においては「１」）に設定される。これは、呼び出される関数ｂａｓ＿ｃｏｎｔｅｘｔ＿ｓｗａｐ（）を示していて、それを（コルーチン初期化が実行されたとき）最初に呼ぶのではなくて、既に実行中のＢＡＳＩＣコルーチンとコンテキストスワップを単純に実行したいときに呼び出す。（ＢＡＳＩＣプログラムがその関数ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）の呼び出しを実行したとき、ｂａｓ＿ｃｏｎｔｅｘｔ＿ｓｗａｐ（）も呼び出されるが、「ｊｏｂ＿ｃｏｎｔｅｘｔ」変数は、最初、０であって、前に論述されたようなコルーチンの初期化が実行される。）
ここで関数ｂａｓ＿ｃｏｎｔｅｘｔ＿ｓｗａｐ（）が呼び出される。これは、最後に実行された命令文ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）の後の命令文においてＢＡＳＩＣにイールドするコンテキストスワップを実行する。ＢＡＳＩＣが引数をフェッチし、その処理をし、その結果をシステム変数にストアする。
【００４５】
ＢＡＳＩＣプログラムが、同一命令文ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）又は別の命令文ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）のどちらか一方を実行するとき、制御は、このＣ言語コードフラグメントに逆にイールドされ、ｂａｓ＿ｃｏｎｔｅｘｔ＿ｓｗａｐ（）に対する呼び出しに戻る。このＣ言語コードフラグメントは、その後、システム変数から任意の結果を取得し得る。次の命令文「ｉｆ」は、その動作においてＢＡＳＩＣプログラムが成功したか否かを示すために使用される従来のこれらの変数の１つ（「ｗｏ．ｉｎｔ＿ａｒｇ」）をチェックする。変数「ｓｄｐ＿ｄａｔａ」は、場合によってはＢＡＳＩＣプログラムによって変更され、Ｃ言語コードフラグメントによって、ここでユーザーは、更に利用可能である。
ＢＡＳＩＣとＣ言語コルーチン引数との間の通信
以下の表は、Ｃ言語コードフラグメントの例及びＢＡＳＩＣプログラムの例における構造エレメントとの間の関係を示す。
【００４６】
【表４】
0005421914.tif 000005
【００４７】
コンテキストスワップの実行
コルーチンの原理、インターフェースの初期化において実行されるステップ並びにコルーチン関係において作動するＢＡＳＩＣプログラム及びＣ言語コードフラグメントの特定の例を論述してきた。ここで、Ｃ言語コルーチンとＢＡＳＩＣコルーチンとの間に制御を渡し、コルーチンのコンテキストスワップを実行する実際のルーチンを説明する。これは、ＢＡＳＩＣが関数ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）を呼び出すとき又はＣ言語コードフラグメントが関数ｂａｓ＿ｃｏｎｔｅｘｔ＿ｓｗａｐ（）を呼び出すときに呼び出される一般的なコードである。
【００４８】
このコードは、マシンレジスターを含むプログラムコンテキスト全体をセーブし、プログラムスタック（後入れ先出し法でアクセスされ、高水準言語で直接アクセスされ得ない記憶領域）を予約する必要がある理由からこのコードは、機械語で正常に記述される必要がある。コンテキストスワップコードをもっと十分に説明するために流れ図を図４に与え、その流れ図の説明を後にする。
【００４９】
言及したようにこの一般的なコードは、関数ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）が呼び出されるときのＢＡＳＩＣ及び関数ｂａｓ＿ｃｏｎｔｅｘｔ＿ｓｗａｐ（）が呼び出されるときのＣ言語コードフラグメント双方から呼び出される。このコードは、最初に、ＢＡＳＩＣプロセス内で実行中のＢＡＳＩＣプログラムがＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）を最初に呼び出した時、呼び出される。図４を参照されたい。（１０１）において、処理を開始する。（１０２）において、要求されるジョブコンテキスト情報すべてが、現在の（ＢＡＳＩＣの）ジョブスタックにストアされる。前述したようにスタックは、現在のジョブ（ＢＡＳＩＣ）の正常動作中、既にストアされているジョブコンテキスト項目の多くを含んでいるが、この付加情報は、マシンレジスターの情報及び正常にストアされなかったその他の情報を含んでいる。全体にこの情報は、後で本プログラムを再開するために要求されるあらゆるものを含んでいる。（１０３）において、これが、このコードが呼び出された１回目であるかチェックが実行される。１回目なので（１０４）に続く。ステップ（１０４）において、前に言及されたように、現在セーブされているＢＡＳＩＣプログラム環境をコルーチンとしてＢＡＳＩＣプログラムが後で呼び出したとき、危険な副作用を防ぐように変更される。このプロセスを後で更に詳細に説明する。（１０５）において、新しいスタック領域がＢＡＳＩＣプログラム用に設定され、（１０６）において、セーブされたコンテキストを任意の方法によって、阻害せずに休止状態に安全に入ることができる。これは、リストアされたコンテキストが厳密に同一でない場合、セーブされたコンテキストが後でリストアされ、コルーチンとして正しい動作が不可能になるので重要である。ここで元のＢＡＳＩＣプロセスは、休止状態にあって、この時点から進行しない。
【００５０】
ここでＣ言語コードフラグメントが、関数ｂａｓ＿ｃｏｎｔｅｘｔ＿ｓｗａｐ（）を実行することによって、このコードを呼び出す。再び（１０１）において開始する。厳密に同一コードを実行しているが、この呼び出しは、ＢＡＳＩＣプロセスからもたらされるのではなく、Ｃ言語コードフラグメントを含むシステムプロセスからもたらされる。（１０２）において、要求されるジョブコンテキスト情報すべてが、現在のジョブスタックにストアされているが、それは、今回、Ｃ言語コードフラグメントを含むシステムプロセススタック及びコンテキストになる。（１０３）におけるチェックは、これが呼び出された１回目でないことを決定するので（１０７）に続く。現在のコンテキストへのポインタは、（コンテキストからの退出を意味する）ＦＲＯＭポインタとして、ＢＡＳＩＣ及びＣ言語コードフラグメント双方にアクセス可能な記憶領域にセーブされる。（１０８）において、既にセーブされているコンテキストへのポインタは（コンテキストに入ることを意味する）ＴＯポインタとしてフェッチされる。（１０９）において、前のコンテキストがリストアされる。これは、前にＢＡＳＩＣがこのコード呼び出したとき、セーブされたコンテキストである。（１１０）において、このコードは戻る。図２に示されているように、通常の階層的な関数は、それを呼び出したプログラムに戻る。しかしながら、図３に示されているコンテキストスワップが、コルーチンとして機能するこのコードをもたらす。したがって（１１０）において、制御は、そのコンテキストが前にセーブされたＢＡＳＩＣコルーチンに戻る。このコードは、Ｃから呼び出されるが、ＢＡＳＩＣに戻る。
【００５１】
ここでＢＡＳＩＣプログラムが実行中であって、それがいくつかの時点において、関数ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）を呼び出す。（１０１）において、再び、このコードが呼び出される。（１０２）において、再び、現在のコンテキスト（今回、ＢＡＳＩＣのコンテキスト）がセーブされ、（１０３）において、再び、制御が、現在のコンテキストポインタをストアしている（１０７）に渡され、（１０８）及び（１０９）において、セーブされたＣ言語コードフラグメントのコンテキストがリストアされる。（１１０）において、再び戻るが、呼び出し元に戻るのではなくて、図３のようにＣ言語コードフラグメントに戻る。このコードは、今回、ＢＡＳＩＣから呼び出されているが、Ｃに戻る。実際、図３において、左のルーチン「Ａ」と右のルーチン「Ｂ」とリンクしている実線矢印（５５）は、ルーチン「Ａ」の役割を果たすＣ言語コードフラグメント及びルーチン「Ｂ」の役割を果たすＢＡＳＩＣプログラムを用いたこのコンテキストスワップコードへの単純呼び出しに過ぎない。
ＢＡＳＩＣプログラム環境の変更
前に言及された本発明の別の目的は、ＢＡＳＩＣプログラム環境が危険な副作用を防ぐコルーチンとして使用されるとき、それが変更され得る方法を教示することである。この環境は、最終的に、ＢＡＳＩＣインタープリターが入力／出力を実行し、システムリソースにアクセスするために呼び出す関数群ということになる。好適実施例において、これら機能のすべてに対するアクセスは、間接的な「コールバック関数」として知られているものを使用している。ＢＡＳＩＣインタープリターが最初に呼び出されたとき、ＢＡＳＩＣがシステムリソースへの入力／出力及びアクセスに対し使用する予定の関数アドレスリスト（図５の「コールバック関数アドレスリスト」（６２））が渡される。ＢＡＳＩＣは、その後、このリストから必要な関数アドレスを得ることによって、これらの関数を間接的方法で呼び出し、その後、それを呼び出す（図５）。図２に示されているように、通常の方法で関数を直接呼び出す代替手段は単純である。
【００５２】
コールバック関数を使用する１つの利点は、プラットフォーム独立であって、ＢＡＳＩＣインタープリターが特定の入力／出力及びプラットフォームのシステム・インターフェース要件にも結合されないので、それによってＢＡＳＩＣ言語自体を用いた排他的に処理する「純粋コード」のまま、留まり得るからである。しかしながら、本発明において、コールバック関数の使用は、コルーチンとして実行するとき、ＢＡＳＩＣプログラム環境を変更するための非常に柔軟で効率的な手段も提供する。コルーチンが最初にアクセスされ、ＹＩＥＬＤ＿ＴＯ＿ＳＹＳＴＥＭ（）が最初に呼ばれたとき、図４のコンテキストスワップコード（１０４）は、コルーチンとして実行するとき、危険であると考えられるものに対し新しい機能アドレスを代用し、このコールバック関数リストを変更する。特定の機能だけが代用されることを必要とするのでこれは、柔軟な方法である。１つのアドレスの代替が、ＢＡＳＩＣ内のその機能に対する呼び出しすべてを自動的に対象とするので、それは効率的でもある。例えば、図５の（６３）における「Ａ」の元の関数が端末入力を処理する関数であって、コルーチン中にあるとき、この関数を利用不可にすることを所望された場合、（６２）の「Ａのアドレス」エントリーが変更され得、それは端末入力を実行しない別の関数（６４）のアドレスを含んでいるが、おそらく誤りを報告する。一旦、この代替が実行されると、ＢＡＳＩＣインタープリターから「Ａへの関数呼び出し」すべて（図５に示されている関数「Ａ」への２つの呼び出しが存在する）が、新しい関数（「関数Ａに対する代替コード」）を使用し、自動的に開始する。
【００５３】
このコールバック関数を代用する方法が使用されない場合、ＢＡＳＩＣインタープリター内の潜在的に危険な関数呼び出しが実行されるあらゆる時点において、その時点で（元の関数か又は新しい関数）の呼び出しをチェックするためのコードが存在している必要がある。関数呼び出し発生それぞれが別個に処理される必要があるので、このチェックは、リアルタイムシステムにおいて容認できないランタイム時のプロセッサーオーバーヘッドを招き、エラーが発生しやすい。コールバックアドレスの代用は、コルーチンインターフェースが最初に初期化されるとき、一度だけ実行されることが必要とされる。
【符号の説明】
【００５４】
５  システムスケジューラー
１０  ＢＡＳＩＣプロセス
２０  その他のシステムプロセス
３０  プロセス間メッセージキュー
４１  ルーチンＡ
４２  ルーチンＢ
４３  ルーチンＣ
４４  ルーチンＤ
５１  ルーチンＡ
５２  ルーチンＢ
５５  呼び出し
６１  ＢＡＳＩＣインタープリター
６２  コールバック関数アドレスリスト
６３  元のコード
６４  代替コード
【図１】
0005421914.tif 000006
【図２】
0005421914.tif 000007
【図３】
0005421914.tif 000008
【図４】
0005421914.tif 000009
【図５】
0005421914.tif 000010