I am working on a middle-end compiler for functional programming languages, and programming languages that support object-functional programming (i.e., OCaml and Scala), and their embedded domain-specific languages (DSLs).
Hence, I would like to learn from the designers of the OCaml compiler, and learn their justification of choosing the Common Machine Model (CMM) over continuation-passing style (CPS) and static single assignment form (SSA).
I am using OCaml/OxCaml for this, since it can help me build a LLVM-like middle-end compiler for compiler optimization that is independent of instruction set architectures (ISAs) and computer language agnostic (like LLVM).
The goal of using CPS as the intermediate representation is to facilitate the use of functional programming -supporting programming languages to embed the DSLs that I am specifying for domain-specific computing.
CMM does not stand for Common Machine Model, but for C-- (C minus minus).
CMM is only one of the intermediate languages used by the native-code backend of the OCaml compiler, among others such as Lambda, Closure, Mach, etc, and important parts of the compilation process are dealt with in those other languages. So it would be inaccurate to describe CMM as THE intermediate language of the compiler.
In general, as to why neither CPS nor SSA are used in the compiler (NB I’m talking here of the non-FLAMBDA pipeline), I would turn the question around: why would one use these languages? One of their salient characteristics is to be a medium for many clever optimizations, but the OCaml compiler is famous for doing little in this department. Instead the focus is to generate efficient code that maps closely to the source code, allowing a knowledgeable programmer to write code with predictable space and time characteristics.