The Tcl Compiler (TC) operates much like the elisp byte compiler: it produces binary files which the runtime system knows to look for, and if found, will use in the place of the raw source when executing. This runtime is essentially a replacement Tcl interpreter, which takes as input binary data from a file, instead of textual data. Like elisp, TC's output files are portable, and so can be placed on servers.
The reason we chose this model is that Tcl cannot be compiled into pure machine code without the support of a large runtime library. This is due to the user-extensibility system, where builtin commands can be overloaded, removed, added, etc. Even simple statements may have completely different behaviors dependent on some portion of code that the compiler does not have access to. This property is described in further detail below.
One alternative would have been to follow Perl's model, where the source code is read at runtime and compiled on-the-fly before each execution. However, Tcl has a high parsing cost, so it is desireable to preparse source code prior to execution. Additionally, Tcl is used for large applications, some of which are 10,000 lines long. These programs must be compiled prior to execution.