On Wed, Oct 12, 2011 at 6:00 PM, Clara Allende <[email protected]>wrote:

> Ok, now I get it :D Thanks a lot Mariano!
>
>
No problem :)


>
> On 12 October 2011 12:49, Mariano Martinez Peck <[email protected]>wrote:
>
>>
>>
>> On Wed, Oct 12, 2011 at 5:38 PM, Levente Uzonyi <[email protected]> wrote:
>>
>>> On Wed, 12 Oct 2011, Clara Allende wrote:
>>>
>>>  Hi guys,
>>>>
>>>> I'm wondering, why?
>>>>
>>>> ProtoObject>> ~~ anObject
>>>>   "Answer whether the receiver and the argument are not the same object
>>>>   (do not have the same object pointer)."
>>>>
>>>>   self == anObject
>>>>       ifTrue: [^ false]
>>>>       ifFalse: [^ true]
>>>>
>>>>
>> Hi Carla. I can think about two things. The first one, is the one Levente
>> said, performance.
>> If you analyze the bycode of this method, you will see that it is
>> extremely fast because:
>>
>> 1) #== has an special associated bytecode, that is, them VM maps such
>> bytecode to an specific primitive and it is directly executed. It means that
>> the method #== is really never sent.
>> 2) ifTrue:ifFalse: is also optimized (inlined) by the compiler. Again, it
>> method is never executed and instead the compiler replace a message send
>> bytecode with jump ones.
>>
>> Another possible reason (it may not be the case, but in another places it
>> is), is to prevent VM interruption for check other processes. In summary,
>> the VM checks whether it should execute another process of the queue after a
>> method execution. As you know, some parts of the scheduling process is done
>> at the image side. And from there we lack a way to say to the VM, "please
>> execute this method without checking others processes". Hence, in a few yet
>> very specific places of PRocess, Scheduler, Semaphore, etc, #== is used as a
>> mean of executing something WITHOUT being interrupted. I can imagine that it
>> may happen the same with #~~. So if you implement such method with a #not,
>> you will indeed send a message, proving a possibilty to be interrupted.
>>
>> Another reasons, similar to the previous one, is that sometimes #== is
>> also used as a way to avoid executing method. So..there are some methods (I
>> don't remember if #allInstancesDo: or #allObjectsDo:) will loop forever
>> because the loop condition would be creating objects (remember that method
>> execution creates objects such as MethodContext).
>> So...again, I think it may happen the same with #~~.
>>
>> That being said, I agree that the method deserve a GOOD comment explaining
>> the reasons of such optimization.
>>
>> Cheers
>>
>>
>>
>>>  Instead of:
>>>> ProtoObject>> ~~ anObject
>>>>   "Answer whether the receiver and the argument are not the same object
>>>>   (do not have the same object pointer)."
>>>>
>>>>   ^(self == anObject) not
>>>>
>>>> And why?
>>>> Object >> ~= anObject
>>>>   "Answer whether the receiver and the argument do not represent the
>>>>   same object."
>>>>
>>>>   ^self = anObject == false
>>>>
>>>> Instead of
>>>> Object>> ~= anObject
>>>>   "Answer whether the receiver and the argument do not represent the
>>>>   same object."
>>>>
>>>>   ^(self = anObject) not.
>>>>
>>>> Is there any particular reason for this that I'm missing?
>>>>
>>>
>>> Performance.
>>>
>>>
>>> Levente
>>>
>>>  Thanks in advance!
>>>> --
>>>>
>>>> "*Most good programmers do programming not because they expect to get
>>>> paid
>>>> or get adulation by the public, but because it is fun to program.*"
>>>>
>>>> Linus Torvalds
>>>>
>>>>
>>>
>>
>>
>> --
>> Mariano
>> http://marianopeck.wordpress.com
>>
>>
>
>
> --
>
> "*Most good programmers do programming not because they expect to get paid
> or get adulation by the public, but because it is fun to program.*"
>
> Linus Torvalds
>
>
>


-- 
Mariano
http://marianopeck.wordpress.com

Reply via email to