Apr 29, 2007

avmplus 101

Now that we have an avmplus executable, let's see how we can use it.

First let's define what is the avmplus,
the name stand for ActionScript Virtual Machine +,
so basically it's a virtual machine that can execute actionscript bytecode.

That's it, you can not feed the avmplus source code directly, but only bytecode, and as a normal human sorry I do not write bytecode by hand, at most I can barely write readable source code.

So even if we got the avmplus we're missing one piece of the puzzle, the way to generate bytecode (*.abc file) from source code (*.as file).

Download the Flex SDK, and install it.

It's not open source yet, but it will be in few months, just to say that we gonna use it (or at least a part of it) in an unconventionnal way but not that much to bring us the thunder of Adobe ;).

What interest us in that Flex SDK is a library named asc.jar, yep it is the shortname for actionscript compiler, and this little gem can generate *.abc files from *.as sources.

In your Flex SDK installation dir you should find asc.jar, copy and paste it in a working directory, I named mine tamarin/sandbox :p.

Let's run it using Java.
c:\>java -jar asc.jar
And you will obtain the default options for the actionscript compiler
--------------------------------------------------------------
ActionScript 3.0 for AVM+
version 1.0 build d628
Copyright (c) 2003-2004 Macromedia, Inc.
Copyright (c) 1998-2003 Mountain View Compiler Company
All rights reserved

Usage:
  asc {-AS3|-ES|-d|-f|-h|-i|-import |-in |-m|-p}* filespec
  -AS3 = use the AS3 class based object model for greater performance and better error reporting
  -ES = use the ECMAScript edition 3 prototype based object model to allow dynamic overriding of prototype properties
  -d = emit debug info into the bytecode
  -f = print the flow graph to standard out
  -h = print this message
  -i = write intermediate code to the .il file
  -import  = make the packages in the
       specified file available for import
  -in  = include the specified filename
       (multiple -in arguments allowed)
  -m = write the avm+ assembly code to the .il file
  -p = write parse tree to the .p file
  -md = emit metadata information into the bytecode
  -warnings = warn on common actionscript mistakes
  -strict = treat undeclared variable and method access as errors
  -sanity = system-independent error/warning output -- appropriate for sanity testing
  -log = redirect all error output to a logfile
  -exe  = emit an EXE file (projector)
  -swf classname,width,height[,fps] = emit a SWF file
  -language = set the language for output strings {EN|FR|DE|IT|ES|JP|KR|CN|TW}
  -optimize = produced an optimized abc file
--------------------------------------------------------------
Now let's try to run our first example "hello world" using avmplus.

test.as

package
    {
    
    print( "hello world" );
    
    }


Let's see first what happen if we try to run an *.as file directly in avmplus
c:\>avmplus_sd test.as
VerifyError: Error #1042: Not an ABC file.  major_version=24944 minor_version=2573.
You see, avmplus need an *.abc file.

but as we can run asc to compile an *.as file to *.abc, we should be OK.

so first we compile an abc file
c:\>java -jar asc.jar test.as
test.abc, 87 bytes written
then we run it using avmplus
c:\>avmplus test.abc
hello world
Voila we run our "hello world" example with avmplus :).

But wait, there is more to it, if you look closely at the asc options you will see that little gem
-exe  = emit an EXE file (projector)
Yes, you can also use asc to compile an abc file and combine it with the avmplus to compile your own executable file.
c:\>java -jar asc.jar -exe avmplus.exe test.as
test.abc, 87 bytes written
test.exe, 467039 bytes written
and off course you can run that exe
c:\>test.exe
hello world
And if a 400KB executable bother you for a simple hello world, you can still use UPX (the Ultimate Packer for eXecutable) and that will size down that exe almost by half.
And if you're not convinced by a simple hello world, look here for an abc decompiler, that simply reuse abcdump.as.

You can not do much with avmplus for now, look at toplevel.as, you will see that there is only basic file IO and basic command line interaction (readline, writeline,etc.), but this will evolve.


read more ...

How to build Tamarin on Windows

The Tamarin project is an open source ECMAScript Virtual Machine, contributed by Adobe to the Mozilla fondation.
This VM is already running inside the Flash player 9, and is planed later to be integrated in SpiderMonkey (the engine running JavaScript in Mozilla, FireFox, etc.).
Here I gonna explain step by step how to compile it under Windows (win32).

01. Download a C++ compiler
I set my choice on Visual C++ 2005 Express Edition, first because if you're new to compiling on windows this is less hassle to set up, second it's free to use and third it can build Windows native executable and it's what we want here.

Download and Install vcsetup.exe (3MB), and don't forget to register (well yaknow that MS thing, don't worry it's free).

Well now you will have to install the Platform SDK (well I said "less hassle", not "no hassle"), you need the PSDK for thing like windows.h, but anyway as you're into compiling in C/C++ having the PSDK could be usefull later, whatch out it can be a big download (around 300MB and more).

But basically follow these steps:
Using Visual C++ 2005 Express Edition with the Microsoft Platform SDK.

02. Download Tamarin sources from the CVS repository
You gonna need CVS, simpler thing to do is to install TortoiseCVS, and then add the path to the TortoiseCVS install to your environment variables.

That way you will be able to use CVS from the command line, and use the following to get Tamarin sources.

cvs -d :pserver:anonymous:anonymous@cvs-mirror.mozilla.org:/cvsroot
 export -r HEAD mozilla/js/tamarin
To compile Tamarin you will also need the zlib module, that you can get also from CVS.
cvs -d :pserver:anonymous:anonymous@cvs-mirror.mozilla.org:/cvsroot
 export -r HEAD mozilla/modules/zlib
You should write these all in one line, you can download that zip file for some little batch files that will do that for you ;).


03. Compiling Tamarin with VC++ express
After the CVS checkout you should have the Tamarin directories all set up, now we need to open avmplus_8.vcproj.
Now, right click solution 'avmplus_8' and select build solution.

If all went OK, you should obtain this line at the end.
========== Build: 4 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
By default the project compile the debugger version of avmplus, that can be found here.
..mozilla\js\tamarin\platform\win32\obj_8\shell\Debug_Debugger\avmplus_sd.exe
Here the options for the avmplus (debugger).
--------------------------------------------------------------
avmplus shell 1.0 build d684

usage: avmplus
          [-d]          enter debugger on start
          [-Ddprofile]  dynamic instruction stats
          [-Dsprofile]  show static instruction stats
          [-Dgreedy]    collect before every allocation
          [-Dnogc]      don't collect
          [-Dgcstats]   generate statistics on gc
          [-Dnoincgc]   don't use incremental collection
          [-Dastrace N] display AS execution information, where N is [1..4]
          [-Dinterp]    do not generate machine code, interpret instead
          [-Dverbose]   trace every instruction (verbose!)
          [-Dbbgraph]   output MIR basic block graphs for use with Graphviz
          [-Dforcemir]  use MIR always, never interp
          [-Dnodce]     disable DCE optimization
          [-Dnocse]     disable CSE optimization
          [-Dnosse]     use FPU stack instead of SSE2 instructions
          [-Dverifyall] verify greedily instead of lazily
          [-Dtimeout]   enforce maximum 15 seconds execution
          [-error]      crash opens debug dialog, instead of dumping
          [-log]
          [-- args]     args passed to AS3 program
          [-jargs ... ;] args passed to Java runtime
          filename.abc ...
          [--] application args
--------------------------------------------------------------


04. Compile the Release version of Tamarin
Right click solution 'avmplus_8' and select configuration manager....

At the top left in active solution configuration, select Release, close the window, clear the output (right click clear all), and compile again.

Again if all goes well you should obtain this line at the end.
========== Build: 4 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
The compiled exe can be found here
..mozilla\js\tamarin\platform\win32\obj_8\shell\Release\avmplus.exe
Here the option for the avmplus (release).
--------------------------------------------------------------
avmplus shell 1.0 build d684

usage: avmplus
          [-Dinterp]    do not generate machine code, interpret instead
          [-Dforcemir]  use MIR always, never interp
          [-Dnodce]     disable DCE optimization
          [-Dnocse]     disable CSE optimization
          [-Dnosse]     use FPU stack instead of SSE2 instructions
          [-Dtimeout]   enforce maximum 15 seconds execution
          [-error]      crash opens debug dialog, instead of dumping
          [-log]
          [-- args]     args passed to AS3 program
          [-jargs ... ;] args passed to Java runtime
          filename.abc ...
          [--] application args
--------------------------------------------------------------


Voila, you should now be able to compile Tamarin on Win32 :).
The next post will be about how to use that's shiny avmplus to compile ECMAScript 4 source.


read more ...

focus on the language

Now that ECMAScript 4 is on its way, I felt I needed a blog to focus on the language itself and only that.

So here you will see posts all about ECMAScript, the language.
Be it ECMA-262, or better say JavaScript, E4X, or ES4 (ECMAScript 4), etc.
We have an evolving language that have its own spirit, its own way of doing things, and this worth exploring in details.

For years I accumulated docs, books, white papers, little tricks, etc. but stupid me I kept that on a local archives only, and now I gonna try to organize that as a public content, and hopefully I'll try to put also new content ;).


read more ...