On Thu, Dec 6, 2012 at 9:27 PM, Erik de Bruin <e...@ixsoftware.nl> wrote:

> No framework classes are cross compiled. Only project AS files are run
> through FalconJS before they are combined with the JS framework through the
> Closure Builder.
>

In Jangaroo, we even wrote most of the runtime classes in ActionScript and
cross-compiled them. Only very basic bootstrap code is written in "native"
JavaScript (on the history of this approach, see below).


> The AS framework is there to allow for project development in Flash
> Builder. Our job as developers is to provide both sides of the fence (AS
> and JS framework) with matching functionality so the compiled project JS
> files will behave the same in a browser as their AS  equivalent does in the
> Flash Player.
>

Exactly. And it seems the Jangaroo Runtime already got quite close to that
goal. See the examples on our home page ("Applications"), which were all
realized using the original ActionScript code.
Some proposed solutions here remind me of our first approach when we
started with Jangaroo (or more precisely its predecessor "JSC" back in
2004). We tried to let the compiler generate all needed code and only put
some global helper functions in a JS file.
When simulating more and more ActionScript language features, this approach
resulted in quite unreadable, repetitive and inefficient code being
generated. So our second iteration was to let the compiler generate
JavaScript code that can be seen as a domain specific language (DSL) to
declare ActionScript classes, which is then "interpreted" by a JavaScript
"Runtime". Later, we even ported this Runtime to ActionScript, with only a
very basic DSL-interpreter remaining in JavaScript for bootstrapping the
fully-featured version. For Jangaroo Runtime source code, see below this
github 
directory<https://github.com/CoreMedia/jangaroo-tools/tree/master/jangaroo/jangaroo-runtime/src/main>
.

You may think now that this approach is inefficient ("interpreted? Oh no!")
or overly complex.

Regarding efficiency: Only the class structure is "interpreted" at runtime,
the JavaScript code that runs after the initial "preparation"
(joo.classLoader.prepare(...)) of a class contains almost no overhead and
thus is very efficient. Regarding minifying the code: Currently, GCC can
only be used with SIMPLE_OPTIMIZATIONS with Jangaroo-generated code, since
the needed annotations are missing for ADVANCED_OPTIMIZATIONS, but it
should be possible to add them to the current code layout.

Regarding complexity: Yes, you can use a very straight-forward approach,
but you'll run into trouble when trying to implement some of the more
advanced ActionScript language features, which *are* complex, and which are
all supported by Jangaroo:
* executing static code of classes at the right time (lazy class
initialization)
* private members
* efficient super calls
* properties with get/set functions that also work in older browsers (save
IE)
* method binding (correct "this")
* "is" and "as" (interfaces at runtime)
* annotations
* reflection

For more details, I'd again like to point you at my blog about ActionScript
language features simulated in
JavaScript<http://blog.jangaroo.net/search/label/ActionScript> (layout
glitch in blog style when showing posts for a certain tag, please scroll
down!).

I think there is only one aspect implemented in the Jangaroo Runtime that I
wouldn't add today, and that is dynamic class loading based on
runtime-dependencies for debugging purposes. In the meantime, there are
libraries like RequireJS and obviously also Google Closure that take care
of that and that should be reused. I prototyped using RequireJS for
Jangaroo but did not finish that breaking change for Jangaroo 2.
Also, the Runtime can be simplified quite a lot if we rely on ECMAScript 5
and polyfills (and maybe ditch IE8 support, see other thread).

As said before, I am willing to help designing Apache Flex' JS output based
on my experience with the Jangaroo Runtime. Of course, reusing some of the
code is also possible (it has a friendly Apache 2 license).

-Frank-

Reply via email to