I finally have a general interpreter architecture view of Tamarin in my head. I'll get into the tracing aspect of it later this week. Tamarin is pretty convoluted, so you may want to make yourself some coffee prior to jumping into the rabbit hole.
So far, my count on the number of languages used, in the order that I'll explain how they are used is five: Java, ActionScript, Forth, C, and Python. These languages can be broken down into two subgroups: Support code which includes Java/ActionScript, and the actual interpreter/tracing JIT: written in Python, Forth, and C.
During compile time, Flex is used to compile the native ActionScript files into .abc files. These native ActionScript files contain some of the support code of the ActionScript spec, such as Math.min()/Math.Max(); They also define all the native function calls for some Objects. For example, Array::Splice is defined in Array.as. Some of these functions also have hooks into C such as Math.Cos which is defined with:
public static native function acos(x:Number):Number;
Such calls are expanded into C function calls during compilation time. They are all glued together via builtin.as, which compile all the ActionScript into .abc files.
Here is a quick flowchart showing the execution of a single ABC bytecode:
The labels of inner/outer interpreter are taken from the Tamarin source. Hopefully this isn't too confusing. I'll be getting into implementation specific details over the week. Some of the hooks are pretty nifty.