flex-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Left Right <olegsivo...@gmail.com>
Subject Re: Adobe / Apache / Spoon Flex Tour
Date Sun, 19 Feb 2012 12:03:20 GMT
At the time I did some poking around MXML parser and code generation, I
can't claim myself to be an expert on the issue, but I know some. So,
here's my view of the situation: you say it works in Intellij, I say it's
pretty much broken. Here's why: possibly, you only used the features you
encountered in manuals Adobe put online, and you used them the way Adobe
wrote them. I, on the contrary, was looking to reduce the code generation
bloat, and was looking to do it the way the compiler can still handle, but,
it might look less common. For example, you would do:

<mx:Script><![CDATA[ private function clickHandler():void { trace("hi!"); }
<mx:Button click="clickHandler()"/>

I would do:


There are many other examples, I don't want to bloat this thread.

Particular plaque in Intellij is debugging MXML - the debugger is not smart
enough to understand what generated AS file is derived from what MXML, so
no breakpoints for you in MXML files most of the time.

Intellij AS3 parser only understands about 90% of AS3, thus, for example {
(true.valueOf()) : false } would be highlighted as an error, yet it's a
valid AS3. It's MXML parser was based on some hardcoded tables, thus, the
projects I worked on were usually painted in all red (the color to
highlight a syntax error :)).

Re' MXML - it ultimately cannot handle constants - stupid design, sorry. It
generates bindings for constants as if they were variables. The major fault
in the design is that the authors decided to remove quotes from around
string values in attributes. I'll explain.

If it was <foo stringProperty="'stringValue'"/>, then you could've made
constant expression simply by copying whatever's in between the first and
the last quote, but if you do <foo stringProperty="stringValue"/> - there's
no way to tell, whether stringValue is a reference to some definition by
the name stringValue or is it a literal string spelled "stringValue". This
design flow resulted in tons of ad hoc code in MXMLC to resolve this
ambiguity. It actually never cared to be systematic, thus, for example, in
certain cases function references may not need binding braces, but in other
situations they do and so on. It's pretty random and unsystematic.
There are other rules enforced by MXML, that lack any kind of common sense
- it must use some namespace from a variety defined in... bah, compiler
source code! how's that? :) You cannot access a property of a read-only
property - why? - no reason, just so you'd ask. You cannot pass arguments
to constructor - for the very same particular reason. You cannot define
access modifier, again, why - you know that already, right? I could
continue, but I'll keep some for the future :P

* * *

Languages: I thought I argued my case, but I'll try to explain again, the
plugins and the "mothership" compiler need not to run inside the same
runtime - there is a traditional way to make programs cooperate - pipes,
stream, well, you know. This is called modular architecture, or, if you
like that Unix-like approach. Even if Java is widely used, this doesn't
mean it's widely liked. WinAPI are a chore, but you cannot avoid it,
because, in the end of the day, most software in the world runs on top of
this crap. What I'm saying is that, for once, you are given a chance to do
things properly! :) Learning new languages? - pew! if it's a good language,
then why not? Besides, I think I said that people who would get seriously
involved with the compiler aren't your average $10/hour freelancers, they
might actually know some stuff about language design, and, almost
certainly, Java won't be the language of choice for them :) Besides, those
languages are cool, no, seriously, if you indeed like programming, you
enjoy writing and perfecting the code written in them, unlike this kind
of... masterpiece http://govnokod.ru/8865 (the piece of the code in the
quote remained like that since before Adobe took over Macromedia, it's the
remains of the rewrite of Macromedia old compiler, probably written in C++).
But not only they are cool - they are in many respects a better tool for
the job, they can do certain things pertaining to specific to compiler
tasks way better then Java will ever possibly do. One more important thing
- there are academic works and researches standing behind them, which are
the bread and the air for someone who lives and breathes language design,
compilers, computation etc. If you hope to invent, to advance, this would
be the way to go.

* * *

Re' ANTLR - well, as I said, it's a tool for generating parsers for certain
types of grammars, namely LR(1), or, to rephrase it, for LR(k) grammars,
which can be made into LR(1) - this implies AS3 must be an LR(k) grammar.
This, in other words, means that AS3 must be a deterministic, context-free
language, yet it seems to me that it is not. For example, depending on the
context square brackets may be interpreted as metadata or array (there are
places, where compiler actually makes an arbitrary decision as of today),
semicolon... I hate to say that, but it would be so much easier, if it was
mandatory... it was soooooo stupid to make it optional... anyways.
So, what I'm saying is - it is highly possible that ANTLR, or any other LR
parser generator simply won't do the job because such job cannot be done by
this kind of programs. There may not be an alternative, but to handcode the
parser, or give up on certain language features to fit it into LR(1)

* * *

One more thing I forgot to mention before, with regard to MXMLC, the whole
block dedicated to backing up the framework code, all the junk files like
FlexInit, SystemManager, _global and so on - this should be clearly kept
away from the compiler. It's insane it was made this way to begin with :)
At the time, I was thinking of a separate module to compiler, responsible
for AS3 source generation based on plain text templates. What I actually
ended up doing - using PHP as source code generator, however, having a
compiler module that could not only generate source by string replace, but,
actually analyze the code would be certainly better. Still, I'd rather it
be based on plain text templates then hardcoded into compiler itself. This
holds true for resource bundles generation, all kinds of -services configs

Mansour Blanco, you actually don't need XSLT, MXML is built on top of
Velocity, a monstrous beast that can do all kinds of tricks, handling loops
being not even a particularly remarkable one of them ;)



  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message