Let us now study some historical developments in hardware and how they have affected software over and over again. The first mainframes had limited memory. A fully loaded IBM 7090 or 7094, which played king of the mountain from late 1959 until 1964, had just over 128 KB of memory. It was mostly programmed in assembly language and its operating system was written in assembly language to save precious memory.
As time went on, compilers for languages like FORTRAN and COBOL got good enough that assembly language was marked dead. But when the first commercial minicomputer (the PDP-1) was released, it had only 4096 18-bit words of memory, and assembly language made a surprise comeback. Ultimately, minicomputers acquired more memory and high-level languages became widespread on them.
When microcomputers hit in the early 1980s, the first ones had 4-KB memories and assembly language programming rose from the dead. Embedded computers often used the same CPU chips as the microcomputers (8080s, Z80s, and later 8086s) and were also programmed in assembler in the beginning. Now their descendants, the personal computers, have lots of memory and are programmed in C, C++, Java, and other high-level languages. Smart cards are experiencing a similar development, though beyond a certain size, the smart cards often have a Java interpreter and execute Java programs interpretively, instead of having Java being compiled to the smart card's machine language.