Ok, scheduling in Pharo may happen when sending a message. 

Thanks for the clarification.

Cheers,
Alexandre


On 12 Oct 2011, at 13:40, Stéphane Ducasse wrote:

> Alex 
> 
> the vm should check condition from time to time and the place where it can 
> check is at every message send. 
> Since == is not a message send, when you write code with == or not even if it 
> is semantically equivalent 
> its execution may be different (it looks hackish).
> 
> Stef
> 
> On Oct 12, 2011, at 6:29 PM, Alexandre Bergel wrote:
> 
>> Excellent description. 
>> Just wondering: when the scheduling really happens? I thought that it is 
>> when you do a #yield or wait explicitely since scheduling is not preemptive. 
>> 
>> Cheers,
>> Alexandre
>> 
>> 
>> On 12 Oct 2011, at 12:49, Mariano Martinez Peck 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
>>> 
>> 
>> -- 
>> _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
>> Alexandre Bergel  http://www.bergel.eu
>> ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
>> 
>> 
>> 
>> 
>> 
>> 
> 
> 

-- 
_,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
Alexandre Bergel  http://www.bergel.eu
^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.






Reply via email to