JP4611245B2 - コンピュータ装置およびストリングクラスのオブジェクトを操作又はアクセスする方法 - Google Patents

コンピュータ装置およびストリングクラスのオブジェクトを操作又はアクセスする方法 Download PDF

Info

Publication number
JP4611245B2
JP4611245B2 JP2006153915A JP2006153915A JP4611245B2 JP 4611245 B2 JP4611245 B2 JP 4611245B2 JP 2006153915 A JP2006153915 A JP 2006153915A JP 2006153915 A JP2006153915 A JP 2006153915A JP 4611245 B2 JP4611245 B2 JP 4611245B2
Authority
JP
Japan
Prior art keywords
class
text
string
memory
string class
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2006153915A
Other languages
English (en)
Other versions
JP2006302303A (ja
Inventor
マイヤーズ,ニコラス,サイモン
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nokia Oyj
Original Assignee
Nokia Oyj
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nokia Oyj filed Critical Nokia Oyj
Publication of JP2006302303A publication Critical patent/JP2006302303A/ja
Application granted granted Critical
Publication of JP4611245B2 publication Critical patent/JP4611245B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4432Reducing the energy consumption
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Devices For Executing Special Programs (AREA)
  • Mobile Radio Communication Systems (AREA)
  • Executing Machine-Instructions (AREA)

Description

本発明は、コンピュータ用のオブジェクト指向オペレーティングシステムの改良に関する。本発明は特に、C++プログラミング技法に基づいたオペレーティングシステムに関する。 このオペレーティングシステムの市場で入手可能な実施形態は、英国のPsion Software Plcで製造されるEPOC32オペレーティングシステムである。EPOC32はモバイルコンピュータ環境に適したオペレーティングシステムである。
C++言語は、パーソナルコンピュータなどのコンピュータ用のアプリケーションプログラムを記述するのに広く使用されているが、オペレーティングシステムを記述するのには、まれにしか用いられていない。パーソナルコンピュータ用のオペレーティングシステムを記述するときには、通常、実行可能コードのサイズを最小化すること、あるいはプログラム内でステップを実行するのに必要なサイクル数を最小化するという用件は優先されない。一般的には、性能と記述の容易さがより重要な用件である。
とくになし
しかしながら、他の状況では、(例えば、それを格納するROMおよび/またはRAMの容量を最少とするため)実行可能コードの占めるスペースを最小としなければならず、(例えば、消費電力を最少とするため)最小数のサイクルで実行する必要が生じる場合がある。
モバイルコンピューティング(例えば、パーソナルデジタル支援機器:PDA)、スマートフォン(例えば、ワードプロセッサが組み込まれ、ファクシミリの送受信およびインターネットの閲覧が可能なGSMセルラ電話)およびネットワークコンピュータ(NC)環境は、オペレーティングシステムのコードサイズを最小化することが利点となる環境の実例である。すなわち、最小化によって、主にハードウェア(特にROMおよび/またはRAM)のコストを削減することができる。広範囲に及ぶ消費材への適用は一般的に比較的低価格のハードウェアに依存しているので、この点は上記状況において特に重要である。同様に、モバイルコンピューティングおよびスマートフォンの範疇においては、プロセッサの実行サイクルを最小化することは、消費電力を最少化し、消費電力の最少化はバッテリの長寿命化に不可欠であるので、非常に重要である。C++で記述され十分に設計されたオペレーティングシステムは、通常、サイズが相当大きく電力をかなり消費するものとなる。従って、これはモバイルコンピューティング、スマートフォンおよびNC環境に適さない。
更に、コードサイズとオーバーヘッドサイクルの厳しい要求、特に、モバイル、スマートフォンおよびNCコンピューティング環境に関する厳しい要求を満たし、十分に機能的なオペレーティングシステムをC++で設計するのは、一般的に困難であると考えられている。
用語
「ストリングクラスのオブジェクト」
C++では、テキスト(例えば、コンピュータの画面に実際に現れる文字のストリング)は「オブジェクト」として表わされる。C++または他のオブジェクト指向言語の当業者は、このカテゴリ化に精通しているであろう。このようなテキストに関連したオブジェクトは、「ストリングクラスのオブジェクト」と呼ばれる特定のタイプである。オブジェクトが属するクラスの種類(例えば、テキストの場合はストリングクラス)は、そのオブジェクトに実行することが許される操作を規定する。ストリングクラスには一定の操作(例えば、2つのテキストストリングをまとめて連結する)だけが行える。従って、ストリングクラスのある特定のオブジェクトは、特定のテキストストリングを表わしている。それは特定の、十分に定義された方法でのみ操作される。
テキストがファイリングシステムのファイルに存在するとき、テキストの項目からストリングクラスのオブジェクトを生成するためには、従来のC++プログラミングでは以下のステップが実行される。
・メモリ内のバッファ位置をずらす
・ファイル読み取りサービスを使用してテキストをバッファに読み込む
・ストリング生成サービスを使用してバッファされたデータをストリングクラスのオブジェクトに変える
・バッファの内容を破棄する
C++ではテキストストリングの実際の格納位置を識別するのは困難であるが、テキストストリングの位置を知る必要はない。なぜなら、直接操作するのはストリングクラスのオブジェクトであり、その結果実際のテキストストリングが操作される。従って、ストリングクラスのオブジェクトは、事実上テキストストリングのメモリ位置を知っており、テキスト操作に関連する必要なメモリ管理タスクの全てを扱うことができる。
ストリングクラスのオブジェクトの多重クラス
ANSI/ISOのC++標準の草案として知られるC++のバージョンでは、ストリングクラスの全てのオブジェクトは(<string>として参照される、上記標準のスタンダードライブラリの草案の部分のストリングクラスで例示されているように)、洗練されたメモリ管理タスクが遂行されるような方法で処理される(例えば、バッファスペースを拡張したり、縮小したり、結合できる、すなわち、完全に動的な、テキスト用のバッファスペースの再配置)。しかし、このレベルのメモリ管理は、大量のコードを使用し、かなり大きいスペースを必要とする。
ここで従来のC++のメモリ管理の2つの例を示す。
例1:C++のリテラルテキストの処理
C++では、ソースコードがテキストストリングを含むインスタンスが多数ある。これらのテキストストリングは「リテラルテキスト」として知られ、ソースコードを実行可能なオブジェクトコードへとコンパイルする時に、リテラルテキストはバッファメモリに永久的に格納される。リテラルテキストが操作されるとき、ストリングクラスのオブジェクトは、そこから生成されなければならない。しかしながら、このストリングクラスのオブジェクトの生成することで、メモリ内にテキストストリングが生成されることになり、このテキストストリンは、新たに生成されたストリングクラスのオブジェクトによって実際に操作されることになる。要するに、テキストストリングがメモリ内で複製されるのである。すなわち、テキストストリングは、ソースコードのコンパイルによって生じるオリジナルバッファで一度生成され、さらに、テキストの操作を可能とするストリングクラスのオブジェクトに関連したメモリ位置で再度複製される。
上記のように、あるコンピュータ環境では、コード空間および消費電力は重要である。しかしながら、(ANSI/ISOのC++標準の草案で実現されるような)従来のC++では、リテラルテキストの固有の複製を解消する機構がない。オペレーティングシステムではリテラルテキストを扱わなければならない場合が多数あるので、これはオペレーティングシステムでは特に問題である。
例2:C++の長さが制限されたテキストの処理
C++では、プログラマはヒープメモリを使用してテキストを処理する。長さが制限されたテキストは、長さが制限されていないテキストの処理に必要な十分に柔軟な手法を実際には必要としない。それにもかかわらず、従来のC++では、テキストの長さに関係なく、ストリングクラスのオブジェクトに十分特徴付けられた、十分に柔軟な機構しかなく、それ以外の機構がない。ヒープメモリの取り扱いはコードおよびサイクルを集中的に使用するので、これは、メモリ管理コードにおけるオーバーヘッドを大きくする。
C++の全体にわたるテキストのメモリ管理は、コードおよびサイクルを集中的に使用する。コード空間および消費電力はモバイル環境では重要であるので、従来のC++の手法では、受容できないほどコードサイズが大きく、かつ、電力も大量に消費するオペレーティングシステムとなってしまう。
本発明のオペレーティングシステムは、ストリングクラスのオブジェクト(例えば、ANSI/ISOのC++標準の草案で定義されるような)を、ストリングクラスのオブジェクトの3重構造、主に3つの新しいオブジェクトのクラスで置き換えることで再定義する。従来の、ANSI/ISOのC++標準の草案による<string>に機能的に関連し十分特徴付けられたメモリ管理関数は、3つの新しいクラスの全てに適用されない。十分に機能するものは多くの環境で有用であるが、コード空間および消費電力が重要なモバイルコンピューティング環境では(とりわけ)問題である。
従って、本発明の進歩的概念の一般化は、コンピュータのオペレーティングシステムに、テキストストリングを扱う3つの異なったクラス、すなわち、異なったクラスの各々が異なった状況に適している3つの異なったクラス、を提供することで、コードサイズおよびサイクルオーバヘッドを最小化することである。これは柔軟性を与える。すなわち、例えば、全ての機能を果たすメモリ管理関数は、今や実際にそれを必要とするテキストストリングにだけ適用されうる。
この新しいストリングクラスのオブジェクトのファミリを「ディスクリプタ(descriptor)」として参照することにする。好ましい実施形態では、このファミリのメンバを「ポインタディスクリプタ」、「バッファディスクリプタ」および「ヒープディスクリプタ」と呼ぶ。これらの概念は、当業者が親しんでいる「ポインタ」、「バッファ」および「ヒープ」の確立された概念とは(関連するが)異なることに注意が必要である。また、本明細書で想定するディスクリプタも、同じ名前のVMS設備や、アクティブオペレーティングシステムを識別するのに使用される小さな整数用のUNIX(登録商標)用語とは何の関係もないことにも注意が必要である。当業者には、テキストストリングを扱うクラスの数が3つを越えるようにオペレーティングシステムを設計することができることが理解されるであろう。そのような変形も本発明の範囲に含まれる。3重構造は、クラスの増殖(proliferation of Classes)としては最小(かつほとんど全ての場合にもっとも有効)である。
更に、ディスクリプタは好ましくはポリモルフィックであり、従って、単一のサービスが全てのディスクリプタに作用する。異なったディスクリプタの各々が別の方法で変更されたサービスを必要とするので、これによって、かなりのコードと、それより少ない程度でのオーバーヘッドの削減となる。
本発明の第1の態様によれば、テキストストリングに関するオブジェクトを扱うように構成されたオブジェクト指向オペレーティングシステムでプログラムされたコンピュータであって、前記オペレーティングシステムが、前記オブジェクトの全てを、各々が異なった機能を実行し、少なくともその1つがコードおよびサイクルオーバヘッドを減少するように変更されている、3つのクラス(主に、ポインタディスクリプタクラス、バッファディスクリプタクラスおよびヒープディスクリプタクラス)の1つに属するものとして扱うことを特徴とするコンピュータが提供される。
本発明は、コードおよびサイクルオーバヘッドをかなり減少させるためには、従来の単一形態のストリングクラスのオブジェクトを、(例えば)各形態が異なった状況に最適化された、3つの異なった形態のオブジェクトに置き換えて、オペレーティングシステムを再設計する必要があるという知見に基づいている。
本発明の好適な形態では、従来の、メモリを集中的に使用するテキスト処理技法は、そのような技法を要求するオブジェクトを定義する新しいディスクリプタクラス(すなわち、ヒープディスクリプタ)に属するオブジェクトにのみ適用される。しかしながら、ポインタおよびバッファディスクリプタクラスは、従来のストリングクラスと比べてコードおよびプロセッササイクルを減少させるように設計されている。
上記従来技術で記載した2つの例(すなわち、例1:C++のリテラルテキストの処理と、例2:C++の長さが制限されたテキストの処理)を使用して、本発明のオペレーティングシステムは、(i)リテラルテキストの複製の必要をなくすようにリテラルテキストを扱い、(ii)実際に必要な限られた状況でのみヒープメモリのコードの集中的使用を行うように実行時に動的に決定され、他の状況(例えば、プログラマが前もってテキストの最大長を知っているとき)では、代わりにスタティックメモリを使用して、テキストを扱う。特定の処理の更なる詳細は以下で行う。
好ましくは、オペレーティングシステムは同じ3重構造を用いて、テキストだけでなく生のデータも扱うように構成される。
先に定義したコンピュータ/オペレーティングシステムの組み合わせに加えて、他の進歩的態様も同様に扱うことができるであろう。例えば、そのようなオペレーティングシステムをインタフェースしなければならないあらゆるデバイスも、ストリングクラスのオブジェクト用の同じ3重構造を使用する必要がある。例えば、固体メモリデバイスのような周辺機器用ドライバソフトウェアは、この3重構造を使用する必要がある。周辺機器用制御パネルのソフトウェアも同様である。
従って、本発明の第2の態様では、テキストストリングに関するオブジェクトを扱うように構成されたオブジェクト指向オペレーティングシステムでプログラムされたコンピュータの周辺装置であって、前記オペレーティングシステムが、前記オブジェクトの全てを、各々が異なった関数を実行し、少なくともその1つがコードおよびサイクルオーバヘッドを減少するように変更されている、3つのクラス(主に、ポインタディスクリプタクラス、バッファディスクリプタクラスおよびヒープディスクリプタクラス)の1つに属するものとして扱うこと、さらにまた前記周辺装置が、オブジェクトを前記3つのクラスにはいるものとして扱うようにプログラムされていることを特徴とする周辺装置が提供される。
本発明の第3の態様では、テキストストリングに関するオブジェクトを扱うように構成され、コンピュータで読み取り可能な媒体にコード化されたコンピュータのオペレーティングシステムであって、前記オペレーティングシステムが、前記オブジェクトの全てを、各々が異なった関数を実行し、少なくともその1つがコードおよびサイクルオーバヘッドを減少するように変更されている、3つのクラス(主に、ポインタディスクリプタクラス、バッファディスクリプタクラスおよびヒープディスクリプタクラス)の1つに属するものとして扱うことを特徴とするオペレーティングシステムが提供される。
本発明の第4の態様では、テキストストリングに関するオブジェクトを扱うように構成されたコンピュータのオペレーティングシステムを使用してマイクロプロセッサを操作する方法であって、前記オペレーティングシステムが、前記オブジェクトの全てを、各々が異なった関数を実行し、少なくともその1つがコードおよびサイクルオーバヘッドを減少するように変更されている、3つのクラス(主に、ポインタディスクリプタクラス、バッファディスクリプタクラスおよびヒープディスクリプタクラス)の1つに属するものとして扱うことを特徴とする方法が提供される。
第5の態様では、テキストストリングに関するオブジェクトを扱うように構成されたコンピュータのオペレーティングシステムでコード化された、コンピュータで読み取り可能な媒体であって、前記オペレーティングシステムが、前記オブジェクトの全てを、各々が異なった関数を実行し、少なくともその1つがコードおよびサイクルオーバヘッドを減少するように変更されている、3つのクラス(主に、ポインタディスクリプタクラス、バッファディスクリプタクラスおよびヒープディスクリプタクラス)の1つに属するものとして扱うことを特徴とする媒体が提供される。典型的には、コンピュータで読み取り可能な媒体はマスクROMである。配布用に、媒体は一般的なCD−ROMまたはフロッピー(登録商標)ディスクであってもよい。
本発明をEPOC32として知られる実施形態に関して記載する。EPOC32は、英国のPsion Software Plcによって開発された、(特に)モバイルおよびスマートフォン環境用の、32ビットオペレーティングシステムである。EPOC32の実施形態のより詳細な説明は、英国のPsion Software Plcによって発行されたEPOC32に関するSDKの、付録1として添付された部分に開示されている。本発明者および譲渡人の権利があらゆる意味で限定されない範囲において、SDK全体を本明細書に参照によって組み込む。
EPOC32は、多数の異なったマイクロプロセッサアーキテクチャ上で実行するように移植された。オペレーティングシステムの移植の詳細は本質的に本明細書の範囲外であるが、当業者には理解できるであろう。特に、EPOC32は英国のAdvanced RISC MachinesのARM RISC型マイクロプロセッサに移植されている。ARMマイクロプロセッサの様々なモデルは、デジタルセルラ電話に広く使用されており、当業者にはよく知られている。しかしながら、本発明は多数の異なったマイクロプロセッサ上で実現できる。従って、本明細書の請求の範囲は、オペレーティングシステムが請求の範囲に記載されたような関数を実行する、あらゆる全てのハードウェアおよびソフトウェアの実施に及ぶものと理解すべきである。
上記従来技術の検討で挙げた、リテラルテキストおよび長さが制限されたテキストの例に戻り、EPOC32は、ストリングクラスのオブジェクト用の上記3重構造を以下のように使用する。
例1:EPOC32におけるリテラルテキスト
上記のように、従来のC++では、リテラルテキストに関するテキストストリングはメモリ内で複製される。すなわち、ソースコードのコンパイルで生じるオリジナルバッファ内で一度生成され、テキストの操作を可能にするストリングクラスのオブジェクトに関するメモリ位置で再度複製される。この複製は無駄である。
しかしながら、EPOC32は、リテラルテキストの元のメモリ位置(すなわち、コンパイラによって定められたメモリ位置)を指し示すポインタディスクリプタを使用する。このポインタディスクリプタ(EPOC32ではTPtrC ポインタディスクリプタと呼ぶ)は、リテラルテキスト用のストリングクラスのオブジェクトである。(C++では、本質的にポインタは通常オブジェクトとして認識されていない。
従って、EPOC32のポインタ/オブジェクトのハイブリッドによって、リテラルテキストの追加のコピーの必要が完全に除去される。
例2:EPOC32における長さが制限されたテキスト
上記のように、従来のC++では、テキストの長さに関係なく、十分に柔軟で十分に特徴付けられたストリングクラスのオブジェクトを使用する機構しかなく、それ以外を使用する機構はない。ヒープメモリの処理はコードおよびサイクルを集中的に使用するので、これによりメモリ管理コードに多くのオーバーヘッドが生じる。
EPOC32では、サイズが制限されたバッファディスクリプタと呼ばれる、ストリングのオブジェクトについての特別なクラスがある。これらはサイズが制限されているので、操作するのに複雑なメモリアロケーションコードを必要としない。更に、バッファディスクリプタは(ヒープメモリではなく)スタティックメモリを使用できる。スタティックメモリはヒープメモリでできるようなコードを集中的に使用する方式でメモリを再配置できないが、必要な操作を行うのに必要となるコードサイクルが少ない点で、使用するのにより効率的である(従って電力の削減となる)。EPOC32は、実際に動的な場合に限って、多くのサイクルオーバヘッドを伴うヒープメモリを使用する。その場合には、ヒープディスクリプタクラスを使用する。
EPOC32は、長さが制限されたストリングクラスのパラメータを、「TBuf」クラスのクラステンプレートを使用して定義する。(クラステンプレートはストリングクラスの多数のオブジェクトのプロパティを定義する。例えば、TBuf は全てのバッファディスクリプタ、すなわち、バッファの変形のストリングクラスの全てのオブジェクトのテンプレートである。TBuf はストリングクラスのそのようなオブジェクトに対して一定の共通プロパティを定義する。)
EPOC32は、コードサイズおよびサイクルオーバヘッドを最小化する以外の重要な特徴も示す。それは主に以下の点である。
・「フラット」構造として動作する、ストリングおよび生のデータバッファクラスのオブジェクト
・ディスクリプタが与えるポリモルフィック特性
・ディスクリプタがユニコードおよびアスキーの一様なコーディングを可能とするフラット構造としてのストリングおよび生のデータバッファクラスのオブジェクト
全てのディスクリプタは「フラット」構造である(すなわち、ディスクリプタがコピーされると、ディスクリプタ自身だけがコピーされる。従来のC++では、オブジェクトのコピーはオブジェクト自身だけでなく関連する全てのポインタおよびポインタで示されるデータ、すなわち、オブジェクトに意味を与える複雑な関連する構造、のコピーも必要である。)。従って、EPOC32では、ディスクリプタをコピーすることは、通常のC++で等価であるオブジェクトをコピーすることよりも、メモリオーバヘッドおよびサイクルにおいてはるかに経済的である。
これはEPOC32で、バッファおよびポインタについて以下のように達成される。
バッファディスクリプタ(TBuf)は、バッファによって参照される実際のテキストを含んでおり、従って、バッファをコピーすると本質的に関連するテキストをコピーする。C++のようにポインタおよび関連するデータのコピーは必要ない。
ポインタディスクリプタ(TPtr)は、C++型のポインタを内部に含んでいるので、複製するときにはTPtrだけが必要である。従来のC++では、1つのエンティティだけでなく関連する別のポインタおよびテキストもコピーする必要があった。
ポリモルフィックオブジェクトとしてのディスクリプタ
共通の作用が異なった機構によって達成されるとしても、グループ内の全てのオブジェクトが単一のオブジェクトのように作用するとき、オブジェクトのグループはポリモルフィズムを示すと言われる。ポリモルフィズムは従来のC++では、互いにポリモルフィックな全てのオブジェクトが、共通の位置に、仮想関数テーブルへのポインタ(従ってポインタは各オブジェクト内に必要である)を含んでいる、仮想関数によってもたらされる。このテーブルは各ポリモルフィック関数に対する実際のコードを識別する。ポリモルフィズムを共有する各クラスに対して別のテーブルが必要である。しかしこの手法は、各ポインタが32ビット(すなわち4文字)であり各オブジェクトが仮想関数テーブルへのポインタを必要とするので、比較的大きな空間を使用する。更に、各オブジェクトで32ビット長のフィールドも使用される。
(特に)モバイルオペレーティングシステム環境においては、このことは問題である。EPOC32では、ストリングクラスのオブジェクトに対して次のように対処する。すなわち、32ビット長のフィールドが細分割され、最初の4ビットがディスクリプタのタイプを記述する。そして関数は4ビットを検査し、正しいテキスト位置を指し示す(例えば、ディスクリプタがバッファならばディスクリプタ自体の中など)。従って、ストリングクラスのオブジェクトに対する3つの異なったクラスのディスクリプタ(すなわち、ポインタディスクリプタ、バッファディスクリプタおよびヒープディスクリプタ)の各々が、単一の32ビットフィールドの最初の4ビットだけを使用して記述できるということによってポリモルフィズムが提供される。このようにしてかなりのメモリの節約が達成される。より一般的には、フィールドは別のデータ項目と機械語を共有する。
ユニコードおよびアスキーで変化しないコード
C++では、16ビットのユニコードのコーディングは、そうでなければ8ビットコードとなる全てのテキストデータのサイズを2倍にすることとなる。また、従来は、プログラマがソースコードを書くときに、アスキーまたはユニコードのどちらを使用して記述するかを決定する必要があった。
EPOC32では、アスキーまたはユニコードの最終的な選択にかかわらず、同じソースコードが使用される。これはシステムを、クラスそれ自体(例えば、ポインタディスクリプタ、バッファディスクリプタおよびヒープディスクリプタ)でなく、アスキーおよびユニコードによって変化しない、クラスネームのエイリアスを使用して構成することによって達成される。従って、ユニコードを記述するのにポインタTPtr16 を使用したり、アスキーを記述するのにTPtr8 を使用して作成する代わりに、プログラマはTPtr クラスネームを使用して作成する。
作成時に、クラスネームは16ビットユニコードまたは8ビットアスキーコードのいずれかでコンパイルできる。この手法は、異なったビット長でコード化される全ての文字セットを含むように適用できる。
EPOC32の補足的利点
C++では、テキストストリングは通常「0」で終了し、これによりシステムはテキストストリングの終了位置を容易に知ることができる。EPOC32ではこれはもはや必要ない。なぜなら、ディスクリプタが参照されるデータの長さを定義する記述を含んでいるからである。従って、各テキスト項目毎に終端を示すのに「0」を使用する必要がなくなるので、更にまたコードの節約となる。
ディスクリプタの特徴の要約
ディスクリプタには3つのクラスがある。すなわち、ポインタディスクリプタ、バッファディスクリプタおよびヒープディスクリプタである。
・ポインタディスクリプタには2つの形態がある。不変ポインタディスクリプタ TPtrC と可変ポインタディスクリプタTPtrである。
・不変ポインタディスクリプタ:TPtrC
・これによりデータは変更できない。
・全てのメンバ関数が一定。
・不変ストリングまたはデータ(例えば変更されてはいけないデータ)
・TDesC から導出され、従って多数のメンバ関数を有する。
・可変ポインタディスクリプタ:TPtr
・設計者によって設定された最大長を越えない範囲で、このディスクリプタによってデータを変更できる。
・変更されている領域を含むメモリ領域を直接指し示す。
・ポインタ長により含まれるデータ項目数が決定される。
・全てのTDesC メンバ関数に加えデータの変更および操作のためのTDesメンバ関数を継承する。
・ポインタディスクリプタはデータ表現とは別であるが、メモリ内の予め存在する領域から構成される。
・バッファディスクリプタには2つの形態がある。
・不変バッファディスクリプタ:Tbuf<;TintS>;
・作成時または後で代入演算子(演算子=)により、ディスクリプタにデータを設定できる。
・整数テンプレートにより長さが定義される。すなわち、TBufC<;40>;は40のデータ項目を含んでいる。
・全てのTDesC メンバ関数を継承する。
・可変バッファデイスクリプタ:Tbuf<;TintS>;
・最大長を越えない範囲で変更できるデータを含んでいる。
・最大長が最大データ項目数を定義する。
・実際の長さが実際のデータ項目数を定義する。
・整数テンプレートにより長さが定義される。すなわち、TBuf<;40>;は40のデータ項目だけを含んでいる。
・データ領域はディスクリプタオブジェクトの一部である。
・操作および変更の必要なデータを含めるのに有効であるが、その長さは既知の最大値(例えばWPテキスト)を越えない。
・全てのTDesC メンバ関数に加えデータの変更および操作のためのTDesメンバ関数を継承する。
・ヒープディスクリプタは1つの形態だけである。
・不変ヒープディスクリプタ:HBufC
・データと連続した長さを有する。
・データ領域はディスクリプタオブジェクトの一部であり、オブジェクト全体はヒープから割り当てられたセルを占める。
・作成時または後で代入演算子(演算子=)により、ディスクリプタにデータを設定できる。
・全てのTDesC メンバ関数を継承する。
・再割り当て可能、すなわち、データ領域は拡張および縮小できる。
付録1
Pslon Software Plc.から1997年に発行されることになっているEPOC32「ディスクリプタ」SDK(抜粋)。Pslon Software Plc.から1997年7月(改訂1.0)に発行されたSDK全文を参照する。
______________________________________
SDK:ディスクリプタ概要
ディスクリプタクラスの3重構造(主に、ポインタディスクリプタクラス、バッファディスクリプタクラスおよびヒープディスクリプタクラス)は、ストリングおよび一般的バイナリデータの両方に、それらが存在するメモリのタイプに関係なく、安全かつ一貫したアクセスおよび操作のための機構を提供する。例えば、ROM内のコード部分のストリングを、RAM内のファイルレコードと同様に扱える。
ディスクリプタによって表わされるデータは、メモリ内の定められた位置のデータ領域にある。このデータ領域は拡張できない。ディスクリプタデータの操作は、定められたデータ領域外の偶発的あるいは故意のメモリアクセスが許されないという意味で安全である(一般的に、無効なアクセスを行うコードは、(通常パニックとして知られる)例外の原因となる)。
ディスクリプタは、表わされたデータのタイプで区別をしないので、ストリングおよびバイナリデータの両方は同様に扱われる。ディスクリプタオブジェクトのメンバ関数のあるものはテキストデータを操作するように設計されているにもかかわらず、それらはバイナリデータにも作用する。これによりストリングおよびバイナリデータの扱いを統一し、コードを共有できるようにして効率を高める。
ディスクリプタクラスはいくつかの重要な用件を満足する:
・ユニコードおよびアスキーテキスト両方のサポートを提供する。マクロ UNIC0DEは、アスキーまたはユニコードで作成された変数を選択するのに使用される。
・ストリングおよびバイナリデータの扱いを統一する。
・ROM内のテキストまたはデータの安全かつ便利な参照を可能にする。
・関連するテキストまたはデータを操作する多くのメンバ関数を提供する。
・データの変更を可能とするが、定められたデータ領域外へ書き込もうとするあらゆる試みを防止する。
・仮想関数に関連するメモリオーバヘッドをなくす。
・組み込みタイプのように作用し、スタック上に安全に作成され、安全に孤立化(orphaned)され得る。
・(HBufC がヒープ上に割り当てられ、規則の例外となる。)。
______________________________________
アスキーおよびユニコードテキスト
E32.ディスクリプタ文字セット
アスキーテキスト文字は8ビット(1バイト)で表わされるが、ユニコード文字は16ビット(2バイト)を必要とする。アスキーおよびユニコードテキストの両方をサポートするために、ディスクリプタクラスは、8ビットと16ビットの2つの変形を有する。例えば、TPtr8 およびTPtr16 の2つのポインタディスクリプタクラスがある。
プログラムを、作成された変数から独立したクラスネームを使用してユニコードまたはアスキーテキストのいずれかをサポートするように構成できる。例えば、ディスクリプタクラスTPtr を使用して、TPtr8 またはTPtr16 のいずれかを使用するようにシステムを構成できる。マクロ UNIC0DE が定義されたか否かによって、作成時(build time)に決定される。
ヘッダファイルE3232def.h(SDKの付録1参照)から抽出した次のコードは、変数から独立したクラスネームを適切に定義することによって実現する方法を示している。
#if defined(UNICODE)
・・・
typedef TPtr16 TPtr;
・・・
#else
・・・
typedef TPtr8 TPtr;
・・・
#endif
アプリケーションコードには、「C」スタイルのストリングリテラルを直接使用しないようにすべきである。その代わり、適切な幅の「C」スタイルのストリングを生成するのに、適切なタイプのポインタに戻す、マクロ Sを使用すべきである。また、適切なタイプのディスクリプタを作成するには、マクロ L(「リテラル」に対する L)を使用すべきである。これらのマクロの定義については、e32.macro._Sおよびe32.macro._Lを参照せよ。
例えば、
const TText*str=_S(“Hello”);
は、アスキーで作成された1バイト文字のストリングを生成するが、ユニコード作成では2バイト文字のストリングを生成する。
_L(“Hello”);
は、アスキーで作成された8ビットディスクリプタおよびユニコードで作成された16ビットディスクリプタを生成する。常に正しい変数のディスクリプタを作成するように、例えば、平文“abcdef”ではなく、常に_L(“abcdef”)を使用する。
macro_S8およびmacro_L8をそれぞれ使用することによって、作成された変数とは独立して、8ビット「C」スタイルストリングおよび8ビットポインタディスクリプタが明白に生成される。対応する16ビットのバージョン、_S16および_L16も使用できる。これらの定義については、e32.macro._S8, e32.macro._L8, e32.macro._S16 および e32.amcro._L16を参照せよ。
______________________________________
長さおよびサイズ
E3232.ディスクリプタ長さおよびサイズ
ディスクリプタは、表わすデータをそのデータの長さで特徴付ける。ディスクリプタの長さは、データ項目の数である。8ビットの変数に対しては、ディスクリプタの長さはそれが表わす1バイトデータの数であり、16ビットの変数に対しては、ディスクリプタの長さはそれが表わす2バイトデータの数である。
ディスクリプタのサイズよ、ディスクリプタのデータが占めるバイト数であり、ディスクリプタの長さと同じである必要はない。8ビットの変数に対しては、サイズは長さと同じであり、16ビットの変数に対しては、サイズは長さの2倍である。データが変更されていることを許可するディスクリプタもまた、その最大長によって特徴付けられる。これらのディスクリプタに対しては、表わされるデータの長さは、ゼロからこの最大値まで最大値と共に変化し得る。あらゆるディスクリプタの最大長は228である。
______________________________________
テキストおよびバイナリデータ
E3232.ディスクリブタテキストおよびバイナリ
「C」では、ストリングスは、ストリングの終端を示すゼロターミネータを必要とすることによって特徴付けられる。これらは多数の問題を招く。特に、これらは(データがバイナリゼロを含む場合に)バイナリデータを中に含むことができず、それらに対する操作は一般的に効率的でない。「C」ストリングスは、ANSIの「C」ライブラリの関数グループ、memxxx()およびstrxxx()に反映されているように、バイナリデータとは異なった方法で扱う必要がある。ディスクリプタはストリングとバイナリデータを同じ方法で表わすことを可能とし、これは両方の場合に同じ関数を使用することを可能とする。バイナリデータに対しては、明示的に8ビットのディスクリプタを使用しなければならない。バイナリデータにとっては、ユニコードをアスキーの区別は意味がない。16ビットバイナリデータは事実上使用しないことに注意せよ。
______________________________________
メモリ割り当て
E3232.ディスクリプタ割り当て
ディスクリプタクラスは(HBufC を除いて)、組み込みタイプのように作用する。これらはメモリの割り当てを行わず、デストラクタを持たない。これは、ディスクリプタクラスが組み込みタイプと同様にスタック上で孤立化され得ることを意味する。これは特に、コードを残せる状況では重要である。(孤立化の影響については、E3232.例外トラップ.クリーンアップ.用件を参照せよ)
HBufCディスクリプタオブジェクトはヒープ上に割り当てられ、スタック上には作成されない。
______________________________________
例外
E3232.ディスクリプタ例外
ディスクリプタメンバ関数の全てのパラメータは、操作が正しく指定され、どのデータもディスクリプタのデータ領域外に書き込まれないことを保証するべく検査される。特定の結果は、どのメンバ関数も、可変ディスクリプタをその最大割り当て長を越えて拡張できないこととなる。元の割り当てを十分大きくするか、より大きいディスクリプタの必要性を見越して実行時により大きなディスクリプタを動的に割り当てるかによって、全てのディスクリプタがデータを収容できるように十分大きいことを保証するのは、プログラマの責任である。スタティックな手法は実施がより簡単であるが、これが無駄であると判明した特定の場合には、動的手法がより効果的であろう。例外の場合には、どんな認められていないメモリのアクセスも実行しないこと、およびどんなデータも移動または損傷されないことが安全であると考えられている。
______________________________________
ディスクリプタタイプ
E3232.ディスクリプタタイプ
ディスクリプタオブジェクトには3種類ある。
すなわち、
・ポインタディスクリプタ
ディスクリプタオブジェクトは、それが表わすデータとは別であるが、メモリ内の予め存在する領域に生成される。これには、
不変ポインタディスクリプタ、TPtrC
可変ポインタディスクリプタ、TPtr
の2つの形態がある。
・バッファディスクリプタ
データ領域はディスクリプタオブジェクトの一部である。これには、
不変バッファディスクリプタ、TBufC<;TlntS>;
可変バッファディスクリプタ、TBuf<;TlntS>;
の2つの形態がある。
・ヒープディスクリプタ
データ領域はディスクリプタオブジェクトの一部であり、オブジェクト全体がヒープから割り当てられたセルを占有する。これは、
不変ヒープディスクリプタ、HBufC
の1つの形態だけである。
______________________________________
ポインタディスクリプタ−TPtrC
E3232.ディスクリプタポインタディスクリプタ.TPtrC
TPtrC は、それによってどのデータも変更されない、不変ディスクリプタである。そのメンバ関数の全ては(コンストラクタを除いて)不変(constant)である。図1にTPtrC が概略的に示されている。TPtrC は不変ストリングまたはデータを参照する、例えば、ROM常駐コード中に生成されたテキストをアクセスするとき、またはその参照によってデータが変更されてはならないRAM内のデータに参照を渡すときに有効である。TPtrC は、例えば、テキストまたはデータの抽出部分内の文字の位置決めなどの、その内容を操作する多くのメンバ関数を提供するTDesC から導出される。
______________________________________
ポインタディスクリプタ−TPtr
E3232.ディスクリプタ.ポインタディスクリプタ.TPtr
TPtr は、データが最大長を越えない範囲で、それによってデータを変更できるポインタディスクリプタである。最大長はコンストラクタによって設定される。
TPtr は、変更されているデータを含むメモリ内の領域を直接指し示す。TPtr は、図2Aおよび2Bに概略的に示されている。
領域が含むことができるデータ項目の最大数は、最大長で定義される。TPtrは、データ内に現在いくつのデータ項目が含まれているかを表わす。この値が最大値より小さいとき、データ領域の一部は未使用である。TPtr は、参照により変更されているよう意図されたデータを含むRAMの領域、またはまだデータがないが、ディスクリプタの参照およびメンバ関数を使用してデータが生成されるRAMの領域への参照を生成するのに有効である。
TPtr はまた、変更されているデータを含む、TBufC またはHBufC ディスクリプタへの参照を生成するのに有効である。このように使用されるTPtr は、TBufC またはHBufC ディスクリプタを指し示す。TBufC またはHBufC ディスクリプタに含まれるデータはTPtr によって変更することができる。TPtr は、TDesC から導出されたTDes から導出される。従って、TPtr は、TDesC で定義された全てのconst メンバ関数に加え、例えば、既存のテキストの末端に文字を付加する等の、データの操作および変更が可能なTDes のメンバ関数を継承している。
______________________________________
バッファディスクリプタ−TBufC<;TInt S>;
E3232.ディスクリプタ.バッフアディスクリプタ.TBufC
TBufC は、データ領域が続く長さを有するバッファディスクリプタである。データは、生成時にまたは他のあらゆるときに割り当てられた演算子(演算子=)によって、ディスクリプタ内に設定される。ディスクリプタによって保持されたデータは不変である。TBufC は、図3に概略的に示されている。TBufC の長さは、例えば、TBufC<;40>;が40までのデータ項目を含むことができるTBufC を定義するように、整数テンプレートによって定義される。
TBufC は、例えばテキストまたはデータの抽出部分内の文字の位置を決める、その内容物を操作する多くのメンバ関数を提供するTDesC から導出される。TBufC は、TBufC を参照する可変ポインタディスクリプタ(TPtr)を作成する、メンバ関数Des()を提供する。これにより、図4に概略的に表わしたように、TPtrによってTBufC のデータを変更することができる。TPtr の最大長は、整数テンプレートパラメータの値である。
______________________________________
バッファディスクリプタ−TBuf<;TInt S>;
E3232.ディスクリプタ.バッファディスクリプタ.TBuf
TBuf は、データが最大長を越えない範囲で、変更できるデータを含むバッファディスクリプタである。図5にTBuf が概略的に示されている。TBuf が内部のデータ領域に含むことができるデータ項目の数は、最大長によって定義される。
ディスクリプタの長さは、データ領域に現在いくつのデータ項目が含まれているかを表わしている。この値が最大値より小さいとき、データ領域のある部分は未使用である。TBuf の最大長は、例えば、TBuf<;40>;が40までの(かつ越えない!)データ項目を含むことができるTBuf を定義するように、整数テンプレートによって定義される。TBuf は、例えばワードプロセッサのテキスト等の、操作および変更が必要であるが、その長さが既知の最大値を越えないデータを収容するのに有効である。TBuf は、TDesC から導出されたTDes から導出される。
従って、TPtr は、TDesC で定義された全てのconst メンバ関数に加え、例えば、既存のテキストの末端に文字を付加する等の、データの操作および変更が可能なTDes のメンバ関数を継承している。
______________________________________
ヒープディスクリプタ−HBufC
E3232.ディスクリプタ.ヒ−プディスクリプタ.HBufC
HBufC は、データ領域が続く長さを有するディスクリプタである。スタティックメンバ関数、New()、NewL()またはNewLC()を使用してヒープ上に割り当てられる。ディスクリプタの長さはこれらスタティック関数へのパラメータとして渡される。図6にHBufC が概略的に示されている。データは、生成時にまたは他のあらゆるときに割り当てられた演算子(演算子=)によって、ディスクリプタ内に設定される。HBufC は、例えばテキストまたはデータの抽出部分内の文字の位置を決める、その内容物を操作する多くのメンバ関数を提供するTDesC から導出される。
HBufC は、HBufC を参照する可変ポインタディスクリプタ(TPtr)を作成する、メンバ関数Des()を提供する。TPtr の最大長は、HBufC データ領域の長さである。図7はこれを概略的に示している。
ヒープディスクリプタは再配置することができる。関数ReAlloc()またはReAllocL()は、ヒープディスクリプタのデータ領域の拡張あるいは縮小を可能にする。しかしながら、データ領域の長さは、現在保持しているデータの長さより短くすることはできない。データ領域を縮小する前に、ディスクリプタが保持するデータを減少させなければならない。割り当て演算子がヒープディスクリプタ中に設定できるデータの長さは、ディスクリプタのデータ領域に割り当てられたスペースに制限される。ヒープディスクリプタによって占有されたメモリは、User::Free()のコールまたはキーワードdeleteを使用して明示的に開放する必要がある。
______________________________________
ディスクリプタクラスの継承・派生関係
E32.ディスクリプタ.クラス
全てのディスクリプタクラス、TPtrC,TPtr,TBufC,TBufおよびHBufC は、抽象的基底クラス(abstract base class)TDesC およびTDes から導出される。
クラスTBufCBase を抽象的基底クラスとして示したが、これは単に実施が容易なためである。図8はクラス間の関係を概略的に示している。
実際のディスクリプタクラスの作用は非常に似ており、従って、ディスクリプタのほとんどの関数は抽象的基底クラスによって提供される。ディスクリプタは(特にスタックで)広く使用されるので、ディスクリプタオブジェクトのサイズを最小にする必要がある。これを補助するように、各ディスクリプタオブジェクトにおいて仮想関数テーブルポインタのオーバーへッドをなくすため、仮想関数の定義をしない。その結果、基底クラスはそこから導出されるクラスの知識を潜在的に持っている。
E32は、8ビット(アスキー)テキストおよびバイナリデータを扱うものと、16ビット(ユニコード)テキストを扱うものとの2つのディスクリプタクラスの変数を供給する。実際のクラスの8ビット変数は、TPtrC8,TPtr8,TBufC8<;TInt S>;,TBuf8<;TInt S>;およびHBufC8であり、抽象クラスの8ビット変数は、TDesC8 およびTDes8 である。同様に、16ビット変数の名前はそれぞれ、TPtrC16,TPtr16,TBufC16<;Tlnt S>;,TBuf16<;TIntS>;,HBufC8,TDesC16およびTDes16である。
この区別はテキストを表わすのに使用されるディスクリプタにはトランスペアレントである。TPtrC,TPtr,TBufC<;TInt S>;,TBuf<;TInt S>;およびHBufCクラスを生成し使用するプログラムを書くことにより、ユニコードおよびアスキーの両方に対する互換性が維持される。マクロ_UNIC0DEが定義されたか否かに応じて、構成時に適切な変数が選択される。マクロ_UNIC0DEが定義されていると16ビット変数が変数が使用され、そうでなければE32.ディスクリプタ.文字セットで説明したように8ビットの変数が使用される。
バイナリデータのディスクリプタは、明示的に8ビット変数を使用する必要があり、換言すると、コードは明示的に TPtrC8,TPtr8,TBufC8<;TInt S>;,TBuf8<;TInt S>;およびHBufC8のクラスを生成する。
バイナリデータに対して16ビット変数を明示的に使用することもできるが、勧められない。一般に、8ビットおよび16ビットの変数は、構造および実施において同一であり、クラス自体の記述は全体に渡り構成とは独立した名前を使用する。
多くのメンバ関数が、ディスクリプタが8ビットか16ビットの変数であるかに応じて、TUint8*タイプまたはTUint16*タイプの引数を取ることに特に注意せよ。説明を単純にするため、これらの引数を関数プロトタイプTUint??*として記載する。
TPtrCの概略を示す図である。 TPtrの概略を示す図である。 TBufCの概略を示す図である。 TPtrとTBufCの関係を示す図である。 TBufCの概略を示す図である。 HBufCの概略を示す図である。 TPtrとHBufCの関係を示す図である。 クラス間の継承・派生の関係を示す図である。

Claims (3)

  1. 単一のベースクラス(TDesC)から派生した、階層構造を有する5つのストリングクラスのオブジェクトを操作又はアクセスできるようにプログラムされたオブジェクト指向のオペレーティングシステムを使用するコンピュータ装置において、
    リードオンリーメモリと、
    ランダムアクセスメモリと、
    (a)前記ベースクラス(TDesC)から派生し、リテラルテキストを扱うためのストリングクラスであって、前記リードオンリーメモリ又は前記ランダムアクセスメモリのうちヒープ領域以外のメモリ領域に該リテラルテキストを格納し、該テキストが格納されたオリジナルのメモリ領域にポインタを利用してアクセスするように定義された第1のストリングクラス(TPtrC)に属するオブジェクトを、該第1のストリングクラス(TPtrC)の定義にしたがって操作又はアクセスする手段と、
    (b)データの追加及び変更を可能とするメンバ関数を定義した、前記ベースクラス(TDesC)から派生した他のクラス(TDes)からさらに派生し、予め設定された最大長を超えない長さのテキストを前記ランダムアクセスメモリのうちヒープ領域以外のメモリ領域に格納し、該テキストが格納されオリジナルのメモリ領域にポインタを利用してアクセスし、該最大長を超えない範囲で該テキストにデータを追加又は変更するように定義された第2のストリングクラス(TPtr)に属するオブジェクトを、該第2のストリングクラス(TPtr)の定義にしたがって操作又はアクセスする手段と、
    (c)前記ベースクラス(TDesC)から派生し、長さが制限されたテキストを前記ランダムアクセスメモリのうちスタティックメモリ領域に格納してアクセスするように定義された第3のストリングクラス(TBufC)に属するオブジェクトを、該第3のストリングクラス(TBufC)の定義にしたがって操作又はアクセスする手段と、
    (d)前記ベースクラス(TDesC)から派生した前記他のクラス(TDes)からさらに派生し、長さが制限されたテキストを前記ランダムアクセスメモリのうちスタティックメモリ領域に格納し、前記データの追加及び変更を可能とする複数のメンバ関数を利用してデータの追加及び変更をするように定義された第4のストリングクラス(TBuf)に属するオブジェクトを、該第4のストリングクラス(TBuf)の定義にしたがって操作又はアクセスする手段と、
    (e)前記ベースクラス(TDesC)から派生し、長さが動的に変化し得るテキストを、前記ランダムアクセスメモリのうちのヒープ領域を使用するために必要となるすべてのメモリ管理関数を利用して該ヒープ領域に格納してアクセスするように定義された第5のストリングクラス(HBufC)に属するオブジェクトを、該第5のストリングクラス(HBufC)の定義にしたがって操作又はアクセスする手段と
    を含むことを特徴とするコンピュータ装置。
  2. 単一のベースクラス(TDesC)から派生した、階層構造を有する5つのストリングクラスのオブジェクトを操作又はアクセスできるようにプログラムされたオブジェクト指向のオペレーティングシステムを使用する、リードオンリーメモリ、ランダムアクセスメモリおよびマイクロプロセッサを有するコンピュータ装置によって該オブジェクトについて操作又はアクセスする方法であって、
    前記マイクロプロセッサが、
    (a)前記ベースクラス(TDesC)から派生し、リテラルテキストを扱うためのストリングクラスであって、前記リードオンリーメモリ又は前記ランダムアクセスメモリのうちヒープ領域以外のメモリ領域に該リテラルテキストを格納し、該テキストが格納されたオリジナルのメモリ領域にポインタを利用してアクセスするように定義された第1のストリングクラス(TPtrC)に属するオブジェクトを、該第1のストリングクラス(TPtrC)の定義にしたがって操作又はアクセスし、
    (b)データの追加及び変更を可能とするメンバ関数を定義した、前記ベースクラス(TDesC)から派生した他のクラス(TDes)からさらに派生し、予め設定された最大長を超えない長さのテキストを前記ランダムアクセスメモリのうちヒープ領域以外のメモリ領域に格納し、該テキストが格納されたオリジナルのメモリ領域にポインタを利用してアクセスし、該最大長を超えない範囲で該テキストにデータを追加又は変更するように定義された第2のストリングクラス(TPtr)に属するオブジェクトを、該第2のストリングクラス(TPtr)の定義にしたがって操作又はアクセスし、
    (c)前記ベースクラス(TDesC)から派生し、長さが制限されたテキストを前記ランダムアクセスメモリのうちスタティックメモリ領域に格納してアクセスするように定義された第3のストリングクラス(TBufC)に属するオブジェクトを、該第3のストリングクラス(TBufC)の定義にしたがって操作又はアクセスし、
    (d)前記ベースクラス(TDesC)から派生した前記他のクラス(TDes)からさらに派生し、長さが制限されたテキストを前記ランダムアクセスメモリのうちスタティックメモリ領域に格納し、前記データの追加及び変更を可能とする複数のメンバ関数を利用してデータの追加及び変更をするように定義された第4のストリングクラス(TBuf)に属するオブジェクトを、該第4のストリングクラス(TBuf)の定義にしたがって操作又はアクセスし、
    (e)前記ベースクラス(TDesC)から派生し、長さが動的に変化し得るテキストを、前記ランダムアクセスメモリのうちのヒープ領域を使用するために必要となるすべてのメモリ管理関数を利用して該ヒープ領域に格納してアクセスするように定義された第5のストリングクラス(HBufC)に属するオブジェクトを、該第5のストリングクラス(HBufC)の定義にしたがって操作又はアクセスする
    ことを特徴とする方法。
  3. 単一のベースクラス(TDesC)から派生した、階層構造を有する5つのストリングクラスのオブジェクトを、リードオンリーメモリ、ランダムアクセスメモリおよびマイクロプロセッサを有するコンピュータ装置によって操作又はアクセスできるようにプログラムされたオブジェクト指向のコンピュータプログラムを格納した記憶媒体であって、
    前記コンピュータプログラムは、
    (a)前記ベースクラス(TDesC)から派生し、リテラルテキストを扱うためのストリングクラスであって、前記リードオンリーメモリ又は前記ランダムアクセスメモリのうちヒープ領域以外のメモリ領域に該リテラルテキストを格納し、該テキストが格納されたオリジナルのメモリ領域にポインタを利用してアクセスするように定義された第1のストリングクラス(TPtrC)に属するオブジェクトを、該第1のストリングクラス(TPtrC)の定義にしたがって操作又はアクセスする手段と、
    (b)データの追加及び変更を可能とするメンバ関数を定義した、前記ベースクラス(TDesC)から派生した他のクラス(TDes)からさらに派生し、予め設定された最大長を超えない長さのテキストを前記ランダムアクセスメモリのうちヒープ領域以外のメモリ領域に格納し、該テキストが格納されたオリジナルのメモリ領域にポインタを利用してアクセスし、該最大長を超えない範囲で該テキストにデータを追加又は変更するように定義された第2のストリングクラス(TPtr)に属するオブジェクトを、該第2のストリングクラス(TPtr)の定義にしたがって操作又はアクセスする手段と、
    (c)前記ベースクラス(TDesC)から派生し、長さが制限されたテキストを前記ランダムアクセスメモリのうちスタティックメモリ領域に格納してアクセスするように定義された第3のストリングクラス(TBufC)に属するオブジェクトを、該第3のストリングクラス(TBufC)の定義にしたがって操作又はアクセスする手段と、
    (d)前記ベースクラス(TDesC)から派生した前記他のクラス(TDes)からさらに派生し、長さが制限されたテキストを前記ランダムアクセスメモリのうちスタティックメモリ領域に格納し、前記データの追加及び変更を可能とする複数のメンバ関数を利用してデータの追加及び変更をするように定義された第4のストリングクラス(TBuf)に属するオブジェクトを、該第4のストリングクラス(TBuf)の定義にしたがって操作又はアクセスする手段と、
    (e)前記ベースクラス(TDesC)から派生し、長さが動的に変化し得るテキストを、前記ランダムアクセスメモリのうちのヒープ領域を使用するために必要となるすべてのメモリ管理関数を利用して該ヒープ領域に格納してアクセスするように定義された第5のストリングクラス(HBufC)に属するオブジェクトを、該第5のストリングクラス(HBufC)の定義にしたがって操作又はアクセスする手段と
    を前記コンピュータ装置に機能させることを特徴とする記憶媒体。
JP2006153915A 1997-06-13 2006-06-01 コンピュータ装置およびストリングクラスのオブジェクトを操作又はアクセスする方法 Expired - Fee Related JP4611245B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
GBGB9712436.6A GB9712436D0 (en) 1997-06-13 1997-06-13 Operating system for a computer based on C++ programming techniques

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
JP11501913A Division JP2000501873A (ja) 1997-06-13 1998-06-12 オブジェクト指向オペレーティングシステム

Related Child Applications (1)

Application Number Title Priority Date Filing Date
JP2008185277A Division JP2009059350A (ja) 1997-06-13 2008-07-16 情報処理装置および情報処理方法、プログラム、記録媒体

Publications (2)

Publication Number Publication Date
JP2006302303A JP2006302303A (ja) 2006-11-02
JP4611245B2 true JP4611245B2 (ja) 2011-01-12

Family

ID=10814181

Family Applications (3)

Application Number Title Priority Date Filing Date
JP11501913A Withdrawn JP2000501873A (ja) 1997-06-13 1998-06-12 オブジェクト指向オペレーティングシステム
JP2006153915A Expired - Fee Related JP4611245B2 (ja) 1997-06-13 2006-06-01 コンピュータ装置およびストリングクラスのオブジェクトを操作又はアクセスする方法
JP2008185277A Pending JP2009059350A (ja) 1997-06-13 2008-07-16 情報処理装置および情報処理方法、プログラム、記録媒体

Family Applications Before (1)

Application Number Title Priority Date Filing Date
JP11501913A Withdrawn JP2000501873A (ja) 1997-06-13 1998-06-12 オブジェクト指向オペレーティングシステム

Family Applications After (1)

Application Number Title Priority Date Filing Date
JP2008185277A Pending JP2009059350A (ja) 1997-06-13 2008-07-16 情報処理装置および情報処理方法、プログラム、記録媒体

Country Status (3)

Country Link
JP (3) JP2000501873A (ja)
GB (1) GB9712436D0 (ja)
WO (1) WO1998057257A2 (ja)

Also Published As

Publication number Publication date
JP2006302303A (ja) 2006-11-02
JP2009059350A (ja) 2009-03-19
GB9712436D0 (en) 1997-08-13
WO1998057257A3 (en) 1999-03-04
JP2000501873A (ja) 2000-02-15
WO1998057257A2 (en) 1998-12-17

Similar Documents

Publication Publication Date Title
Krall Efficient JavaVM just-in-time compilation
JP4571710B2 (ja) ディスパッチテーブル構造のための方法と装置
US5481708A (en) System and methods for optimizing object-oriented compilations
US5535390A (en) Method for reusing temporaries and reclaiming shared memory
Stroustrup Parameterized Types for C++.
US6049667A (en) Computer system, method of compiling and method of accessing address space with pointer of different width therefrom
US7386843B2 (en) Method and system for register allocation
US6738966B1 (en) Compiling device, computer-readable recording medium on which a compiling program is recorded and a compiling method
US6334212B1 (en) Compiler
US6901591B1 (en) Frameworks for invoking methods in virtual machines
EP0922250B1 (en) Object oriented operating system
JP4611245B2 (ja) コンピュータ装置およびストリングクラスのオブジェクトを操作又はアクセスする方法
Bergeron et al. Systems programming languages
Ditzel Reflections on the high-level language symbol computer system
JP2003256215A (ja) プログラム変換方法、これを用いたデータ処理装置及びプログラム
US8468511B2 (en) Use of name mangling techniques to encode cross procedure register assignment
Sagonas et al. All you wanted to know about the HiPE compiler: (but might have been afraid to ask)
JPH11345127A (ja) コンパイラ
Pennello Compiler challenges with RISCs
JP3630086B2 (ja) プログラム変換装置、プログラム変換方法及び記録媒体
Sitton et al. The PL/EXUS language and virtual machine
Luna et al. HiPE on AMD64
Hicks Types and Intermdiate Representations
Sidnell et al. Transputer common Object File Format
Hunter Programming—An introduction

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20070727

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20071024

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20071029

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080125

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20080317

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080716

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20080723

A912 Re-examination (zenchi) completed and case transferred to appeal board

Free format text: JAPANESE INTERMEDIATE CODE: A912

Effective date: 20080815

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20090309

A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A711

Effective date: 20090319

RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7422

Effective date: 20090319

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20100922

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20101013

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20131022

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees