Hi Frank, I won't be able to look at this for at least a couple of days.
BTW, how's it going with the ICLA/CCLA? Or did I miss seeing the notification for it? -Alex On 1/19/13 1:08 PM, "Frank Wienberg" <fr...@jangaroo.net> wrote: > Hi folks, > > I have been rather quiet for a while, but that's because I have been busy > implementing JavaScript code generation according to the Runtime prototype > I posted some weeks ago. However, I started off implementing this in the > Jangaroo compiler, not in Falcon. I am far quicker implementing this in the > context I know, it would have taken me much longer getting started with > Falcon first. So of course now I hope that you guys help me porting this > solution to FalconJx... > > I'm about 80% finished implementing all the AS3 language features I started > documenting in the Flex Wiki and already have a demo of a large > application, namely the Open Flash Charts demo, recompiled with the new AMD > approach. > > Background on the demo: > Open Flash Chart 2 <http://teethgrinder.co.uk/open-flash-chart-2/> is a pure > ActionScript 3 > project<http://sourceforge.net/projects/openflashchart/files/open-flash-chart/ > Version%202%20Lug%20Wyrm%20Charmer/>, > and I only had to make very few changes to the original AS3 code to make > the JavaScript version generated by the Jangaroo compiler work in the > browser, without a Flash plugin. This has been working with Jangaroo 1 and > 2, and now I got it to run with the new runtime format proposed for > FalconJx. > > The demo comes in two flavors: > The "production" version <http://jangaron.net/ofc5/data-files/joo.html>, > where the whole application is a minified single JS file of about 380 kb > (unzipped, the original SWF has 320 kb, and that is zipped and of course > does not contain the Flash classes, because they come with the > FlashPlayer!): > *http://jangaron.net/ofc5/data-files/joo.html* > Or load the "debug" > version<http://jangaron.net/ofc5/data-files/joo.html#joo.debug>, > where the JS equivalent of every AS class is loaded as a single request, > simply by adding hash joo.debug to the URL: > *http://jangaron.net/ofc5/data-files/joo.html#joo.debug* > > This demonstrates the real benefit of the AMD approach: RequireJS is > capable of loading all needed scripts one by one (debug mode) as well as > optimize them into a single JS file for production. It can use Uglify, > Uglify2 or Google Closure for minification. > Loading every AS class as a single request is still astonishingly fast, > especially when using local deployment, which is what you usually do for > debugging. Note that the demo uses over 200 classes. > > Have a look at the generated JavaScript, and you'll see that Jangaroo keeps > the original ActionScript code either as comment (if there is no JavaScript > counterpart, like for "package", "class", type annotations), or as > executable code in the exact line where the original AS code was. That > means if you want to debug say line 20 of AS class "Foo", you open script > "Foo.js" in the JavaScript debugger and find the code and set the > breakpoint in that same line: 20. This is a special Jangaroo feature which > we do not necessarily need to implement for FalconJx. However, I still > think it is a good feature, and since it does not slow down the optimized > version, why not implement it for FalconJx, too? > > What I think we do need in any case is the ability to load AS classes by > single requests, as otherwise they are really hard to find when debugging > in the browser. And this is what you get for free when using RequireJS. In > Alex' prototype, the only way to achieve this behavior was to list all > needed single class scripts in the HTML (see FlexJS Wiki page). Of course, > such HTML could be generated, but I think RequireJS' approach is more > elegant. > > Another thing you can see in the Open Flash Chart demo is how I implemented > static code execution. ActionScript executes all static code of the whole > "compilation unit" the first time its "primary declaration" (usually a > class) is accessed. > Consequently, not (only) an ActionScript class, but an ActionScript > "compilation unit" is put into a JavaScript AMD module definition. Thus, > the module's value is not the class itself, but a compilation unit > containing the class. I use the property "_" for the class or any other > primary declaration, which in AS3 can also be a function, variable or > constant. The static code of the compilation unit is *not* executed when it > is *loaded*, but when the "_" property is *accessed* for the first time. > (Because code has to be loaded asynchronously in the browser, we cannot > load the module when it is accessed synchronously, but have to load all > static dependencies in advance.) This is equivalent to the original AS3 > behavior, and only introduces the minimal overhead of accessing Foo._ > instead of just Foo. > > If you want to play with the new Jangaroo compiler to see what JavaScript > output is generated for your ActionScript input, the simplest way is as > follows. > > You need to have Java, Git and Maven installed and properly set up. > > Clone the jangaroo-tools repository and switch to branch jangaroo-3: > >> git clone git://github.com/CoreMedia/jangaroo-tools.git > >> git checkout jangaroo-3 > > Then run the integration tests via Maven: > >> cd jangaroo-tools > >> mvn install -pl :jangaroo-compiler-itests -am > > This should result in a BUILD SUCCESS. > > The jangaroo-compiler-itests module is under > jangaroo/jangaroo-compiler-itests: > >> cd jangaroo/jangaroo-compiler-itests > > For the intergration tests, all *.as files under src/test/joo/ are compiled > to target/temp/joo/classes/, respecting their package sub-directory. So if > you add an *.as file under the src/test/joo/ directory, the corresponding > *.js file will appear under the target/temp/joo/classes/ directory after > the following Maven command: > >> mvn test-compile > > Note that you cannot use Flash API here (will result in compile error, as > classes are not found), only basic classes like String, Array, and built-in > functions like trace(). > > Another good news is that my employer signed the CCLA, and it has been > confirmed by Craig, so now I am all set to contribute Jangaroo code to > Apache Flex! > > The code that generates the new JavaScript runtime format is in jangaroo-tools > on the "jangaroo-3" > branch<https://github.com/CoreMedia/jangaroo-tools/commits/jangaroo-3> > (see > above), especially class > JSCodeGenerator<https://github.com/CoreMedia/jangaroo-tools/blob/jangaroo-3/ja > ngaroo/jangaroo-compiler/src/main/java/net/jangaroo/jooc/backend/JsCodeGenerat > or.java>(Michael > Sch. knows this already!) is interesting for porting code to > FalconJx and has changed substantially for Jangaroo 3 / AMD runtime format. > > I am also working on another demo, which is written in AS3 and MXML (!), > but instead of Flex components, uses "native" Ext JS JavaScript components > through an AS API. It does not use the Jangaroo Flash library > re-implementation (JooFlash), so this sounds similar to Alex' approach to > not use the display list to render MXML components. More update on this to > follow. > > Would really be great if we could consolidate our solutions! > > Can't wait for your feedback, > > -Frank- -- Alex Harui Flex SDK Team Adobe Systems, Inc. http://blogs.adobe.com/aharui