Why isn C– a superset of C?
• C is a programming language designed for human programmers, whereas C– is a compiler target language. So C has many things that are entirely unnecessary for C–; requiring a C– compiler to support them would be exceptionally burdensome. Most notably, C has an elaborate type system that we don’t need for code generation (struct, union, prototype, and all that). • There are a few features in C that are actually incompatible with C–, most notably support for varargs procedures (that is, procedures with a variable number of arguments). It seems impossible to have both C-style varargs and efficient, fully-general tail calls (which C– must have). • C– deliberately provides different notation for many things that C can do. For example, where C would have “*p”, we write “bits32[p]” in C–. • The C standard leaves too much up to the implementation, including the representations of structures, the sizes of the built-in types, and the meanings of the operators. C operators can have side ef