2016-09-04 3 views
2

나는 모든 것이 객체라는 것을 알고 거의 모든 것을 할 스몰 토크의 객체에 메시지를 보낸다. 이제 원시 데이터 형식을 나타내는 객체 (메모리 표현 및 기본 연산)를 구현할 수 있습니까? 예를 들어 정수에 대해 +이 어떻게 구현됩니까?스몰 토크 : 어떻게 프리미티브가 구현됩니까?

나는 스몰 토크의 소스 코드를보고 Smallint.st에서 이것을 발견했다. 누군가이 코드를 설명 할 수 있습니까? https://github.com/gnu-smalltalk/smalltalk/blob/62dab58e5231909c7286f1e61e26c9f503b2b3df/kernel/SmallInt.st

+2

스몰 토크 기본 메서드 및 프리미티브 클래스는 언어 외부에서 구현되어야합니다 (또는 아마도 _below_). ''를 보시오. 그것은 단서입니다. 이것이 VMmark_SmallInteger_plus를위한 모든 구현의 * 스몰 토크 * 코드를 검색하십시오. (탐색하는 코드에 대한 링크를 제공하면 그보다 더 도움이 될 수 있습니다.) – zwol

+0

그러면 '원시적'은 무엇을 의미합니까? 그게 키워드 야? – mahdix

+2

@zwol은 소스가 github에 있기 때문에 https : // github로 검색 할 수 있습니다.co.kr/gnu-smalltalk/smalltalk/search? utf8 = % E2 % 9C % 93 & q = VMpr_SmallInteger_plus –

답변

5

개념적으로 말하기 원시 방법은 가상 머신 (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) 등을 평가하면 비슷한 결과가 발생합니다.