&gt; A formal semantics is just a way to translate from one formalism to another.<p>Of course, we need to reach a gentleman&#x27;s agreement regarding which formalism is a good “foundation” for defining everything else. My personal preference would be to define all other formal systems in terms of rules of inference.<p>&gt; It&#x27;s rather obvious that choosing the target formalism determines how simple the language will appear, when you talk about &quot;formal semantics&quot; you should specify &quot;which one&quot;: operational? denotational? axiomatic?<p>I am fine with any, as long as the same choice is made for all languages being compared. What ultimately interests me is proving a type safety theorem, that is, a precise sense in which “well typed programs don&#x27;t go wrong”, so perhaps this makes a structural operational semantics more appropriate than the other choices.<p>&gt; Stricly speaking a compiler or an interpreter represents a formal semantics for a language: operational semanthics rules are often very very similar to the code of an AST interpreter, for example.<p>&gt; One could interpreter your statement to mean that the smaller the compiler the simpler the language, which means that assembly language was the simplest language all along!<p>Sure, but the target languages used by most compilers are often themselves very complex. Which means a realistic compiler or interpreter most likely won&#x27;t be a good benchmark for semantic simplicity.