개념적으로 말하기 원시 방법은 가상 머신 (VM)에 의해 구현 행동의 조각 (루틴)이 아닌 일반 스몰 토크 코드가 있습니다 : 여기
+ 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)]
]
위 코드의 링크입니다.
<primitive: ...>
은 Smalltalk 컴파일러가 구문을 발견 할 때이 인수를 (사용자의 경우 VMpr_SmallInteger_plus
) 인수가 VM 내의 대상 루틴의 정수 인덱스를 나타내는 특수 유형의 메소드로 해석합니다.
이 의미에서 프리미티브는 특정 클래스의 MethodDictionary
에 바인딩되지 않은 전역 루틴입니다. 프리미티브 논리는 수신기와 특정 클래스의 인수를 대상으로하므로 수신자와 인수 (있는 경우)가 요구 사항을 준수하는지 확인해야합니다. 그렇지 않으면 프리미티브가에 실패하므로이 경우 컨트롤은 <primitive: ...>
문 다음에 오는 Smalltalk 코드로 이동합니다. 그렇지 않으면 프리미티브가으로 성공하고 아래의 스몰 토크 코드가 실행되지 않습니다. 컴파일러는 <primitive:...>
문장 위에 발생하는 임시 선언 이외의 스몰 토크 코드를 허용하지 않습니다.
예를 들어, 인수 arg
이 예상 클래스 (아마도 SmallInteger
)가 아닌 경우 루틴은 수신자에게이를 합산하려고 시도하는 것을 포기하고 작전 분해능을 스몰 토크 코드에 위임합니다.
인수가 SmallInteger
일 경우, 원시 (VM에있는 루틴을 사용하여) 결과를 계산하고 응답합니다.
이 프리미티브의 코드를 보지 못했지만 합계 결과가 SmallInteger
에 맞지 않으면 프리미티브가 실패 할 수 있습니다.이 경우 수신자와 인수가 모두 LargeInteger
으로 캐스팅됩니다. 적절한 클래스 (LargePositiveInteger
또는 LargeNegativeInteger
)의 #+
메소드에서 추가가 수행됩니다.
스몰 토크 코드의 다른 브랜치는 SmallInteger
과 다른 유형의 객체 사이의 다형성 합을 구현할 수있게합니다. 예를 들어 3 + 4.0
을 평가하면 스몰 토크 코드의이 부분이 발생합니다.이 경우 인수가 Float
이기 때문입니다. 3 + (4/3)
등을 평가하면 비슷한 결과가 발생합니다.
스몰 토크 기본 메서드 및 프리미티브 클래스는 언어 외부에서 구현되어야합니다 (또는 아마도 _below_). ''를 보시오. 그것은 단서입니다. 이것이 VMmark_SmallInteger_plus를위한 모든 구현의 * 스몰 토크 * 코드를 검색하십시오. (탐색하는 코드에 대한 링크를 제공하면 그보다 더 도움이 될 수 있습니다.) –
zwol
그러면 '원시적'은 무엇을 의미합니까? 그게 키워드 야? – mahdix
@zwol은 소스가 github에 있기 때문에 https : // github로 검색 할 수 있습니다.co.kr/gnu-smalltalk/smalltalk/search? utf8 = % E2 % 9C % 93 & q = VMpr_SmallInteger_plus –