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 ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.
