Generally speaking, the trends of the hardware evolution never have direct effects on the evolution of programming language. The design of hardware and the design of programming language have never been combined or cooperative procedures. It is a common observation that with the improvement of computer hardware cost-performance ratio, programming languages tend to be more complex and less efficient.
However, it is not the trends in hardware evolution that affect the complexity and efficiency of programming languages. Programming languages are in their nature being developed to be more complex in accordance with the growth of the complexity of the problem we tend to cope with. Also, programming language designers have to sacrifice the efficiency of programming languages for a better program readability, modularity, and reusability.
What we can say is that with the decreasing cost and increasing speed of hareware we simply can afford the programming language to be more complex and tolerate the programming language to be less efficient.
Of course NOT. Efficiency should always be the primary concern of programming language designers. First, the size and complexity of the problems we would like to deal with grow faster than the developing of hardware technologies, so we seem never have enough computing power to "waste". Second, at any time, efficient use of computing facility could yield a better productivity.
The idea of virtual memory reflects the demand of programmers for transparent access to large programmable memory space. For example, in some early versions of C, programmers had to use such key words as NEAR and FAR to distinguish pointers to within-segment memory address from pointers to beyond-segment memory address. This was a huge burden to programmer. The incorporation of the virtual memory scheme into hardware relieves programmer from the burden.
The reason why CISC go obsolete is that most of those sophisticated instructions provided by CISC are seldom used by compiler because compiler just cannot be complex enough to make efficient use of them. On the other hand, these sophisticated instructions made the design procedure of CPU extremely difficult and remained as one of the bottleneck of performance improvement. Again, RISC/CISC does not have direct effect on programming language, yet make the life of compiler easier.
CISC is not intended to be programmed in assembly language. The design philosophy behind this was that with complex instructions, program size tended to be compact so that memory space was saved. Also, to do as many things as possible in one machine cycle should increase the performance of computer. Of course, they were proved to be not completely correct.