| - One executable that is the runtime, accepting one argument: the source code file. - No linters. Code is auto-formatted. - No modules. Includes can be namespaced/aliased. - No package manager. Include by Git URL with tags. - No type annotations. Automatic type-checking. - No user-defined types. A few good types is better. - No null. Set membership with maps is better. - No exceptions. - No loops. List and map comprehensions. - No general recusion. Only tractable transitive closures (ala Datalog). - No higher-order functions. - Terminating. All programs terminate. Turing completeness is not desirable for most domains, but predictable semantics is. - Safe. No undefined behavior. No crashes. - Persistent, the runtime is also the database. The language is the database. I'm working on a language with exactly this set of features. Email me if you're interested. |
Naming: linters deal with much more than formatting, and users tend to create linters even for languages which enforce canonical formatting.
Linters check for the patterns which are allowed by the compiler, but disallowed by a particular project/team/org. Example: disallow functions longer than four statements, disallow repeated strings that could be replaced by a constant, etc.