「クラス (コンピュータ)」の版間の差分
編集の要約なし |
I.hidekazu (会話 | 投稿記録) 第0世代オブジェクト指向プログラミングという造語を導入した上で、クラス構文の概要について大まかに記載した。 |
||
1行目: | 1行目: | ||
[[プログラミング]]における'''クラス'''({{lang-en-short|class}})とは、 |
[[プログラミング]]における'''クラス'''({{lang-en-short|class}})とは、既成のプログラムを再利用するボトムアップ型開発において、コンパイル済みファイルの生成に相当する操作を言語内部で行うための構文を言う。操作法の統一のため抽象データ型として表現されるが、概念的にクラス構文から生成される要素は並列実行も可能であり通常のデータ型とは異なる。 |
||
ク |
ダイクストラの[[構造化プログラミング]]の欠点を補う技法として[[オーレ=ヨハン・ダール]]によって[[Simula|Simula67]]において初めて導入された。 |
||
クラスの構文は、[[オブジェクト指向プログラミング]]の基本である。 |
|||
== 概要 == |
== 概要 == |
||
ダイクストラの[[構造化プログラミング]]は、プログラムの大規模開発への道を開いたが、あくまで単一スレッド(single thread)計算機を前提としたトップダウン型開発方法であった。すなわち、プログラムのすべての機能は単線の計算プロセス上で実行する必要があり、たとえ甲と乙という汎用的な単機能を提供する検証済みのプログラムがそれぞれ独立に存在していても、両機能を実現するプログラムを作成するためには、ソースコードから該当機能部分を抜き出し、単線上に乗るように連接(concatenation)した上で、一つのプログラムとして正しく動作するように修正し、さらに再度検証しなければならない。 |
|||
[[構造化プログラミング]]においては、手続き(またはサブルーチン、関数、より一般にはブロック;block)の概念は「三つの知性の道具」の一つである抽象(abstract)を実現するにあたって基本的なものであるが、手続きやブロックは、一度呼び出して計算結果を返してしまうと、計算するために生成された動的プロセスは消滅しているため、その生成された動的プロセスをあとから参照することができない。 |
|||
一方で、複数スレッド(multi thread)計算機においては、主プログラムから、甲と乙のプログラムなどの従プログラムをそれぞれ並列に実行させた上で、処理してほしい内容を伝言(message)の形で実行中の従プログラムに渡し(pass)、その処理結果を主プログラムの処理結果として返すことで、検証済みプログラムのソースコードに手を加えることなく、低コストで開発することができる(以下、第0世代オブジェクト指向プログラミングと呼ぶこととする)<ref>ただし、随所にOSの機能を利用することになるため異なるOSへの移植性が低い上に、主プログラムと並列呼び出しする従プログラムが異なる言語で記述されている場合、複数の異なるコンパイラが必要となり、場合によっては複数の異なる言語を使用しなければならなくなってしまう。</ref>。 |
|||
1970年頃、[[オーレ=ヨハン・ダール]]と[[アントニー・ホーア]]は、手続きまたはブロックを呼び出すことで生成される動的プロセスの実例(インスタンス;instance)は、実体をもって存在している対象(object)として扱えるようにすることで動的プロセスの実例同士が相互作用可能となり、より広い範囲の概念をうまく表現することができると主張した<ref>[[#構造化プログラミング(1975)|構造化プログラミング(1975)]] pp.201-202</ref>。 |
|||
[[オーレ=ヨハン・ダール]]と[[アントニー・ホーア]]は、この第0世代オブジェクト指向プログラミングのような考え方の有効性を主張し<ref>[[#構造化プログラミング(1975)|構造化プログラミング(1975)]] pp.201-202</ref>、主プログラムから従プログラムを並列呼び出しする際、読み込みするにあたって新たに(new)割り当てられたメモリ領域に限定して走る計算プロセスを実例(instance;インスタンス)と呼び、さらにそのメモリ領域上を限定して走る計算プロセスの集まり(class of instances;実例のクラス)をそれが記述されたソースコードと同一視することで、'''クラス'''(class)構文を開発した。クラス構文は[[Simula|Simula67]]において初めて実装された。 |
|||
ダールは、動作可能な実例の集まりを'''実例のクラス'''(class of instances)と呼び、手続き(またはブロック)を定義しているプログラムテキストから処理系が該当テキストを評価するごとに一つの動的プロセスの実例が生成されるという観察から、実例のクラスはそのプログラムテキスト自体と同一視できると主張し、「呼び出されたときだけではなくそのあとも存在し続ける動的プロセスの実例(インスタンス)」を生成する言語上の構文を'''クラス'''(class)と名付けた<ref>[[#構造化プログラミング(1975)|構造化プログラミング(1975)]] pp.201-202</ref>。クラス構文は[[Simula|Simula67]]において初めて実装された。 |
|||
言語仕様にクラス構文を導入することで以下のような利益が得られることとなった。 |
|||
* 主プログラムと従プログラムを同一の言語で記述することができるようになる |
|||
* 複数スレッド計算機のOSに依存した以下の一連の操作を言語内部で統一的に処理できるようになる |
|||
** ソースコードのコンパイルによるオブジェクトファイル(object file)の生成、 |
|||
** 主プログラムからのメモリ割り当て |
|||
** 並列呼び出し |
|||
* 抽象データ型として表現される場合、OSを仲介した伝言のやりとりのような形式ではなく、体裁上は具体的データ型のデータに対する処理への引数渡し、処理返しとして取り扱い可能になる |
|||
クラスには、インスタンスの保持する[[データ]]('''メンバ変数'''、'''[[フィールド]]'''<ref>[[統一モデリング言語|UML]]では「[[属性]]」ともいう。</ref>と操作('''[[メソッド (計算機科学)|メソッド]]'''、'''メンバ関数''')が記述される<ref>プログラミング言語によっては、アクセス修飾子(access modifiers)が付与されることもある。</ref> |
クラスには、インスタンスの保持する[[データ]]('''メンバ変数'''、'''[[フィールド]]'''<ref>[[統一モデリング言語|UML]]では「[[属性]]」ともいう。</ref>と操作('''[[メソッド (計算機科学)|メソッド]]'''、'''メンバ関数''')が記述される<ref>プログラミング言語によっては、アクセス修飾子(access modifiers)が付与されることもある。</ref> |
||
45行目: | 54行目: | ||
== 参考文献 == |
== 参考文献 == |
||
* {{citation | author=オーレ=ヨハン・ダール, C.A.R. ホーア | title=階層的プログラム構造 | year=1972 | ref=ダール(1972) }} |
* {{citation | author=オーレ=ヨハン・ダール, C.A.R. ホーア | title=階層的プログラム構造 | year=1972 | ref=ダール(1972) }} |
||
** {{cite book |和書| title=構造化プログラミング | author=E.W.ダイクストラ | author2=C.A.R.ホーア | author3=O.-J.ダール | translator=野下浩平 | year=1975 | publisher=サイエンス社 | ref=構造化プログラミング(1975) }} (収録) |
** {{cite book |和書| title=構造化プログラミング | author=E.W.ダイクストラ | author2=C.A.R.ホーア | author3=O.-J.ダール | translator=野下浩平,川合慧,武市正人 | year=1975 | publisher=サイエンス社 | ref=構造化プログラミング(1975) }} (収録) |
||
* {{cite book | 和書 | title=システム プログラム | author=川合 慧 | publisher=近代科学社 | series=コンピュータサイエンス大学講座 | year=1982 | ref=川合(1982) }} |
|||
* {{citation | author=Ole-Johan Dahl | title=The Birth of Object Orientation: the Simula Languages | year=2001| pdf=http://www.olejohandahl.info/old/birth-of-oo.pdf | ref=Dhal(2001) }} |
* {{citation | author=Ole-Johan Dahl | title=The Birth of Object Orientation: the Simula Languages | year=2001| pdf=http://www.olejohandahl.info/old/birth-of-oo.pdf | ref=Dhal(2001) }} |
||
2019年1月17日 (木) 13:12時点における版
プログラミングにおけるクラス(英: class)とは、既成のプログラムを再利用するボトムアップ型開発において、コンパイル済みファイルの生成に相当する操作を言語内部で行うための構文を言う。操作法の統一のため抽象データ型として表現されるが、概念的にクラス構文から生成される要素は並列実行も可能であり通常のデータ型とは異なる。
ダイクストラの構造化プログラミングの欠点を補う技法としてオーレ=ヨハン・ダールによってSimula67において初めて導入された。 クラスの構文は、オブジェクト指向プログラミングの基本である。
概要
ダイクストラの構造化プログラミングは、プログラムの大規模開発への道を開いたが、あくまで単一スレッド(single thread)計算機を前提としたトップダウン型開発方法であった。すなわち、プログラムのすべての機能は単線の計算プロセス上で実行する必要があり、たとえ甲と乙という汎用的な単機能を提供する検証済みのプログラムがそれぞれ独立に存在していても、両機能を実現するプログラムを作成するためには、ソースコードから該当機能部分を抜き出し、単線上に乗るように連接(concatenation)した上で、一つのプログラムとして正しく動作するように修正し、さらに再度検証しなければならない。
一方で、複数スレッド(multi thread)計算機においては、主プログラムから、甲と乙のプログラムなどの従プログラムをそれぞれ並列に実行させた上で、処理してほしい内容を伝言(message)の形で実行中の従プログラムに渡し(pass)、その処理結果を主プログラムの処理結果として返すことで、検証済みプログラムのソースコードに手を加えることなく、低コストで開発することができる(以下、第0世代オブジェクト指向プログラミングと呼ぶこととする)[1]。
オーレ=ヨハン・ダールとアントニー・ホーアは、この第0世代オブジェクト指向プログラミングのような考え方の有効性を主張し[2]、主プログラムから従プログラムを並列呼び出しする際、読み込みするにあたって新たに(new)割り当てられたメモリ領域に限定して走る計算プロセスを実例(instance;インスタンス)と呼び、さらにそのメモリ領域上を限定して走る計算プロセスの集まり(class of instances;実例のクラス)をそれが記述されたソースコードと同一視することで、クラス(class)構文を開発した。クラス構文はSimula67において初めて実装された。
言語仕様にクラス構文を導入することで以下のような利益が得られることとなった。
- 主プログラムと従プログラムを同一の言語で記述することができるようになる
- 複数スレッド計算機のOSに依存した以下の一連の操作を言語内部で統一的に処理できるようになる
- ソースコードのコンパイルによるオブジェクトファイル(object file)の生成、
- 主プログラムからのメモリ割り当て
- 並列呼び出し
- 抽象データ型として表現される場合、OSを仲介した伝言のやりとりのような形式ではなく、体裁上は具体的データ型のデータに対する処理への引数渡し、処理返しとして取り扱い可能になる
クラスには、インスタンスの保持するデータ(メンバ変数、フィールド[3]と操作(メソッド、メンバ関数)が記述される[4]
クラスは、継承・ポリモーフィズム・カプセル化などの、オブジェクト指向プログラミングにおける重要な概念を実現する強力な手段である。
カプセル化 (encapsulation)
通常クラスには、インスタンスが持つデータと、そのインスタンスに対して行える操作が定義される。これらのデータや操作をばらばらに扱うのではなく、一つのクラスという単位に集約することで、データと操作の関連やインスタンスが持つ役割を明確にし、整理することができる。これをカプセル化という。
クラスを言語の機能として有するプログラミング言語の多くでは、クラスに定義されたデータ(フィールド)や操作(メソッド)に対してアクセス権を指定することで、クラスの外から直接扱えるフィールドやメソッドを制限することができる。これにより、クラスの外から不用意にフィールドの値が変更されたり不適切なメソッドが実行されたりしてしまうのを防ぐことができる。また、アクセスが制限されたフィールドやメソッドはクラスの外から見れば無いに等しいので、これらのフィールドやメソッドを修正してもクラスの外の部分には影響を与えずに済む。これを情報隠蔽という。
多くのプログラミング言語ではフィールドやメソッドの定義とアクセス権の指定は同時になされるため、カプセル化と情報隠蔽はしばしば混同される。
継承 (inheritance、extension、generalization)
あるクラスを基にして別のクラスをつくることを継承という。 継承は拡張ともいうことがあり、UMLでは汎化 (generalization) と呼んでいる。 継承の基になったクラスを親クラス・基本クラス・スーパークラス等といい、継承してできたクラスを子クラス・派生クラス・サブクラス等という。
複数のクラスを基にしてクラスを継承することを多重継承という。多重継承は、二つのクラスの同名メソッドのオーバーライドによるコンフリクトを始めとするいくつかの問題点が指摘されており、Java、C#、D言語等では実装多重継承はサポートされておらず、インタフェース多重継承のみサポートされている。
また、オブジェクト指向を効率よく使いこなすためには継承だけでなく集約 (aggregation)、委譲 (delegation) を理解する必要がある。
ポリモーフィズム (polymorphism)
継承する際に、親クラスの関数を子クラスの関数で置き換えることをオーバーライドという。オーバーライドをうまく使うと、オブジェクトによって、実質的に実行される関数が変わるようにできる。このようにして、見かけが一緒なのに動作が違うようにできることをポリモーフィズム(ポリモルフィズム)・多様性・多態性などという。
脚注
- ^ ただし、随所にOSの機能を利用することになるため異なるOSへの移植性が低い上に、主プログラムと並列呼び出しする従プログラムが異なる言語で記述されている場合、複数の異なるコンパイラが必要となり、場合によっては複数の異なる言語を使用しなければならなくなってしまう。
- ^ 構造化プログラミング(1975) pp.201-202
- ^ UMLでは「属性」ともいう。
- ^ プログラミング言語によっては、アクセス修飾子(access modifiers)が付与されることもある。
関連項目
参考文献
- オーレ=ヨハン・ダール, C.A.R. ホーア (1972), 階層的プログラム構造
- E.W.ダイクストラ、C.A.R.ホーア、O.-J.ダール 著、野下浩平,川合慧,武市正人 訳『構造化プログラミング』サイエンス社、1975年。 (収録)
- 川合 慧『システム プログラム』近代科学社〈コンピュータサイエンス大学講座〉、1982年。
- Ole-Johan Dahl (2001), The Birth of Object Orientation: the Simula Languages