ascii assembly language bcpl bytecode cambridge compiler exception handling functional programming glasgow haskell compiler imperative programming intermediate language low level virtual machine microsoft microsoft research programming language programming paradigm simon peyton jones syntax tail recursion type system variadic function weak typing