Between high-level programming languages (Java, Haskell, Rust, Prolog…) and low-level machine models (x86, ARM, RISC-V, FPGAs, Turing machines,…) there is an intermediate category of abstract machines. These abstract machines are much simpler than programming languages, which are mainly intended for human users, yet abstract enough to not be concerned with details of concrete computer or instruction set architectures.
There are various use-cases for abstract machines. They form the basis of bytecode-interpreted languages like Java’s JVM, Microsoft/.Net’s CLR and Erlang’s BEAM virtual machine. In compilers they are often used as the basis for intermediate languages; for example the LLVM IR, GHC’s STG IR, or Rust’s Mir. These intermediate languages are where a lot of code optimizations happen. And in the theoretical study of programming languages abstract machines allow to make mathematically precise statements about runtime properties of code, for example the sharing of intermediate computations.
Further details about the seminar are forthcoming.