Just a bit of statistic I calculated based on this hacking
cat test1.py | wc -l # The python testcase
24
../../pyjsold/lpython/bin/pyjscompile test1.py | wc -l # As is today
131
cat t.js | wc -l
39
I understand it may not extrapolate exactly for everything.
Just shows there is much that can be improved in that direction.
Sarvi
On Tuesday, October 22, 2013 8:29:27 PM UTC-7, Sarvi Shanmugham wrote:
>
> I tried to hack a bit to simplify the generated code to see how it can be
> done and this is what I got.
> I left the $ alone for the reasons Lex mentioned. Turned the dictionary
> accesses into object notation and
> reduced some of the repetitive code into functions that do the same code.
> From what I tested of inlining, JITs should take care of inlining these
> with no performance impact.
> and it was relatively simple, repetitive but sizable changes to the
> translate_proto.py code to do this.
>
> /* start module: test1 */
> $pyjs.loaded_modules.test1 = function (__mod_name__) {
> if ($pymdecorate(this,'test1',__mod_name__)) return $m
>
> $m.hello = function(i) {
> return multiply(multiply(multiply(i,i),2),25);
> };
> $pyfdecorate($m.hello,'hello',0,[null,null,['i']]);
>
> return this;
> }; /* end test1 */
>
>
> /* end module: test1 */
> The result would from what I can see would be much simpler, readable and a
> lot less code
> Would something like this be accepted if I work on finishing this?
>
> Sarvi
>
> On Monday, October 21, 2013 7:42:52 AM UTC-7, Lex Berezhny wrote:
>>
>> On Mon, Oct 21, 2013 at 1:40 AM, Sarvi Shanmugham <[email protected]>wrote:
>>
>>> I get this.
>>> But considering Javascript is JITed and highly optimized including
>>> unrolling static loops and function calls if I understand right,
>>> wouldn't the following
>>> i=p.op_mul(i,2)
>>> be faster than the current
>>> i = (typeof ($mul1=i)==typeof ($mul2=2) && typeof $mul1=='number'?
>>> $mul1*$mul2:
>>> $p['op_mul']($mul1,$mul2));
>>> as long as op_mul() can handle numbers as well?
>>> And much more readable too?
>>>
>>
>>
>> Unrolling requires work. If you have a lot of equations that means for
>> every operator you will need the JS engine to unroll. There is no way
>> "unrolling" something would be faster than var1*var2, especially not on the
>> first pass. Also, with unrolling a function there is some book keeping
>> required: what if $op.op_mul is changed to a different function at runtime
>> (not that it would be) but the JS engine has to take that possibility into
>> account.
>>
>> I'm not necessarily against what you are suggesting. I think in the grand
>> scheme of things readability is more important. If you truly need something
>> to be very performant than you can always just write that part in pure JS.
>>
>>
>>
>>> Yeah, thats sorta why I asked the question. Just a beginnner but this
>>> how I understood java script objects and classes
>>> and I thought this entire generated code segmented would have a been
>>> much more readable as objects instead of dictionary objects.
>>>
>>
>>
>> There may have been a reason for doing it that way but I do not know.
>>
>>
>>
>>> And whats with the $ notation. From what I am reading this is just
>>> jQuery convention and not required.
>>>
>>
>>
>> This has nothing to do with jQuery or conventions.
>>
>> $ allows you to have private implementation related variables. Since in
>> Python you cannot have variables that start with $ that means we can prefix
>> generated/implementation specific variables with a $ and never worry about
>> clashing.
>>
>> Think of stuff like:
>>
>> a, b = (b, a)
>>
>> Above is not possible in JavaScript without a temporary variable. In pyjs
>> this temporary variable would have a $ prefixed.
>>
>>
>> I presume we do pyjamas because we love python and hence readable code.
>>> Yet the generated Javascript seems less so, though from what I
>>> understand there more readable alternatives.
>>> So was just trying to understand what the thinking was.
>>>
>>
>>
>> I think a lot of attention wasn't paid to this because there are a lot of
>> other more important things missing from pyjs that need attention.
>>
>>
>>
>>> Sarvi:
>>> PS: Has this blog post been discussed on the list. Did any
>>> changes/action items come out of it?
>>>
>>
>>
>> I don't remember if we discussed it or not but I can give you my take on
>> a few of the bullet points:
>>
>> Browser Detection: He's right about the gwt/pyjamas stuff but this is
>> irrelevant to pyjs core. As far as I know only one version of the compiled
>> Python is generated. The Pyjamas/GWT library does have multiple versions
>> per browser. Given that we plan to rip that out of pyjs core into it's own
>> repository it will be for somebody else to deal with :-)
>>
>> Bloat and Boilerplate Hell: Without specifics this can't really be
>> addressed. But my preference would be to rewrite pyjs from scratch with an
>> eye on less boilerplate. I've started this to some degree and can send you
>> what I have so far if you're interested.
>>
>> Debugging: Theoretically if it works in Python it should work in compiled
>> JS too - if it doesn't, that's a bug in pyjs and not in your code. I've
>> actually had very few issues with this (as long as I stayed within the
>> limitation of pyjs). So I can't relate to Mr. Tsepkov on that point.
>>
>> Python is not Java, DOM is not a Desktop: We are taking the pyjamas/gwt
>> stuff out of pyjs repository. This will encourage people to write their own
>> frameworks/widget libraries for pyjs.
>>
>> JavaScript has its Strengths: Complaining mostly about the GWT stuff in
>> pyjs.
>>
>>
>> My impression from his article is that he relied too much on the widget
>> library/gwt framework that comes with pyjs.
>>
>> I think pyjs can hit the sweet spot if you're willing to experiment with
>> it and not relying too much on the gwt framework.
>>
>> You have access to the DOM and events in pyjs just as you do in
>> JavaScript. In the article he implied that this was not the case.
>>
>> - lex
>>
>
--
---
You received this message because you are subscribed to the Google Groups
"Pyjs.org Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.