notes-computer-programming-programmingLanguageDesign-prosAndCons-microVsMonolithic

" than Go ignoring years of language research, that the complaints stem from Go being a monolithic language rather than a microlanguage. I've stolen the monolithic/micro distinction from the kernel space, but the idea seems to apply here too.

Micro languages are wonderful. They're the near-minimum amount of features required to build all features. Ideally they are massively flexible and allow changing:

Nothing is really special. Everything can be replaced or changed at compile or runtime. It is up to the library and application programmers to create the language they need for the task at hand.

Micro languages have a long history: forth, lisp, scheme and friends. I personally was attracted to the Io language and spent a number of years coding in and on Io. The sky is the limit. They can be a lot of fun to craft in.

In my experience micro languages have a flaw. They tend to attract people who love, embrace and thrive with complexity. Almost anything can change, and does. Idioms are critical, but it is hard to really know how anything will behave from inspecting one fragment of the code. The programs end up with millions of concepts rather than a small set.

As in the kernel space, the monolithic tends to come out on top. Monolithic languages have rigid semantics and syntax. The behavior is obvious; what you see is what it does. There are simple semantics that hold everywhere. The monolithic languages are not flexible. They have a particular model and set of operations and that's that. If you want to play with an interesting new style, you've either got to change the compiler or use a new language.

...

As for continuations and privileged builtins these are classic areas of conflict between micro and monolithic languages. With continuations all manner of wonderful flow control constructs can be implemented, from if statements, for/while loops up to coroutines and retryable exceptions. Very powerful. Rather confusing. If you want a tiny language that can be extended indefinitely, then continuations are a must have. If you want a language to sit down and use, with everything being simple and obvious, then continuations mask actual behavior.

In a micro language, there will be few, if any, builtins and special types. Anything can be changed except for a few atoms the entire world is built on. In a monolithic language, there tend to be builtins types or functions to provide stability and certainty. In micro languages the builtins may well be hidden below libraries and low level, where in monolithic languages, the builtins are higher level and visible.

Given the history, it seems unlikely that a mainstream language will be a micro language. "

-- Jonathan Wright, http://www.acooke.org/cute/GoRocksHow0.html