I hate the way developers use similar names for different things!
Assemble refer to one or more files that are output by the compiler as a result of program compilation.
Yup, dont confuse this with assembly code though, - its very possible (and people do) write assembly code by hand, for a number of reasons.
...An assembly may contain types, the executable code used to implement these types, and references to other assemblies.
It depends what you mean by types. A common meaning of type wrt programming languages is the type of a variable (i.e. integer, character, boolean.) This information is generally not present as we go to a lower level of abstraction.
The physical representation of an assembly is not defined by this specification..
Nope, id guess it would be implementation specific.
Essentially, an assembly is the output of the compiler.
It depends on what compiler you are talking about - and if you mean assembly language or assembly in the .NET way. Generally, no its not (for compilers.) You could argue that a compiler "produces" an executable, which might be machine code or bytecode etc... Assembly code can be thought of as a higher level machine code, and still needs to be translated by an assembler to produce the machine code (which is executable.) Compilers are very rarely one big monolith of a program. Instead they are a chain of different specific tools. For instance, the compiler I wrote for Mesham, a parallel programming language we have developed, generates C99 code (which links against MPI and my runtime library) which then gets "processed" by a C compiler. To the programmer this is all completely hidden but we get the added benefit of portability (with care on our part) and use of the C compiler's optimisation process (as well as not having to reinvent the wheel!)