「純粋なオブジェクト指向言語」という用語の正式な定義は?


13

私はそのような質問を提起するためにSO兄弟の間でより良い場所を考えることができません。もともと「Pythonは純粋なオブジェクト指向言語ですか?」しかし、用語を定義しようとする際に人々が経験するトラブルや不快感を考慮して、用語自体の明確な定義を取得することから始めることにしました。

言葉を作り出したアラン・ケイ博士による通信から始めるのはかなり公平でしょう(細胞または他の生物との生物学的類推のインスピレーションに注意してください)。

タスクにアプローチするには、次の方法があります。

  1. 用語を定義するために一意で十分な特定のプロパティを示す(またはそうしない)プログラミング言語をリストして比較分析を行います(ただし、Smalltalk、Scala、Javaなどは可能ですが、IMOはこのように完全には見えません)実りもありません)
  2. 正式な定義(またはそれに近い、たとえば、より学術的または数学的なスタイル)を提供します。
  3. 具体的な言語のセマンティックコンテキストまたはアプリオリなプログラミングエクスペリエンスに完全に依存する哲学的定義を提供します(コミュニティによる説明が成功する可能性があります)。

私の現在のバージョン:「操作とオペランドを(文法的に)区別し、このタイプがオブジェクト(OOPの意味)であるかどうかを各オペランドのタイプについて推測できる特定のプログラミング(フォーマル)言語がオブジェクトであるこの言語に少なくとも1つのタイプがある限り、そのような言語はオブジェクト指向言語です。最後に、言語のすべてのタイプがオブジェクトでもある場合、そのような言語を純粋な(強い)オブジェクト指向言語と定義します。

それの可能な改善を感謝します。ご覧のように、「オブジェクト」という用語に依存する定義を作成しました(多くの場合、オブジェクトのクラスとして完全に参照されます)。

[編集]

また、私はの(幸運にもよく理解)という概念を使用タイプを型付けの言語のように。データ型プログラミングまたは型指向プログラミングは、(プログラムテキスト、つまりリテラルおよびデータ変数の特定の値をどのように処理するか-タイプセーフティに進化するもの)の構文解釈であるだけでなく、言語文法に起因し、正式な方法で研究できる(数学的論理を使用)いわゆる型システムとして。特定の型システムにいわゆるユニバーサル型を要求することは、OO言語の純度を定義する方法の1つです(これを意味的に拡張する方法があります)。

NB

答える方法

  • 用語や概念の理解をサポート/説明する本または参考文献を指定すると役立ちます(通常、基本を除くすべての依存概念を適切な定義がカバーまたは参照します)。
  • 可能であれば、明確でない場合はインデントされた回答/定義のカテゴリを示します(上記を参照:1-言語の例、2-数学的論理、3-技術的な説明とプログラミング哲学)
  • 分類は重要である(とも用語純粋-OOは、長期OOに含まれているため)他のよく知られた方法論からOOパラダイムのunmix要素に試して答えながら(と決して混乱/それらをオーバーラップする、の例えば通常の要素モジュールをカバーすることができます/オブジェクト指向プログラミングで具体化):OOPと機能プログラミング、論理プログラミング(特に強く専門化された)、Abstarct Data Types(ADT)、Modular、Metaprogramming(generics and LISP's macroexpansion-time)との区別を試みる、契約(例:エッフェル)、アスペクト指向(AO)、(宣言的分類と機能的分類の違い、およびダイクストラの構造化の歴史的定義は明確です)

正式な定義を与えることの難しさ:驚くべきことに、特定の論理(正式な)システムの形式でOOPの数学的な記述を与えることは非常に簡単です(ほとんどの場合、型ベース)。その形式主義を単にエンターテインメントやエクササイズだけでなく、タイプセーフティチェック新しい言語デザインの側面に適用することにより、より実用的なことを試みることもできます(また、ラムダ計算としてのFOL形式で、直観的型理論依存型、そして単にカテゴリー理論を使用して)。ここでの主なポイントは、当然のことです多分、一定の割合の発見を除いて-そのような製剤は、IMO強く、最も可能性の高い最初は不完全なので、ほとんどの世界をプログラミングに後方貢献していない((コンピューター・エンジニアリングで)OOPの理解と、その後はほぼアクセスできなくなってしまうことで(不備)バイアスされていることにより、バック正式な世界からの用途一般的な言語に統合されています)。

そうです、定義だけでなく、正確に「良い」定義を与えることは困難です。しかし、皆さんの経験と直接的な関与のおかげで、ここでこれを尋ねることに前向きです。


2
さて、あなたはPythonについて自分で答えました。"番号"。
psr

2
素敵な質問の1が、あなたのバージョンでは、という問題で欠陥が少しあるタイプオブジェクトが異なるものです。
フランク

5
@JoachimSauer:彼はSqueakメーリングリストの別のメールで、「大きなアイデアはメッセージング」であり、「オブジェクト指向」と呼んだことを後悔し、代わりに「メッセージ指向」と呼ぶべきだったと述べました。たとえば、Erlangは、「オブジェクト」、「メソッド」、「継承」、「クラス」、「プロトタイプ」などの概念を一切持たずに、Dr。Kayのすべての基準を満たす完全にオブジェクト指向の言語です。 。
ヨルグWミットタグ

1
これは、OO言語を定義するのに構文だけでは十分でないことを示す良い例かもしれません。OOP(たとえばツールとして)が意味のみ(構文に依存しない)であることを示すことができれば、それは私の質問を完全に変更(反転)します!
ヤウヘンヤキモビッチ

2
@YauhenYakimovichこれは、OOPを議論する上での根本的な問題の1つです。みんなと彼の犬は、それが何であるかについて独自の考えを持っています。対照的に、構造化プログラミングと関数型プログラミングはそれぞれ非常に簡単に定義できます。これは、OOが科学ではなく宗教に似た特性を持っているかどうかを疑問に思うように導きます。
リッキークラークソン

回答:


19

OO、Alan Kayによると、メッセージの受け渡しはすべて、それだけです。ポリモーフィズムやカプセル化などの品質は、実際にはメッセージパッシングから派生していることがわかります。

基本的には、Smalltalkと言語だけが資格を得るということを意味するため、そのスタンスは実際には非常に極端です。

オブジェクト指向は、オブジェクトの状態を完全にカプセル化し、固有の多態的な性質により交換可能にされるエンティティ上にシステムを構築するものとして定義できると思います。したがって、純粋にオブジェクト指向言語は、これら2つのコア品質が常に満たされることを保証できます。OO言語を「不純」にするのは、以下の可能性など、これらの基準を満たさない構成要素を作成できるメカニズムです。

  • パブリックフィールドを宣言する
  • 特定のクラスとそのサブクラスのインスタンスのみを保持できる変数を宣言します(つまり、変数はインターフェイスに対して入力する必要があります。これは、Kayのアナロジーで生物学的オブジェクトが通信するものです)。多型の余地がさらに少なくなります
  • プリミティブを宣言する

繰り返しになりますが、IMHO言語の純粋さは強さというよりも弱さです。OOは特効薬ではありません。単一のパラダイムはありません。


2
「OOは特効薬ではない」ための+1。
アンドレスF.

1
@AndresF。OOPの実際的な価値だけでなく、プログラミングに関連する他の理論的知識も、実際には問題の一部ではないことに注意してください。プログラミング技術や理論(およびその逆)を深く理解していなくても、かなり成功した方法でコードを記述できることは明らかです。オブジェクト指向言語の特性が議論されているアプリケーションなども
Yauhen Yakimovich

@YauhenYakimovichああ、わかった。トピックから外れていれば、その答えを支持しなかったでしょう。それでも、私は同意する主張が好きでした。
アンドレスF.

@AndresF。確かに:-)「OOは特効薬ではありません」というのは、完璧なプログラミング言語を欠いているのと同じくらい本当です。しかし、OOPが特効薬ではない理由は何ですか?良いバグレポートとして、詳細かつ正確な用語がこれに答える方法だと思います。私はこれに取り組むことに多くの時間を費やしてきたので、次のレベルに持っていくことに興味があります。OOPは、あるプログラミング本から別の本に貼り付けられた単なるアイデアのコピーですか?
ヤウヘンヤキモビッチ

Kay(Smalltalk、Objective-C)によると、「メッセージの受け渡し」の役割を明示的に指摘した@ back2dos +1。どうやら彼は、OOPが今日の方向に向かって発展するのを見るつもりはなかったようです。しかし、Kayには、オブジェクト(データ)ではなくオブジェクトを作成するというアイデアがあったのがとても気に入りました。彼は本当にそれらを生物学的特性とみなすようにプッシュしましたが、結局「メッセージング」になりました。
ヤウヘンヤキモビッチ

6

私はこれを、OOP構造体のみを使用する言語として定義することでアプローチします(純粋なFP言語が、不変データのみを含む純粋な関数を使用するのと同じ方法で)。

特に:

  • プログラムが動作するすべてのエンティティは、ファーストクラスのオブジェクトです。つまり、プリミティブ、ポインター、配列などはありません。
  • オブジェクトでできることは、そのオブジェクトで(潜在的にポリモーフィックな)メソッドを呼び出すことだけです(==メッセージの送信)。他の操作は存在しません。
  • すべてのデータはカプセル化されます -つまり、パブリックフィールドアクセスはありません。オブジェクトのメソッドを経由する必要があります
  • あなたがファーストクラスの関数を持っている場合、それらはオブジェクトでなければなりません -あなたは次のようなことをする必要がありますfunctionObject.call(param1,param2)
  • グローバル変数なし -このようなものが必要な場合は、オブジェクトを使用して現在のグローバル環境を表す必要があります。たとえばenvironment.getValue("myThing")、変数をクラスオブジェクトに入れる

これにより、かなり多くのオプションが開いたままになることに注意してください。

  • クラスベースとプロトタイプベースのオブジェクトモデル
  • 継承の実装方法(ある場合)
  • メソッドに単一または複数のディスパッチがあるかどうか
  • オブジェクトが静的または動的に入力されるかどうか
  • メソッド呼び出しに使用される正確な構文(たとえば、getter / setterなどの構文糖を使用できます)

1
これらは適切な定義ですが、オブジェクトの現実と単なる構文を混同しないでください。関数とグローバル変数がわかりやすい構文を持っているからといって、実際にはそれらは中心的なオブジェクトである可能性があります。
ddyer

@ddyer-それが本当に単なる構文であれば正しいのですが、構文が異なるセマンティクスを導入する場合、「純粋さ」を破ることができると思います。たとえば、グローバル変数globalVariableNameにアクセスするために使用するwrtグローバル変数は、オブジェクトのメソッド呼び出しとは異なるセマンティックです。これは、純粋なOOPの非ローカル値にアクセスする唯一の方法です。
mikera

「すべて」を修飾する必要があると思います。言語にリフレクション機能がない場合(たとえば、抽象名でオブジェクトのメソッドを参照したり、変数に格納したりできない場合)、メソッドもオブジェクトである必要がありますか?参照オブジェクトですか?参照とオブジェクトは異なるものですか?
ヨアヒムザウアー

@Joachim-良い点。オブジェクトを変数名や構文構造などの言語のメタオブジェクトと区別するために、「プログラムが動作するすべてのエンティティ」として修飾しました。明らかに、プログラムがリフレクションを介してそのようなものを実際に操作する場合、それらは実際のオブジェクトとして具体化する必要がありますが、それは必ずしも要件ではありません。とにかく、あなたがより良い資格を考えることができるならば、それでそれを編集するのを遠慮しなくしてください!
ミケラ

「クラスベースのオブジェクトモデルとプロトタイプベースのオブジェクトモデル」:どちらの場合も、何らかの分類、つまり、共通の構造と動作でオブジェクトをグループ化するということです。
ジョルジオ

4

いわゆるオブジェクト指向言語についての議論は、常に頭を洗う側に過ぎません。すなわち:

「誰かが言語XはOOであると言ったので、言語XはOOに等しく、言語Xの機能を欠くすべての言語はおそらくOOになることはできません。 」

オブジェクト指向設計という用語は、次の3つに要約されます。

  1. 別名として、プログラムの残りの部分についての不必要な情報を知らない自律オブジェクトとモジュラーデザイン疎結合できるだけ。
  2. 意図的および偶発的な外部アクセスを防ぐためのオブジェクト内のデータのカプセル化。
  3. オブジェクト間で明確に指定された依存関係。疎結合を実現するだけでなく、プログラムの保守と拡張を容易にするため。

1)純粋なプログラム設計であり、どのプログラミング言語でも実現できます。ただし、一部の言語には、クラス/構造やプライベートキーワードなどの便利な機能があります。

2)主にプログラム設計ですが、偶発的な使用から保護するためにプライベート/静的などの言語メカニズムが必要なので、言語サポートなしでは完全に達成することはできません。

3)主にプログラム設計です。通常、「オブジェクトXにはオブジェクトYが含まれる」、「オブジェクトXはYの一種」、「オブジェクトXはオブジェクトYと対話する」という3つの異なる依存関係があります。これらの依存関係を支援する多くの言語機能があります:継承/ポリモーフィズム、抽象基本クラスなど。

さて、上記を見ると、OOプログラムを作成するために言語機能はほとんど必要ないことがわかります。この機能により、はるかに簡単になります。

上記の目標は、泥臭い後方ロジックを使用して達成することはできません。classキーワードを使用しているという理由だけで、プログラムは自動的にモジュール設計になりません。継承を使用するからといって、オブジェクトの依存関係が意味をなすことを自動的に意味するわけではありません。オブジェクト指向機能を備えた言語でも、class TheWholeBloodyProgram「動物は猫を継承する」などのことが可能です。

悲しいことに、オブジェクト指向の優れたプログラム設計のトピックは、この種の議論ではめったに言及されません。洗脳されたプログラマーは、たとえば「C ++にはプリミティブデータ型があるのでC ++プログラムはオブジェクト指向ではない」などの構文とyapの事柄だけを見てから、プログラム設計は何でも。

質問に答えるには、適切なオブジェクト指向プログラムの設計をサポートする言語があれば、ごくわずかです。プログラマーがオブジェクト指向設計の意味を知らない限り、特定のオブジェクト指向に関連する機能を持つ言語を見つけることは無関係です。特定の言語がオブジェクト指向であると主張するプログラマーは、オブジェクト指向の概念全体を把握していない可能性が高いです。OOプログラマーにOOプログラムの設計方法を尋ねてください。彼らが最初にやることが言語キーワードを叫ぶことであるなら、あなたは彼らがオブジェクト指向デザインを知らないと仮定しても安全です。

おそらく、生のソースコードよりもはるかに高度なUML風の派手なツールがいくつか存在し、プログラマーはオブジェクト指向設計の優れたプログラムのみを書くように強制されますが、私はそれを疑います。オブジェクト指向プログラミングに最適な設計ツールは、おそらく人間の脳と常識です。


あなたの定義がどのように異なるかを明確にできますか?あなたは正しい軌道に乗っていると思いますが、まだ電車が見えません!
ヨルグWミットタグ

@JörgWMittag必ずしも違いはありませんが、従来のADT:は、オブジェクト指向設計を使用して、適切なカプセル化、セッター/ゲッター、継承方法などを使用して記述できます。しかし、オブジェクト指向設計に関係なく記述できます。->

2
@JörgWMittagたとえば、Cのような言語があり、OOの言語サポートが制限されている場合、オブジェクト指向の方法でADT:sを記述するのは難しいです。最も一般的な間違いは、ADTの割り当てを呼び出し元に任せることです。つまり、内部構造がすべて公開された公開構造体を提供し、カプセル化を解除します。Cでこれを行う適切な方法は、いわゆる「不透明型」(不完全な型)を使用することですが、多くのCプログラマーがそれらを使用することを知っているわけではありません。

@Lundin:JörgWMittagが別の回答へのコメントとして投稿した論文には、ADTとOOの(IMO)興味深い比較があります。
ジョルジオ

いくつかのUMLの本(おそらく)から、追加のポイント0を覚えています。抽象性(多型、継承、集約などのオブジェクト間の関係に不可欠な抽象定式化の重要性を強調)
ヤウヘンヤキモビッチ

2

いいえ、正式な定義や有用な定義さえありません。一部の人々にとって、OOPは「ユニバーサル基本クラス」と「ガベージコレクターで最適な参照セマンティクスを使用する必要があります」を意味します。

最終的に、最初に、「オブジェクトとは何ですか?」という質問に答える必要があります。より偏狭な人は、無意味な普遍的な基本クラスから継承し、資格を得るためにガベージコレクターに不必要に割り当てられることを主張します。しかし、私ははるかに便利な定義を好みます。OOPの目的は、いくつかのデータと、そのデータに対して呼び出すことができるいくつかの関数を保持することです。そう

  • オブジェクトはいくつかの状態を保持し、その状態でいくつかの機能を提供します。

この場合、int資格さえあります。結局、C ++でプリミティブまたはオブジェクトのいずれかを受け入れることができるテンプレートコードを記述する場合、プリミティブが実質的な方法で異なると主張することは困難になります。Vector v1, v2; v1 + v2;代わりに意味のある違いは何もありませんint v1, v2; v1 + v2;(不正な初期化セマンティクスを除き、認めなければなりません)。また、これは、ラムダとそのようなものがオブジェクトを保持することを許可します。それらは、状態を保持し、キャプチャを行い、ラムダを呼び出すためにその状態に関する機能を提供します。

幸いにも、状態(アドレス)とその状態の関数(呼び出すため)の両方を保持しているので、自由な関数へのポインターをオブジェクトとして分類することもできます。したがって、すべてのフリー関数が実際にはグローバル関数ポインターであると言ったとしても、フリー関数を許可する必要があります。


2
このような区別は必要ないと思います。しかし、第二に、他のオブジェクトが持っているものと同じアイデンティティを持っています-アドレス/参照の比較。アドレスを比較することを除いて、同じ状態の2つのオブジェクトを区別できないという事実は、決して新しいものではなく、すべてのオブジェクトに適用されます。
DeadMG

5
-1。役に立たず不必要な暴言で始まり、すぐにアドホミネム攻撃に切り替わりますが、リモートであっても事実(OOPの定義)だけが間違っています。抽象データ型とオブジェクトの違いについては、William R. Cookによるデータ抽象化の理解についてをご覧ください。
ヨルグWミットタグ

1
「そのような区別の必要性はない」もちろん、一般に受け入れられているものとは異なるオブジェクトの独自の概念を開発できます。あなたはそれを完全に自由です。
ジョルジオ

2
@Jörg私は違うことを請う。私はこの投稿に完全には同意しませんが、最初の段落の警告を「役に立たない」または「暴言」と呼ぶことは不誠実です。OOPの定義に関して、一般的に合意されたものはありません。それはシンプルで、広く認められている事実です。ポストの残りの部分は、OOPの定義。確かに、最も広く使用されているものでも、私が提供するものでもありませんが、DeadMGが言ったように、実際には非常に有用なものです。
コンラッドルドルフ

2
@KonradRudolph:構文を気にするプログラマーを人種差別主義者と比較したり、このサイトの特定のユーザーに名前で言及したりするなど、コメントを書いたときのパラグラフは非常に異なっていました。
ヨルグWミットタグ

0

あなたは否定的な例でそれを考えることができます。Javaは、オブジェクトではないプリミティブ型もあるため、純粋なオブジェクト指向言語ではありません。これらは整数、倍精度、配列などです。純粋なオブジェクト言語では、オブジェクトのセマンティクスはすべてに利用可能です。

また、オブジェクトフレームワーク内であっても、どのくらいの言語が変更に対して閉じられているかという問題もあります。Javaでは、StringやClassなどの一部のクラスに新しいサブクラスを定義できません。

どの言語が純粋ですか?頭に浮かぶ唯一の候補はsmalltalkです。


Rubyの純粋なオブジェクト指向言語でもないのですか?
zxcdw

2
@zxcdw(およびddyer):それはまさに問題です。「純粋なOO」の正式な定義を誰も持っていないため、誰もその質問に明確な答えを出すことはできません。
ヨアヒムザウアー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.