스몰토크의 메세지에 대해 생각을 좀 정리해봤는데..

73 views
Skip to first unread message

peter yoo

unread,
Mar 5, 2013, 8:05:24 AM3/5/13
to smallt...@googlegroups.com
http://ta.onionmixer.net/wordpress/?p=172

혹시 잘못 이해하고 있는 부분이 있다면 지적 부탁드립니다.

대략 개념상으로만 알고있던게
뭔가 내부에서는 이렇게 도는구나..라는 느낌으로 오는게
이거 참 재밌네요 ㅋㅋㅋ

--
http://onionmixer.net | http://gentoo.or.kr | http://gnome.or.kr
peter yoo. ROK

Jooyung Han

unread,
Mar 5, 2013, 4:57:41 PM3/5/13
to smallt...@googlegroups.com

"컴파일 중에는 메시지의 수신자를 따지지 않는다" 라고 하면 좀더 이해하기 수월할 것 같아요. 그리고 이 특징은 동적 타입 언어들에 공통된 것이고요.


이것이 설계적으로 조금 더 유연하면서 동시에 런타임에서 불안한 측면이 있지 않을까요? 그래서 단위테스트나 TDD같은 활동이 동적 언어에서 더 발전했다고 보는 견해도 있더군요. (더 쉬워서, 더 필요해서)

좀 찾아보니 수신자가 메시지를 처리할 수 없을 때의 처리도 제각각이네요. 스몰토크는 doesNotUnderstand(직계 후손이라 할 수 있는 루비는 method_missing)이 호출되며 기본 동작은 예외를 일으킵니다. 흉내쟁이 Objective-C는 아무 동작도 안하네요.

참고로 파싱된 MessageNode 는 receiver, selector, arguments 정보를 담고 있습니다.

Sent from Mailbox for iPhone


--
Google 그룹스 '한국 스몰토크 사용자 모임 (Korean Smalltalk User Group)' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 smalltalk-kr...@googlegroups.com에 이메일을 보내세요.
이 그룹에 게시하려면 smallt...@googlegroups.com(으)로 이메일을 보내세요.
http://groups.google.com/group/smalltalk-kr?hl=ko에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하세요.
 
 

peter yoo

unread,
Mar 5, 2013, 8:05:35 PM3/5/13
to smallt...@googlegroups.com
사실.. 동작에 대한 정의만 확실하다면 런타임에서 불안요소는 없을거같은데요...
뭐 넘어온 메세지의 파싱이 문제기는 하겠습니다만...

Objetive-C에서 아무일도 안일어나는게 사실 저는 더 마음에 드는거같습니다.
쿨하지 않나요? ㅋㅋㅋ


그리고 혹시.. 실례가 안된다면
말씀하신 정보는 혹시 제 워드프레스의 글에 추가적으로 넣어도 괜찮을까요?
물론 출처는 명기하고 말입니다.

ps. 흠.. SBE를 보면서도 좀 의아하기는 합니다만.. compile time이라는게 잘 이해가 안가더군요. 사실 interpriting time이라는게 맞는 의미 아닌가요? 아니면 compime time이라고 부르는 이유가 있는건지 좀 궁금합니다..@.@;

Jooyung Han

unread,
Mar 5, 2013, 10:44:19 PM3/5/13
to smallt...@googlegroups.com

네. 괜찮습니다. 


스몰토크는 메소드 단위로 컴파일됩니다. 웍스페이스에서 선택하여 DoIt 해도 해당 텍스트를 마치 메소드인냥 컴파일한다음 실행합니다. 실행하는 메소드는 ProtoObject>>withArg:excute: 인가 그렇고 두번째 인자가 컴파일된 메소드입니다. 컴파일 결과는 스택기반 가상기계용 바이트코드구요. 


Sent from Mailbox for iPhone


--

peter yoo

unread,
Mar 5, 2013, 11:23:13 PM3/5/13
to smallt...@googlegroups.com

​아........
어제 SBE내용 정리하면서 ProtoObject에 대한 언급을 봤습니다.
대부분의 객체는 Object를 상속받지만 사실 객체의 원형은 ProtoObject이고
그 안에는 객체에 꼭 필요한게 몇가지 있다고 하더니.....
어헐헐헐.

그럼 좀 구체적으로 질문을 드려도 될까요?

Transcript show: 'a'가 compile된다면

ProtoObject withArg:'Transcript show: 'a''
이런식으로 된다는 의미인건가요?
compile이 끝나면 vm위의 메모리에 바이트코드 형태로 존재하게 될거라는건
예상이 되는데....
실제로 어떻게 동작되는지 조금 궁금합니다.

번거롭게 해드려서 죄송합니다...T.T

SeungBum Kim

unread,
Mar 5, 2013, 11:50:10 PM3/5/13
to smallt...@googlegroups.com
Transcript show: 가 어떤식의 VM 머신코드로 컴파일 되는지는 다음처럼 해보면 알 수 있습니다.

"Transcript 가 ThreadSafeTranscript의 인스턴스이므로.."

(ThreadSafeTranscript >> #show:) symbolic. 
"print it 해보세요."

관련해서 더 자세한 내용은 다음 페이지를 참고해보면 도움이 되겠네요.




2013/3/6 peter yoo <onion...@gmail.com>

--
Google 그룹스 '한국 스몰토크 사용자 모임 (Korean Smalltalk User Group)' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 smalltalk-kr...@googlegroups.com에 이메일을 보내세요.
이 그룹에 게시하려면 smallt...@googlegroups.com(으)로 이메일을 보내세요.
http://groups.google.com/group/smalltalk-kr?hl=ko에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하세요.
 
 



--
김 승 범 (SeungBum Kim)
New Media Literacy Education
+ 82 - 10 - 2686 - 6855 | Twitter: @picxenk
http://xenbio.net | http://smalltalk.kr

SeungBum Kim

unread,
Mar 6, 2013, 12:05:19 AM3/6/13
to smallt...@googlegroups.com
양파님 블로그에 적으신 내용과 관련해서는,

스몰토크라는 시스템이 '메시지 전달'이라는 간단한 기본 원칙을 지켜가면서 설계되었기 때문이라 보시면 됩니다. 그리고 메시지 전달과 관련해서는 late-binding이 이뤄지는 것인데요, 이와 관련해서 The Early History of Smalltalk에는 다음과 같은 구절이 있습니다.

OOP is a late binding strategy for many things and all of them together hold off fragility and size explosion much longer than the older methodologies.

OOP라는 개념이 정립이 되고 시스템이 설계된 것이 아니라, 그 시대 수 많은 영감을 줬던 아이디어들을 배경으로 몇 가지 기본 원칙을 지켜가면서 시스템을 디자인한 결과 그 진화의 과정에서 OOP가 탄생이 되었고요, late-binding이 그 중에 중요한 전략 중 하나란 것이죠.

다음 글도 읽어보면 양파님이 매우 재밌어 하실거 같네요. :)


'Inventing on Principle' 동영상으로 수 많은 파문(?)을 일으킨 Bret Victor가 최근에 VPRI와 협업을 해서였는지는 모르지만, 자신의 홈페이지에 문서를 읽기 좋게 다시 깔끔하게 정리해서 올려두었습니다.





2013/3/6 SeungBum Kim <pic...@gmail.com>

peter yoo

unread,
Mar 6, 2013, 12:49:41 AM3/6/13
to smallt...@googlegroups.com

​Smalltalk 이전의 역사.... 라는 부분은 꽤나 재미있을거같네요.
하고있는 일들이 끝나면 이후에 분명 번역으로 진행해놓을 가치가 있을거같습니다.
Smalltalk과는 상관없이 그 자체로 흥미가 생기네요 ㅎㅎㅎ

저놈의 스케치패드는 게임쪽 역사에도 나오는거같던데...
참 많이 등장하는거같습니다. ㅎㅎㅎ

그나저나 주영님과 승범님의 답변덕분에
제 머리는 한층 더 복잡해지겠군요 ㅋㅋㅋ

Jooyung Han

unread,
Mar 6, 2013, 1:13:24 AM3/6/13
to smallt...@googlegroups.com
Transcript show: 'a'를 선택해서 Debug it 해보시면
SmalltalkEditor 클래스의 다음 메소드에서 멈춰있습니다.

debug: aCompiledMethod receiver: anObject in: evalContext

여기, aCompiledMethod 가 UndefinedObject>>#DoIt 메소드이며
실제로는 CompiledMethod 인스턴스(CompiledMethod는 ByteArray를 상속)입니다.
아마 임시로 생성된 메소드라고 보시면 될것 같아요.
receiver(anObject)는 nil 입니다.

DoIt 메소드의 몸체가 바로 "Transcript show: 'a'"입니다.
DoIt 이라는 CompiledMethod는 다음과 같이 바이트코드를 가지고 있습니다.

25 <41> pushLit: Transcript
26 <22> pushConstant: 'a'
27 <E0> send: show:
28 <7C> returnTop

메모리 상에 35바이트를 차지하네요.

debug:receiver:in: 에서 다음과 같이 호출합니다.

   aCompiledMethod
                       valueWithReceiver: anObject
                       arguments: (evalContext ifNil: [ #() ] ifNotNil: [ { evalContext } ])

valueWithReceiver: aReceiver arguments: anArray
  ^ aReceiver withArgs: anArray executeMethod: self

aReceiver는 nil이지만 withArgs:executeMethod:를 호출하는데에는 아무 문제가 없죠 ^^

#Transcript 심볼을 푸시
'a' 상수를 푸시
#show: 심볼을 'send'
그리고 리턴이네요..

'send'를 처리하고나면 결과값이 stack top에 저장되어 있을 거고요.



2013/3/6 peter yoo <onion...@gmail.com>

--
Google 그룹스 '한국 스몰토크 사용자 모임 (Korean Smalltalk User Group)' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 smalltalk-kr...@googlegroups.com에 이메일을 보내세요.
이 그룹에 게시하려면 smallt...@googlegroups.com(으)로 이메일을 보내세요.
http://groups.google.com/group/smalltalk-kr?hl=ko에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하세요.
 
 



--
Jooyung Han

peter yoo

unread,
Mar 6, 2013, 1:18:22 AM3/6/13
to smallt...@googlegroups.com
후아.. 그럼 저 바이트코드가 실제 squeakVM(실행 바이너리 이름은 cogvm이기는 하던더) 위에서 동작하는 코드가 되는건가요?

그럼... 혹시요... cogvm.exe bytecode_filename 으로 만들어진 bytecode의 테스트를 할 수 있는 방법도 있는건가요?
아니면 현재 사용하는 squeak의 image자체가 저런 bytecode의 집합이 되는건가요?

웬지.... 그동안 막혔던 머리가 뻥! 하고 뚫리는 느낌입니다.
이후 답변과 상관없이 도와주신 분들께 감사드립니다..(꾸벅)

Jooyung Han

unread,
Mar 6, 2013, 1:37:53 AM3/6/13
to smallt...@googlegroups.com
저도 Pharo 1.4 깔아서 열심히 브라우징한 결과라 VM아래로까지는 잘 몰겠네요.
기회가 된다면 vm.exe image의 시작 시퀀스를 따라가봐도 좋겠네요.



2013/3/6 peter yoo <onion...@gmail.com>

--
Google 그룹스 '한국 스몰토크 사용자 모임 (Korean Smalltalk User Group)' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 smalltalk-kr...@googlegroups.com에 이메일을 보내세요.
이 그룹에 게시하려면 smallt...@googlegroups.com(으)로 이메일을 보내세요.
http://groups.google.com/group/smalltalk-kr?hl=ko에서 그룹을 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/groups/opt_out을(를) 방문하세요.
 
 



--
Jooyung Han

peter yoo

unread,
Mar 6, 2013, 2:21:50 AM3/6/13
to smallt...@googlegroups.com

​후와.. 알겠습니다.....
공부할게 참.... 많네요 ㅋㅋㅋ

잘 알려주셔서.. 감사합니다...(꾸벅)
Reply all
Reply to author
Forward
0 new messages