There are at least two "CS" interpretations to *runtime environment*.  
 One is the process/OS level - some lump of hardware turned into a [MINIX](https://en.m.wikipedia.org/wiki/MINIX#MINIX_1.0) machine, an [OS/400](https://en.m.wikipedia.org/wiki/AS/400), [QNX](https://en.m.wikipedia.org/wiki/QNX), [z/OS](https://en.m.wikipedia.org/wiki/Z/OS), [Multics](https://en.m.wikipedia.org/wiki/MULTICS) one. At this level, memory usually gets allocated in *segments* or *pages* (taking care no information *leaks*).  
 Then, there is the programming language level - what gets your `main()` running (and possibly constructors&co. of statically allocated objects before that), that `Begin…End;`-block implicitly prefixed with `Simula` - you name it. It takes care of memory allocation (and possibly initialisation) for a subroutine call stack (per coroutine/thread), "statically allocated" program data, "automatically allocated" space (e.g., for variables in potentially recursive subroutine calls), "dynamically allocated" space (e.g. objects for linked data structures).  
"The compiler" decides about memory layout for multi-dimensional arrays.
It arranges access to machine code for the "runtime library" - with OS support more often than not.  
In all, a Forth machine, a Java, Fortran, Beta one.  

Note that

- the paragraph quoted does *not* say the `compiler [executes] the code`
- *`creates and manages`* needs/leaves room for interpretation
- one resource managed by one authority doesn't preclude the same resource being managed by another one - expect conflicting responsibilities handled usefully.