記録(コンピュータサイエンス)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピュータサイエンスではレコード(構造体、 構造、または複合データとも呼ばれます)は基本的なデータ構造です。データベースまたはスプレッドシートのレコードは通常、「」と呼ばれます。[1] [2] [3] [4]

レコードは、通常は固定の数と順序で、場合によっては異なるデータ型のフィールドのコレクションです。[5]レコードのフィールドは、特にオブジェクト指向プログラミングでは、メンバーと呼ばれることもあります。フィールドは要素と呼ばれることもありますが、これはコレクションの要素と混同されるリスクがあります

たとえば、日付は、数値のフィールド、文字列として表される月フィールド、および数値の日フィールドを含むレコードとして格納できます。人事レコードには、名前給与、およびランクが含まれる場合があります。円レコードには中心半径が含まれる場合があります。この場合、中心自体はx座標とy座標を含むポイントレコードとして表される場合があります

レコードは、フィールドの数が通常固定されており、各フィールドに名前があり、各フィールドのタイプが異なる場合があるという事実によって、 配列と区別されます。

レコード型は、そのような値と変数を記述するデータ型です。最新のコンピューター言語のほとんどでは、プログラマーは新しいレコードタイプを定義できます。定義には、各フィールドのデータ型と、フィールドにアクセスできる識別子(名前またはラベル)の指定が含まれます。型理論は、単純さから製品タイプ(フィールド名なし)が一般的に好まれますが、適切なレコードタイプはSystemF -subなどの言語で研究されています。型理論レコードには、データに加えてファーストクラスの関数型フィールドが含まれる場合があるため、オブジェクト指向プログラミングの多くの機能を表現できます。

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

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

オブジェクト指向言語のオブジェクトは、基本的に、そのレコードの処理に特化したプロシージャを含むレコードです。オブジェクトタイプは、レコードタイプの詳細です。実際、ほとんどのオブジェクト指向言語では、レコードはオブジェクトの特殊なケースであり、オブジェクト指向機能を使用するオブジェクトとは対照的に、 プレーンオールドデータ構造(PODS)として知られています。

レコードは、数学 タプルのコンピューターアナログと見なすことができますが、タプルはレコードと見なされる場合と見なされない場合があり、その逆も同様です。これは、規則や特定のプログラミング言語によって異なります。同様に、レコードタイプは、2つ以上の数学セットの直積のコンピューター言語アナログ、または特定の言語で の抽象製品タイプの実装と見なすことができます。

キー

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

歴史

1880年の米国国勢調査のジャーナルシート。データの行を含む表形式のデータが表示され、各レコードは1人の人物に対応しています。

レコードの概念は、遠い昔から会計で使用されていたさまざまな種類のテーブル元帳にまでさかのぼることができます。明確に定義されたタイプとサイズのフィールドを持つコンピュータサイエンスのレコードの現代的な概念は、バベッジ分析エンジンなどの19世紀の機械式計算機ですでに暗示されていました。[6] [7]

ホレリスパンチカード(1895)

(制御ではなく)データに使用された元の機械可読媒体は、 1890年の米国国勢調査でレコードに使用されたパンチカードでした。各パンチカードは単一のレコードでした。1880年のジャーナルエントリと1895年のパンチカードを比較してください。ほとんどのデータ処理がパンチカードを使用して行われた20世紀前半には、記録が確立されていました。通常、データファイルの各レコードは、特定のフィールドに割り当てられた特定の列を使用して、1枚のパンチカードに記録されます。一般に、レコードは、外部ストレージ(カードリーダー、テープ、ディスクなど)から読み込むことができる最小の単位でした。

ほとんどの機械語の実装と初期のアセンブリ言語にはレコード用の特別な構文はありませんでしたが、この概念は、インデックスレジスタ間接アドレス指定、および自己変更コードを使用することで利用できました(そして広く使用されました) 。IBM 1620などの一部の初期のコンピューターは、レコードとフィールドを区切るためのハードウェアサポートと、そのようなレコードをコピーするための特別な命令を備えていました。

レコードとフィールドの概念は、 IBMのレポートプログラムジェネレーター(RPG)などの初期のファイルの並べ替え集計のユーティリティの中心でした。

COBOLは、レコードタイプをサポートする最初の普及したプログラミング言語であり[8]、そのレコード定義機能は当時非常に洗練されていました。この言語では、任意のサイズと精度の英数字、整数、小数のフィールド、および割り当てられた値を自動的にフォーマットするフィールド(通貨記号、小数点、数字グループの区切り文字など)を使用してネストされたレコードを定義できます。 )。各ファイルは、データの読み取りまたは書き込みが行われるレコード変数に関連付けられています。COBOLはMOVE CORRESPONDING、名前に従って2つのレコードの対応するフィールドを割り当てるステートメントも提供します。

FORTRANFORTRAN IVまで)やAlgol 60などの数値計算用に開発された初期の言語は、レコードタイプをサポートしていませんでした。しかし、 FORTRAN77Algol68など、これらの言語の新しいバージョンでは追加されていました。元のLispプログラミング言語も(組み込みのconsセルを除いて)レコードが不足していましたが、そのS式は適切な代理を提供しました。Pascalプログラミング言語は、レコード型を他の基本型と完全に統合して論理的に一貫した型システムにした最初の言語の1つでした。PL / ICOBOLスタイルのレコード用に提供されているプログラミング言語。Cプログラミング言語は当初、struct実際のレコードデータ型ではなく、メモリ領域の上に配置できる一種のテンプレート()としてレコードの概念を提供していました。後者は最終的に(typedef宣言によって)提供されましたが、2つの概念は言語ではまだ異なります。Pascal以降に設計されたほとんどの言語(AdaModulaJavaなど)もレコードをサポートしていました。

操作

  • 各フィールドの位置、タイプ、および(場合によっては)名前を含む、新しいレコードタイプの宣言。
  • 特定のレコードタイプを持つものとしての変数と値の宣言。
  • 指定されたフィールド値から、および(場合によっては)指定されたフィールド名を使用してレコード値を作成します。
  • 明示的な名前を持つレコードのフィールドの選択。
  • レコード変数へのレコード値の割り当て。
  • 平等のための2つのレコードの比較。
  • レコードの標準ハッシュ値の計算。

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

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

レコードのサブタイピングを使用するシステムでは、レコードタイプの値に対する操作には次のものも含まれる場合があります。

  • レコードに新しいフィールドを追加し、新しいフィールドの値を設定します。
  • レコードからフィールドを削除します。

このような設定では、特定のレコードタイプは、特定のフィールドセットが存在することを意味しますが、そのタイプの値には追加のフィールドが含まれる場合があります。したがって、フィールドxy、およびzを持つレコードは、フィールドxy、およびrを持つレコードと同様に、フィールドxおよびyを持つレコードのタイプに属します。理論的根拠は、(xyz )レコードを( xyを期待する関数に渡す)ということです。)引数としてのレコードは機能するはずです。これは、その関数がレコード内で必要なすべてのフィールドを検索するためです。プログラミング言語でレコードを実際に実装する多くの方法では、そのような可変性を許可するのに問題がありますが、問題は、より理論的なコンテキストでのレコードタイプの中心的な特性です。

割り当てと比較

ほとんどの言語では、まったく同じレコードタイプ(同じフィールドタイプと名前を同じ順序で含む)を持つレコード間の割り当てが可能です。ただし、言語によっては、別々に定義された2つのレコードデータ型は、まったく同じフィールドを持っている場合でも、別個の型と見なされる場合があります。

一部の言語では、フィールドの名前が異なるレコード間での割り当てが可能であり、各フィールド値をレコード内の位置によって対応するフィールド変数と照合します。たとえば、フィールドが呼び出された複素数はreal、フィールドとが含まれる2Dポイントレコード変数imag割り当てることができますこの代替方法では、2つのオペランドが同じフィールドタイプのシーケンスを持つ必要があります。一部の言語では、対応するタイプも同じサイズとエンコーディングである必要がある場合があります。これにより、レコード全体を未解釈のビット文字列として割り当てることができます。XY他の言語はこの点でより柔軟であり、各値フィールドを対応する変数フィールドに合法的に割り当てることができることだけを要求します。そのため、たとえば、短整数フィールドを長整数フィールドに割り当てることができ、その逆も可能です。

他の言語(COBOLなど)は、位置ではなく名前でフィールドと値を照合する場合があります。

これらの同じ可能性は、等しいかどうかの2つのレコード値の比較にも当てはまります。一部の言語では、個々のフィールドの比較に基づく辞書式順序を使用して、順序の比較( '<'および '>')を許可する場合もあります。[要出典]

PL / Iでは、前述の両方のタイプの割り振りが可能であり、「a」がレコードである場合 などの構造式、またはPL / I用語での構造も許可されます。a = a+1;

Algol68の分配フィールド選択

Algol 68では、Ptsレコードの配列であり、それぞれに整数フィールドXとが含まれている場合、のすべての要素のフィールドで構成される整数の配列を取得するためにY書き込むことができます結果として、ステートメントは同じ効果を持ちます。 Y of PtsYPtsY of Pts[3] := 7(Y of Pts)[3] := 7

Pascalの「with」ステートメント

Pascalプログラミング言語では、コマンドは、レコードのすべてのフィールドが変数として宣言されているかwith R do Sのようにコマンドシーケンスを実行します。したがって、書く代わりに、を書くことができますSRPt.X := 5; Pt.Y := Pt.X + 3with Pt do begin X := 5; Y := X + 3 end

メモリ内の表現

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

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

自己定義レコード

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

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

  • PL / I:
      1つの日付を宣言し、
                2年間の固定バイナリ、
                2か月の固定バイナリ、
                2日間の固定バイナリ。
    
  • アルゴル68:
  mode date = struct (int year, int month, int day);
  • C:
    構造体 の日付{ 
       int; 
       int; 
       int; 
    };
    
  • Fortran
    タイプ :: 日付
       整数 ::   日の
    終了タイプ日付
    
  • 行く
    タイプ Datestruct  { year int monthtime  _ _ 月日int } _
              
             
               
    
    
  • パスカル
    タイプ TDate  = レコード
        整数; 
        1 .. 12 ; 
        1 .. 31 ; 
    終了;
    
  • さび
    構造体 日付{ 
        u32 
        u32 
        u32 
    }
    
  • スイフト
    struct  Date  {
         Int 
         Int 
         Int 
    }
    
  • Haskell
    データ 日付 = 日付 {  :: 整数
                       :: 整数
                       :: 整数
                     }
    
  • ジュリア
    構造体 日付
        ::整数
        ::整数
        ::整数
    終了
    
  • 標準ML
    タイプ date  =  {int  int  int }
    
  • COBOL
           01WS -DATE 
    02 WS-YEAR PIC9999 02 WS-MONTH PIC99 02 WS-DAY PIC99             
               
                 
    
  • Java 15
    record  Date int  year  int  month  int  day  { 
        //これは最低限必要なものです    
    }
    
  • Common Lisp
    defstruct  Date 
      year   0  :type  integer 
      month  1  :type  integer  1  12 ))
      day    1  :type  integer  1  31 )))
    

も参照してください

参考文献

  1. ^ 「コンピュータサイエンス辞書の定義」コンピューティング学生2018年1月22日取得
  2. ^ Radványi、Tibor(2014)。データベース管理システムEszterházyKárolyCollege。p。19 2018年9月23日取得
  3. ^ Kahate、Atul(2006)。データベース管理システムの概要ピアソン。p。3. ISBN 978-81-317-0078-52018年9月23日取得
  4. ^ コノリー、トーマス(2004)。データベースソリューション:データベース構築のステップバイステップガイド(第2版)。ピアソン。p。 7ISBN 978-0-321-17350-8
  5. ^ Felleisen、Matthias(2001)。プログラムの設計方法MITプレス。pp。53、60。ISBN  _ _ _ 978-0262062183
  6. ^ ブロムリー、アラン(1998年10月)。「チャールズバベッジの分析エンジン、1838年」コンピューティングの歴史のIEEE年報20(4):29–45。土井10.1109 /85.728228S2CID2285332 _ 2018年9月23日取得 
  7. ^ スウェード、ドロン。「自動計算:チャールズ・バベッジと計算方法」ラザフォードジャーナルラザフォードジャーナル2018年9月23日取得
  8. ^ セベスタ、ロバートW.プログラミング言語の概念(第3版)。Addison-Wesley Publishing Company、Inc.p。 218ISBN 0-8053-7133-8
  9. ^ Kraimer、Martin R. 「EPICS入力/出力コントローラー(IOC)アプリケーション開発者ガイド」アルゴンヌ国立研究所2015年11月25日取得