This is such a good analysis and case study that I almost don't want to summarize it and let folks read it, but I know not everyone will and miss out. I also want to list things out for my own sake and future reference. Read the full article though instead of reading 5 other short ones.<p>Rust (baseline) 1.0x -- smaller using hand-written lexer and recursive descent parsing, mutation using visitor<p>Haskell 1.3x -- NFA -> DFA lexer generator, LR parser -> AST, full tree rewrites<p>C++ 1.4x -- LR parser and tree rewriter, lack of sum types and pattern matching, header files (subjectively estimated compile times similar to Rust baseline)<p>Python 0.7x -- most extra features, LR parser, dynamic typing just set new fields on AST, introspect fields via __dict__, metaprogramming with eval code snippits (maybe ~2x expressive as baseline)<p>Rust (another team) 3x -- DFA lexer and LALR(1) parser, fully typed parse tree instead string-based, TryFrom vs Result, boolean field/constraints and return type multiplication factor, data structure for assembly instructions<p>Scala 0.7x -- use provided cmdline LR table generator, Python script translated scraped Java grammar from web page. (compared to Rust baseline somewhat more expressive with more syntactic sugar and no borrow-checker to make happy)<p>OCaml 1.15x -- LR parser generator and tree rewriting for parsing, as well as a regex->NFA->DFA conversions for lexing. (Rust and OCaml seem similarly expressive except that OCaml needs interface files and Rust doesn’t.)<p>The above is a barely meaningful summary but it does get across the idea that there isn't all that much difference in expressiveness in the hands of similar and very skilled authors, except for the Python case which sacrifices static-typing safety and performance as well as using metaprogramming requiring more knowledgeable/skilled maintenance.