2016-09-04 1 views
2

私はすべてがオブジェクトであることを知っており、ほとんどすべてを行うためにSmalltalkのオブジェクトにメッセージを送信します。 プリミティブデータ型を表すオブジェクト(メモリ表現と基本操作)をどのように実装できますか?たとえば、整数の場合、+はどのように実装されていますか?Smalltalk:プリミティブはどのように実装されていますか?

私はSmalltalkのソースコードを見て、Smallint.stでこれを見つけました。誰かがこのコードを説明できますか?ここで

+ arg [ 
    "Sum the receiver and arg and answer another Number" 

    <category: 'built ins'> 
    <primitive: VMpr_SmallInteger_plus> 
    ^self generality == arg generality 
     ifFalse: [self retrySumCoercing: arg] 
     ifTrue: [(LargeInteger fromInteger: self) + (LargeInteger fromInteger: arg)] 
    ] 

上記のコードのリンクです:https://github.com/gnu-smalltalk/smalltalk/blob/62dab58e5231909c7286f1e61e26c9f503b2b3df/kernel/SmallInt.st

+2

Smalltalkのプリミティブメソッドとプリミティブクラスは、言語の外側に実装する必要があります(または、おそらく_below_)。 ''を参照してください。それは手掛かりです。どのような実装であれ、* VMRP_SmallInteger_plusの* Smalltalk *でないコードを検索してください。 (あなたが閲覧しているコードへのリンクを提供すれば、それ以上に役立つかもしれません。) – zwol

+0

ここで「プリミティブ」とは何を意味していますか?それはキーワードですか? – mahdix

+2

@zwolによれば、ソースはgithub上にあるので、https:// githubで検索することができます。com/gnu-smalltalk/smalltalk/search?utf8 =%E2%9C%93&q = VMpr_SmallInteger_plus –

答えて

5

概念的にはプリミティブ方法を話して仮想マシン(VM)によってではなく、通常のSmalltalkのコードで実装行動の断片(ルーチン)です。

ステートメント<primitive: ...>が見つかると、これは特殊な型のメソッドとして解釈されます。その場合、引数(場合によってはVMpr_SmallInteger_plus)はVM内のターゲットルーチンの整数インデックスを示します。

この意味で、プリミティブは、特定のクラスのMethodDictionaryにバインドされていないグローバルルーチンです。プリミティブロジックは、レシーバと特定のクラスの引数を対象としているため、レシーバと引数(存在する場合)が要件を満たしていることを確認する必要があります。そうでない場合、プリミティブに失敗し、その場合、コントロールは<primitive: ...>ステートメントに続くSmalltalkコードに流れます。そうでなければ、プリミティブで成功し、以下のスモールトークコードは実行されません。また、コンパイラは、<primitive:...>文の上で発生する一時的な宣言以外のスモールトークコードを許可しないことにも注意してください。

例では、引数argが予想されるクラス(おそらくSmallInteger)でない場合、ルーチンはそれを受信者に集計しようとしないで、操作の解決をSmalltalkコードに委任します。

引数がSmallIntegerである場合、プリミティブは(VMに保持されているルーチンを使用して)結果を計算し、その結果で応答します。

このプリミティブのコードは見ていませんが、合計の結果がSmallIntegerに収まらない場合にプリミティブが失敗することもあります。その場合、受信者と引数の両方がLargeIntegerにキャストされます適切なクラス(LargePositiveIntegerまたはLargeNegativeInteger)の#+メソッドで追加が行われます。

スモールトークコードのもう1つの枝は、SmallIntegerと他のタイプのオブジェクトとの間のポリモーフィックな合計の実装を可能にします。たとえば、Smalltalkコードのこの部分は、3 + 4.0を評価すると発生します。この場合、引数はFloatです。 3 + (4/3)などを評価すると、似たようなことが起こります。

関連する問題