Weep for Graphics Programming
I'm not sure why bytecode is supposed to be significantly better than storing the shaders as strings.  Sure, you get rid of a complex parser and can more easily use it as a compiler target, but the core problem remains: the compiler can still not reason across the device boundary.  The CPU compiler does not understand what happens on the GPU, and the GPU compiler has no idea what the CPU is going to do do it.Although I'm not a big fan of CUDA, it does have an advantage in that it combines both worlds in a single language.  This does permit optimisations that cross devices boundaries, but I have no idea whether the CUDA compiler does any of this.Apologies for tooting my own horn, buI have been working on a language that can optimise on both sides of the CPU-GPU-boundary: http://futhark-lang.org/ (Although it is more high-level and less graphics-oriented than what I think the author is looking for.)