レコード (計算機科学)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

レコード (: record, structure)は構造体複合データとも呼ばれ、計算機科学では、基本的なデータ構造である。データベースまたはスプレッドシートのレコードは通常、「」と呼ばれる[1][2][3][4]

概要[編集]

レコードは、フィールドの集まりであり、通常は固定の数(と並び)のフィールドから成り、(配列と違って)各フィールドのデータ型は異なってよい[5]。レコードのフィールドは、特にオブジェクト指向プログラミングでは、メンバーと呼ばれることもある。フィールドは要素と呼ばれることもあるが、これはコレクションの要素と混同される恐れがある。

たとえば、日付は、数値型のフィールド、文字列型のフィールド、数値型のフィールドを含むレコードとして定義できる。人事レコードには、名前給与ランクなどが含まれる。円レコードには中心半径が含まれる。この場合、中心自体はx座標とy座標を含む「点」レコードとして表すことができる。

レコード型は、そのような値と変数を記述するデータ型である。レコード型は、通常は、フィールド数が固定されており、各フィールドに名前があり、各フィールドの型が異なる場合があるところが、配列と異なる。

最新のコンピューター言語のほとんどでは、プログラマーはレコード型を定義できる。定義には、各フィールドのデータ型と、フィールドにアクセスできる識別子(名前またはラベル)の指定が含まれる。型理論では、直積型タプル型; フィールド名なし)が単純であるため一般的に好まれるが、真のレコード型はSystem F-subなどの言語で研究されている。型理論のレコードには、データに加えて第一級関数型フィールドが含まれる場合があるため、オブジェクト指向プログラミングの多くの機能を表現できる。

レコードは、メインメモリ磁気テープハードディスクなどの大容量記憶装置を含む任意の記憶媒体に存在させることができる。レコードは、ほとんどのデータ構造、特にリンクされたデータ構造の基本的なコンポーネントである。多くのコンピューターファイルは、論理レコードの配列として編成され、効率を上げるために、より大きな物理レコードまたはブロックにグループ化される。

関数またはプロシージャのパラメータは、多くの場合、レコード変数のフィールドと見なすことができる。また、その関数に渡された引数は、呼び出し時にその変数に割り当てられるレコード値と見なすことができる。また、プロシージャコールの実装によく使用されるコールスタックでは、各エントリはアクティベーションレコードあるいはコールフレームであり、これにはプロシージャパラメータとローカル変数、リターンアドレス、およびその他の内部フィールドが含まれている。

オブジェクト指向言語のオブジェクトは、基本的に、そのレコード自身の処理に特化したプロシージャを含むレコードである。オブジェクト型は、レコード型を拡張したものだ。実際、ほとんどのオブジェクト指向言語では、レコードはオブジェクトの特殊なケースであり、オブジェクト指向機能を使用するオブジェクトとは対照的に、プレーンオールドデータ構造(PODS)またはパッシブデータ構造と呼ばれる。

キー[編集]

レコードには、0個以上のキーが含まれる場合がある。キーは、識別子として機能するレコード内のフィールドまたはフィールドのセットである。一意のキーは、主キーまたは単にレコードキーと呼ばれる。たとえば、従業員ファイルに、従業員番号、名前、部門、給与が含まれるとする。従業員番号は組織内で一意であり、主キーとなる。記憶媒体とファイル構成によっては、従業員番号にインデックスが付けられ、検索を高速化するために別のファイルにも保存される。部門コードは一意ではない場合があるが、インデックスを付けることもできる。その場合、セカンダリキーまたは代替キーと見なされる。インデックスが作成されていない場合、特定の部門のすべての従業員のリストを作成するには、従業員ファイル全体をスキャンする必要がある。給与フィールドは通常、キーとして使用できない。インデックス作成は、ファイルを設計するときに考慮される1つの要素となる。

使用法[編集]

  • 各フィールドの位置、型、名前を含む、新しいレコード型の宣言。
  • 特定のレコード型を持つ変数と値の宣言。
  • 指定されたフィールド値から、指定されたフィールド名を使用してレコード値を作成。
  • レコードの明示的な名前を持つフィールドの選択。
  • レコード変数へのレコード値の代入。
  • 2つのレコードを比較して等しいことを確認。
  • レコードの標準ハッシュ値の計算。

レコード値からフィールドを選択すると、値が生成される。

一部の言語は、レコードのすべてのフィールド、または少なくとも参照できるフィールドを列挙する機能を提供する。この機能は、デバッガーガベージコレクターシリアル化などの特定のサービスを実装するために必要となる。ある程度のポリモーフィズムが必要となる。

メモリ内の表現[編集]

メモリ内のレコードの表現は、プログラミング言語によって異なる。通常、フィールドは、レコードタイプで宣言されているのと同じ順序で、メモリ内の連続した位置に格納される。これにより、2つ以上のフィールドが同じメモリワードに格納される可能性がある。実際、この機能は、単語の特定のビットにアクセスするためのシステムプログラミングでよく使用される。一方、ほとんどのコンパイラは、マシンによって課せられる配置の制約に準拠するために、プログラマからは見えない余白フィールドを追加する。たとえば、浮動小数点フィールドは1ワードを占める。

一部の言語では、フィールド(および場合によっては名前やタイプ)を指すアドレスの配列としてレコードを実装する。オブジェクト指向言語のオブジェクトは、特に複数クラスの継承を許可する言語では、かなり複雑な方法で実装される。

自己定義のレコード[編集]

自己定義レコードは、レコード型を識別し、レコード内の情報を見つけるための情報を含むレコード型である。要素のオフセットが含まれる場合がある。したがって、要素は任意の順序で格納することも、省略しても良い[6]。 あるいは、それぞれが要素識別子を含むレコードのさまざまな要素は、単純に任意の順序で互いに続けて配置される。

[編集]

以下に、レコード定義の例を示す。

  • PL/I:
      declare 1 date,
                2 year  fixed binary,
                2 month fixed binary,
                2 day   fixed binary;
    
  • Algol 68:
  mode date = struct (int year, int month, int day);
  • C:
    struct date {
       int year;
       int month;
       int day;
    };
    
  • Fortran:
    type :: date
       integer :: year, month, day
    end type date
    
  • Go:
    type Date struct {
            year  int
            month time.Month
            day   int
    }
    
  • Pascal:
    type TDate = record
       Year: Integer;
       Month: 1..12;
       Day: 1..31;
    end;
    
  • Rust:
    struct Date {
        year: u32,
        month: u32,
        day: u32,
    }
    
  • Haskell:
    data Date = Date { year :: Integer
                     , month :: Integer
                     , day :: Integer
                     }
    
  • Julia:
    struct Date
        year::Int
        month::Int
        day::Int
    end
    
  • Standard ML:
    type date = {year:int, month:int, day:int}
    
  • COBOL:
           01 WS-DATE.
              02 WS-YEAR  PIC 9999.
              02 WS-MONTH PIC 99.
              02 WS-DAY   PIC 99.
    
  • Java 15:
    record Date(int year, int month, int day) {
        // this is the minimum required    
    }
    

関連項目[編集]

脚注[編集]

  1. ^ Computer Science Dictionary Definitions”. Computing Students. 2018年1月22日閲覧。
  2. ^ Radványi, Tibor (2014). Database Management Systems. Eszterházy Károly College. p. 19. https://www.tankonyvtar.hu/en/tartalom/tamop412A/2011-0038_49_radvanyi_en/index.html 2018年9月23日閲覧。 
  3. ^ Kahate, Atul (2006). Introduction to Database Management Systems. Pearson. p. 3. ISBN 978-81-317-0078-5. https://books.google.com/books?id=mxYESolfLfoC 2018年9月23日閲覧。 
  4. ^ Connolly, Thomas (2004). Database Solutions: A Step by Step Guide to Building Databases (2nd ed.). Pearson. p. 7. ISBN 978-0-321-17350-8. https://archive.org/details/databasesolution00conn_535 
  5. ^ Felleisen, Matthias (2001). How To Design Programs. MIT Press. pp. 53, 60. ISBN 978-0262062183. https://archive.org/details/howtodesignprogr00fell_231 
  6. ^ Kraimer. “EPICS Input / Output Controller (IOC) Application Developer's Guide”. Argonne National Laboratory. 2015年11月25日閲覧。