>
스몰 토크에서, 모든 것은 수신자 객체에 메시지를 보내어 발생합니다. 문법은 보통수신기 메시지형식을 따릅니다. 수신자는 메시지가 전송되는 객체입니다. 이제 궁금한 것을 멈출 수 없습니다. 스몰 토크 메시지 발신자는 무엇입니까? 다음 스몰 토크 설명을 고려하십시오.

aMorph color: Color yellow

aMorph를 메시지 수신자로 볼 수 있지만 발신자는 어떻습니까? 표준 스몰 토크 메시지 구문에는 수신자와 메시지 (선택자 + 인수) 만 있으며 발신자가 무엇인지 어디에 있는지 식별 할 수 없습니다. 아니면 메시지가 실제로 자신을 보낼 수 있습니까?

메시지를 보낸 사람을 언급 한 pharo smalltalk의 리플렉션에 대한 기사를 탐색 한 것을 기억하지만이 '발신자'가 무엇인지 이해하거나 이해할 수 없습니다. 누구든지 이것에 대해 나에게 설명 할 수 있습니까? 감사.


  • 답변 # 1

    보낸 사람은 메시지가 전송 될 때마다 런타임에 결정되고 설정됩니다. 현재 실행중인 방법의 관점에서 '어떻게 왔습니까?'라는 질문에 대답합니다. 가장 일반적인 경우, 발신자는 현재 메소드를 호출 한 메시지를 보낸 메소드가 무엇이든됩니다. 예를 들어, aMorph color: Color yellowdoIt  작업 공간에서 발신자는정의되지 않은 개체 >>DoIt이됩니다.MyObject >>myTestSender에서 동일한 메시지를 보낸 경우 발신자는MyObject >>myTestSender가됩니다.

    이제 aMorph 를 포장했다고 가정 해 봅시다.  프록시 객체 myProxy 에서 , MyProxyObject의 인스턴스 및 doesNotUnderstand:  메소드는 수신 한 모든 것을 기본 aMorph 로 전달합니다.  목적. 이 경우, 당신이 그것을 할 때 myProxy color: Color yellow 발신자는MyProxyObject >>doesNotUnderstand :입니다. (당신의 doesNotUnderstand: 가 아니라면  메소드는 런타임을 추가로 조작합니다 ... 필요한 경우 수행 할 수 있습니다) 이것은 실제로 #color: 의 발신자를보아야 할 때 좋은 예입니다.  is : 호출 중이지만 프록시가 사용자에게 명확하지 않은 간접 수준을 추가하기 때문에 어디에서 이해하지 못합니다.

    발송인이 누구인지 확인하기 위해 color: 에 다음을 추가 할 수 있습니다.  방법 :

    Transcript show: thisContext sender asString.
    
    

    코드 관점에서, 발신자를 다루는 것은 암시적이고정상코드 실행 중에 스몰 토크 런타임에 의해 처리됩니다. 일부 코드의 문제를 해결하거나 런타임시 내용을 조사하거나 변경해야하는 경우가 아니라면 발신자를 보지 않는 경우가 많습니다.

    이제 '도대체 무엇입니까? ? ' 콜 스택의 상단을 나타내는 특수 변수이며 많은 사람들이 처음에 머리를 감쌀 때 어려움을 겪고 있습니다. 자세한 정보는 스몰 토크가 콜 스택 프레임을 조작하는 방법을 참조하십시오.

    부록 (Leandro의 답변과 나의 의견이 혼동 될 것입니다)

    Leandro의 답변은발신자를 일반적인 용어로보고 있으며 더 큰 역사적 맥락을 고려하는 반면, 내 것은보다 현대적인 스 que 크/파로 중심적이며 매우 구체적인 의미를 가지고 있습니다. Leandro의 의견에 따르면보낸 사람이라는 용어는 모호하며 구현 전반에 걸쳐 표준화되어 있지 않습니다 (우리의 다른 답변에서 입증 된 바와 같이).보낸 사람보내는 컨텍스트에 대해 이야기하고 있습니다 ... thisContext 도 아닙니다.  또는 self . 그러나 질문에 대한 의견에서 언급 된 링크는 그 의미로 명시 적이었습니다 (예 : thisContext sender )는 Squeak/Pharo 코드를 참조 할 때 일반적으로 의미합니다. 따라서 어떤 대답이 옳은지는 특정 스몰 토크 구현을보고 있는지 (이 경우 올바른 사용법이 사용중인 구현이 결정한 것임) 또는 특정 스몰 토크 구현에 대해 이야기 할 때의보다 일반적인 용어에 따라 다릅니다 ( 이 경우 Leandro가 정확합니다. 사용량이 거의 의미가없는 것으로 해석되어 해석 될 수 있습니다.)

  • 답변 # 2

    발송인이 thisContext sender 인 것으로 생각할 수 있습니다 . 즉, 메소드가 활성화 된 경우 (즉, 실행 중) self 로 표시되는 객체  메소드 본문에 전송 된 모든 메시지의 발신자로 해석 될 수 있습니다.

    예를 들어 self 메소드를 고려하십시오. #paint: 에 정의 됨  으로

    OurClass
    
    
    이 방법이 실행 되 자마자 paint: aMorph aMorph color: Color yellow 의 (sub) 인스턴스   OurClass 를 받고  메시지, paint: 가 될 것입니다 . 음, 방법이 작동하는 동안, self   self 를 보낸 사람의 역할을 기인 할 수있다   color: 로 .

    이 해석의 문제입니다 그러나

    참고. 예를 들어, 실행중인 프로세스를 고려하고 발신자를 aMorph 를 활성화 한 프로세스 프레임으로 식별 할 수도 있습니다. .

    두 해석이 모두 유효하지만 실제로는 스몰 토크에서 메시지를 보내는 행위가 가상의 이미지가 아닌 가상 머신에서 구현되기 때문에 발신자의 개념이 무의미합니다.

    물론, 의사 소통을 위해 그 역할을 누군가에게 할당하고 발신자에 대해 이야기하는 것도 유용합니다. 그러나 암시 된 대상은 상황에 따라 다릅니다. 디버깅 할 때 예를 들어, 당신은 프레임 호출과 함께 보낸 사람을 식별하는 것입니다. 그러나 메시지 전송은 "마 법적으로"이루어 지므로 발신자의 역할을 어떤 객체에도 첨부 할 필요가 없습니다.

    VM이 없기 때문에 런타임 내부에 도달 할 수있는 Bee Smalltalk에서도 발신자 개념은 까다 롭고 불필요합니다. 기술적으로 말하면, 꿀벌의 모든 전송은 #color: 있다  메시지를 보내는 데 필요한 모든 단계를 수행하는 개체 (PIC, 조회 등) 이러한 개체를 검사하고 메시지를 보낼 수 있으므로 Bee에서 보낸 사람은 SendSite 라고 추측 할 수 있습니다. . 그러나 이것은 다시 해석의 대상이됩니다. 실제로 SendSite 는 없습니다  Wyzwyz의 ivar  스몰 토크 시맨틱에는 그런 것이 필요하지 않기 때문입니다.

    부록 내가 말

    sender 의 개념  내가 의미하는 바는 해석 메커니즘의 구현에 이러한 개념이 사용되지 않는다는 의미입니다. 보다 정확하게는, 전송을 수행하는 (기본) 코드는 메소드 조회를 수행하는 캐시 된 루틴으로 구성되며, 이는 SendSite 만 고려합니다. Wyzwyz  그리고 sender , '발신자'를 무시합니다.

    메시지 전송이 "호출자"로부터받는 "데이터"의 주요 부분은 인수입니다. 그리고이 모든 머신 코드 구현에 대해 더 깊이 파고 들면, 다른 하나는 프레임을 연결하는 데 사용되는 리턴 주소라고 주장 할 수 있습니다. 이것이 바로 호출자 프로세스 프레임과 관련하여 "송신자"라는 개념을 언급 한 이유인데, 이는 디버거 구현에서 그 의미를 향상시키는 데 의미가 있습니다.

    내 요점은 스몰 토크에는 receiver 에 대한 명확한 정의가 없다는 것입니다그래서 behavior 와 같은 관련 개념과 비교할 때 식별하기가 너무 어렵습니다. selector sender receiver  그리고 selector .

    의사 변수 arguments 를 사용할 수 있다는 것은 사실입니다   behavior 를 얻기 위해  현재 활성화의. 이렇게하면 method send 를 가장 한 개체를 얻게됩니다.   thisContext 의 다른 해석 인 호출 프레임에서 . 그리고 그 객체를 참조함으로써 더 많은 기능을 제공하기 위해 그것을 사용할 수 있습니다.  Wyzwyz에서 결석을 유지합니다  개체와 메시지가 기계를 전송합니다.

  • 답변 # 3

    Smalltalk의 작동 방식에 관심이 있다면 @blihp와 @ leandro-caniglia의 답변을보십시오. 또한 Pharo에 대한 자세한 정보 (14.5 컨텍스트 : 메소드 실행을 나타내는)에는 sender 에 대한 정보가 있습니다.  ( self 라는 이름)  Pharo 3까지).

    적어도 Pharo에서는 유사 변수 sender 로 실험하고 싶다면  현재 실행 지점에 액세스합니다. 당신은 넣을 수 있습니다 :

    sender
    
    
    특정 실행 지점에 대해 얻을 수있는 정보를 확인하려면 메소드에서

    이 정보에는 발신자가 포함됩니다.

    그러나 정기적으로 메소드의 메시지 발신자에게 액세스해야하는지 궁금하다면 대답은아니요입니다. 규칙적인 방법으로 메시지를 보내는 객체를 알아야하는 경우 보낸 사람 ( Message )을 전달하십시오. )를 추가 매개 변수로 사용합니다.

  • 답변 # 4

    aMorph를 메시지 수신자로 식별했습니다. 자, aMorph는 무엇을합니까? 다양한 것들에 메시지를 보냅니다. aMorph가 수신 한 메시지에 응답 할 때, 발신자입니다. 수신자 였고 발신자가되었습니다. aMorph가 완료되면 발신자가 중지되고 작업중인 메시지를 보낸 사람에게 응답합니다.

    물론 aMorph가 메시지를 보낼 때마다 수신자는 답을 구하는 동안 발신자가됩니다.

    등등.

    Context

  • 이전 javascript - 몽구스 중첩 스키마
  • 다음 Angular 6 프로젝트에 JS 파일 포함