8

「型システム」や「強いの言語」などについてよく耳にします。現在、私はいくつかの.NET COM相互運用性の問題に取り組んでおり、これは「マーシャリング」に多く対処していました。そして、AFAIK、マーシャリングは、.NETタイプとCOMタイプの間の変換に関するものです。

プログラミング言語などの多くのシナリオでは、について話すとき、論理的な意味が気になります。

今、私は疑問に思っています:「タイプ」は物理的に何を意味するのでしょうか?ある意味で、私たちは見たり触れたりすることができます。

私の現在の理解では、「タイプ」は計算エンティティのメモリ内表現に他なりません。

返信ありがとうございます。

追加-1

MSDNからの引用:

マネージド/アンマネージド境界を越えてシンプルでブリット可能な構造をマーシャリングするには、最初に各ネイティブ構造のマネージドバージョンを定義する必要があります。これらの構造には、任意の正式な名前を付けることができます。データレイアウト以外に、2つの構造のネイティブバージョンとマネージバージョンの間に関係はありません。したがって、管理対象バージョンには、ネイティブバージョンと同じサイズで同じ順序のフィールドが含まれていることが重要です。(構造の管理対象バージョンとネイティブバージョンが同等であることを保証するメカニズムはないため、非互換性は実行時まで明らかになりません。2つの構造のデータレイアウトが同じであることを確認するのはプログラマーの責任です。)

マーシャリングに関する限り、それはレイアウトの問題です。

4

10 に答える 10

15

プログラミングの「タイプ」には3つの側面があると思います(おそらくそれらは重複しているので、これをハードとファストの分離と見なさないでください)。

  • タイプはタイプのセットの要素であり、すべてのプログラム/アセンブリ/ユニットがそのようなセットを定義します。これは私が考えることができる最も理論的なアイデアであり、おそらく論理学者や数学者にとって最も有用です。これは非常に一般的であり、その上に型システムの概念を定義することができます。たとえば、プログラミング環境では、これらのタイプの関係、たとえばis-assignable-to関係を定義できます。

  • タイプはセマンティックカテゴリです。これは言語的または認知的アイデアです。言い換えれば、それはコンピュータをプログラムする方法を考えている人間にとって最も有用です。このタイプは、「カテゴリに属する​​もの」と私たちが考えるものをカプセル化します。タイプは、エンティティの共通の目的によって定義される場合があります。もちろん、目的に応じたこの分類は任意ですが、プログラミングでの型の宣言も任意であるため、問題ありません。

  • タイプは、データがメモリにどのように配置されるかの仕様です。これは私が考えることができる最も低レベルのアイデアです。この観点では、タイプはデータの目的やセマンティクスについては何も述べていませんが、コンピューターがデータを構築、処理する方法などについてのみ述べています。このアイデアでは、タイプはデータのエンコード通信にいくらか似ています。プロトコル

使用するタイプの意味は、ドメインによって異なります。すでに示唆したように、プログラムのプロパティを証明する方法を研究している論理学者の場合、データレイアウトは(通常)証明とは無関係であるため、最初の定義は3番目の定義よりも便利です。ハードウェア設計者またはCLRやJavaVMなどの低レベルシステムのプログラマーである場合は、3番目のアイデアが必要であり、最初のアイデアはあまり気にしません。しかし、自分の仕事をやりたいだけの一般的なプログラマーにとっては、おそらく真ん中のプログラマーが当てはまります。

于 2010-08-10T14:01:16.297 に答える
3

多くの言語では、物理的に型はコンパイル時にのみ存在します。これは特に古い言語に当てはまります。Cには、プログラムの実行中は、メモリまったく存在しないタイプがあると思います。

他の言語(特に実行時型情報アクセスを許可する言語(たとえば、RTTIを使用したC ++ 、C#、またはPythonなどの動的言語))では、型は単なるメタデータです。タイプのバイナリ記述。ご存知のとおり、データをバイナリストリームにシリアル化しようとすると、このようなものが得られます。

于 2010-08-10T13:49:21.130 に答える
2

私は正反対だと思います。これは、メモリ内のビットとバイトの言語表現です。

于 2010-08-10T13:48:46.030 に答える
2

タイプは、ビットとバイトに関するメタデータであり、意味のある安全な方法でそれらを操作する方法を定義します。

于 2010-08-10T13:57:21.640 に答える
1

タイプにはいくつかの意味があります。

私はインターフェース制約としての意味を好む傾向があります。(適切に記述されたオブジェクトコードは、すべてのメモリ内データをプライベートとして定義します)。

そしてそのような場合、タイプはメモリ内の表現とはまったく関係がありません。それどころか、それはそのメンバーメソッドに関する契約にすぎません。

于 2010-08-10T13:51:02.140 に答える
1

「タイプ」は、そのメンバー(「オブジェクト」)が離散有限表現と有用な共有属性のセットを持つセットです。

オブジェクトの実際のメモリ内表現は、必ずしも型の定義の一部ではありません。つまり、1つのオブジェクトが複数のメモリ内表現を持つ場合があります。重要なことは、オブジェクトが無限またはアナログではない可能性があるということです。

タイプの共有属性は何でもかまいません。オブジェクト指向システムでは、属性には(低レベルで)データと動作が含まれます。イベント通知も一般的です。一部の属性は、ルールが型内のすべてのオブジェクトで一貫している限り、型の定義に違反せずに条件付きである可能性があります(ブール属性Xがtrueの場合、属性Yも存在します)。

「サブタイプ」は、メンバーがより幅広い共有属性のセットを持つタイプのサブセットです。

このタイプの考え方は、質問で提起するものとは大きく異なり、この区別が重要だと思います。

タイプをメモリ内の表現と見なす場合、その表現はタイプの顕著な特徴と見なされ、当然のことと見なされます。相互運用性は、既存のバイトシーケンスの低レベルの変換と再解釈によって実現されます。これにより、表現が変更された場合に問題が発生する可能性があります。

ただし、型を属性の観点から見ると、ある型システムから別の型システムへの変換には、対応するオブジェクト間のデータフィールドの高レベルの変換が含まれます。オブジェクトに互換性があるかどうかの判断は、オブジェクトの顕著な属性に基づいて行われるため、問題が発生する可能性は低くなります。

相互運用の世界でさえ、タイプの内部の詳細に関する知識に頼るべきではありません。つまり、その型の定義の一部ではない型の実装の機能は、その型の一部であるかのように使用されるべきではありません。

于 2010-08-10T15:09:07.053 に答える
0

これは、使用しているプログラミングパラダイムによって異なります。OOタイプでは、実世界のオブジェクトを表すことができます。つまり、コンピューターが表すことができる実世界のオブジェクトのすべてのデータ(またはとにかく興味のある部分)を表すことができます。

于 2010-08-10T13:48:26.890 に答える
0

IIRCの強い型言語は、コンパイル時にオブジェクト型を強制します。たとえば、数値はint、floatなどの型である必要があります。弱い型の言語では、キリン=1+カエル*$100 /'5月1日'と言うことができ、型は実行時に解決されます。そして、通常、多くのランタイムエラーが発生します。

データ交換の状況(COM、CORBA、RPCなど)では、バイナリの互換性(ビッグエンディアン、リトルエンディアン)と形式(ある言語から別の言語に渡すときに文字列と日付をどのように表すか)のため、型を適用するのは非常に困難です。別のコンパイラで?)。したがって、各パラメーターのタイプを解決しようとするマーシャリング。ASN.1は、マシン間でデータを交換するときに「ユニバーサルタイプ」フレームワークを構築するための多くの試みの1つでした。

于 2010-08-10T13:53:07.123 に答える
0

タイプは、データをメモリ内でどのように表現および編成するかについての、人間が読める論理的な青写真です。これは、概念を標準的な方法でデジタルシーケンスに合理化する方法を人間が分離できるようにする方法です。マシンとコンパイラは、文字列、整数、fooClassの違いを実際には気にしません。これらの「タイプ」は、すべての人間のプログラマーが論理概念をメモリ内の合理的なデータ構造に変換するための組織単位で単純に合意されています。

于 2010-08-10T13:54:08.127 に答える
0

タイプはバンドルワードです。何かのタイプを知っていると、それが占めるメモリの量、その断片がどのように保存されているかがわかりますが、さらに重要なことは、それを使って何ができるかも知っていることです。たとえば、ポインタと同じ量のメモリを使用する整数型がいくつかあります。ただし、ある整数型を別の整数型で乗算することはできますが(たとえば、3 x 4)、2つのポインターを一緒に乗算することはできません。たとえば、x.Foo()を記述して、Fooメソッドを持つユーザー定義型(構造体またはクラス)でFoo()メソッドを呼び出すことはできますが、別のユーザー定義型に対しては呼び出すことができません。 Fooメソッドはありません。タイプのいくつかのペア間でキャストできますが、他のペア間ではキャストできません。または、AをBにキャストできますが、BをAにキャストすることはできません。一部の言語では、constであるかどうかなどの区別もあります。

コンパイラーとランタイムは大量の情報を持ち運び、そのすべてがアイテムのタイプになります。それが占めるバイト数(またはあなたが有形であるともっともらしく主張できる他のもの)の物理性は、実際には重要ではありません。

于 2010-08-10T13:54:53.157 に答える