6

インターネットのどこにも答えが見つからない非常に単純な質問があります。

だから、私の質問は、手続き型プログラミングでは、コードはコードセクションにあり、読み取り専用メモリ領域に入ります。変数は、スタックまたはヒープのいずれかにあります。

しかし、OOPは、オブジェクトがメモリ内に作成されると言います。では、関数も R/W メモリ領域に書き込まれるということですか?

また、O には組み込みの OOP プログラムがサポートされている必要がありますか? たとえば、OS が読み取り専用コード セクションの外で命令を読み取ることを許可していない場合などです。ありがとう。

4

3 に答える 3

6

Generally, both OOP and procedural programming are abstractions which exist only at the source-code level. Once a program is compiled into executable machine-code, these abstractions cease to exist. So whether or not a particular language is OOP or procedural has no bearing on what regions of memory it uses, or where instructions are placed during execution.

The OS itself usually doesn't know or care whether a particular executable was written in an OOP or procedural language. It only cares that the executable uses binary op-codes compatible with its native instruction set, and that the executable has an ABI (binary interface) that it understands.

于 2010-11-07T22:47:50.803 に答える
3

これは良い質問です。

オブジェクトは理論的には同じ場所に配置されて機能データを構成するのに対し、ほとんどの実装ではそれを分割します。その方法は、コードを分割して RO セグメントに格納することです。RW 領域のオブジェクトには、RO 領域のそのコードを参照する方法があります。コードとデータの結合は、規則や原則に違反しないようにするために、人間のプログラマーと型チェッカーによって概念的にのみ使用されます。

Java/C# に似た言語は、通常、各オブジェクトにオブジェクトのタイプを識別するタグが含まれるように作成されます。オブジェクト自体は、事前に指定された順序で配置されたすべてのフィールドを含む単純な構造体です。次に、このタグを使用して、RO 領域で呼び出す関数を検索できます。RO 領域の関数は、thisまたはselfと呼ばれる追加のパラメーターを受け取るように変更されます。このパラメーターを介して、オブジェクトの内容にアクセスできます。メソッドがフィールドを参照する必要がある場合、メソッドは事前に指定された順序を知っているため、それを正確に行うことができます。継承を解決するにはいくつかのトリックが必要ですが、これがアイデアの核心です。

Python/Ruby に似た言語は、通常、メソッドが RO 領域のコードへのポインターであるハッシュ テーブルになるオブジェクトを作成します (言語がコンパイルされ、バイトコード インタープリターを介して実行されない場合)。関数呼び出しは、ハッシュ テーブルの内容を検索し、コード ポインターをたどることによって行われます。フィールドも同じハッシュ テーブルで検索されます。

これらの基本を理解した上で、ほとんどの実装では、呼び出す関数を見つけるためにポインターをたどる部分を回避するトリックを作成します。彼らは、単一の関数への可能な呼び出しを見つけ出し、絞り込もうとします。次に、ルックアップを適切な関数への直接呼び出しに置き換えることができます。これははるかに高速なソリューションです。

tl;dr バージョン: 言語セマンティクスは、フィールドとメソッドをオブジェクトの一部と見なします。実装では、それらを RO セグメントと RW セグメントに分割しました。そのため、OS のサポートは必要ありません。

于 2010-11-07T23:11:49.987 に答える
1

OOP doesn't say this. I have no idea where you read it, if you add a quote that would help.

Objects are variables, so what you know about variables is correct for objects. In languages like C# (.net framework actually) objects can only be stored in heap, because they are so called reference types. In C++ they can live anywhere.

But OOP says that object are created in memory. So, does it mean even functions are written into R/W memory area?

From this i concluded that you think that functions are objects. That is true in far not every OOP language. It is from functional languages where functions are first class objects. Functions are in majority of cases immutable and are placed in read only sections.

Common OSes like Windows, Linux and MacOsx are unaware of objects. This is purely program concept. .net framework and java vm provide layer of abstraction. They are execution environments that have build in object support.

于 2010-11-07T22:48:39.990 に答える