The first operating systems were developed to make programming easier by collecting commonly used functions into libraries that were always available on a mainframe system. The introduction of time sharing (rapidly switching the CPU of a computer among tasks belonging to different users) created the illusion that every user had a computer of his or her own - albeit slower and with fewer resources than the real machine. Accordingly, the duties of operating systems had to be extended to provide multitasking, resource management, and protection.
In the 1970s, the idea of personal computers came up. If a user has a complete computer for her- or himself, many of the operating system duties introduced on mainframes for time sharing are no longer required. The first person coming up with this idea was Dan Ingalls, who created the Smalltalk system at the Xerox PARC research center, which was the first system to introduce a GUI and a mouse-driven interface and also one of the first object-oriented languages.
Smalltalk is an integrated system using bytecode (similar to Java) which provided
extensive facilities to inspect and even modify the system code at runtime.
Most of the functionality of the system was actually implemented in Smalltalk
itself, so Ingalls came up with the quote [1]
An operating system is a collection of things that don’t fit into a
language. There shouldn’t be one.
This is, of course, a somewhat provocative topic worth discussing.
Ingall's ideas were taken up more recently by Stephen Kell [2], who also
discussed how to add Smalltalk-like features to more traditional,
Unix-like systems [3]. More recent research on runtime environments
without an underlying OS can be found in [4].
However, getting rid of operating systems is also interesting in other contexts. For example, in Cloud computing environments, running a complete OS in each virtual machine instance (that maybe only serves to execute a single microservice) consumes a significant amount of resources. Thus, the idea of library operating systems was recycled in the form of Unikernels [5].
This topic is on the border of "philosophical" questions on system design and concrete problems of the technical implementation. The hardware/software interface is of interest here, since now a programming language runtime environment has to take care of directly talking to the hardware instead of relying on OS services.