We have developed specific libraries to simplify the development of serial and parallel scientific applications. The A++/P++ library provide an essential array abstraction for C++ scientific applications. The effect is to provide a single array abstraction that permits the development of serial code (using A++). The serial application code using the array abstractions need only be recompiled (using P++) to run on parallel distributed memory machines. The resulting abstractions are simple and powerful since it simplifies serial application code and even completely hides parallel details. But since it operates as a library the compiler is oblvious to its semantics and likewise the library is oblivious to the context of the use of its abstractons within the users application code. It is discouraging that the development of efficient code from high-level abstractions is blocked by compilers that are unable to use very specific high-level semantics essentially because it is user-defined. In this paper we show how high-level serial and parallel libraries have been used to simplify the development of scientific applications and how with the specific semantics of such high-level abstractions we can develop preprocessors that dont extend the C++ language but instead permit the user-defined semantics of the high-level abstractions to be leverages together with the context of the high-level abstractions within the users application to optimize the performance of the final application code.