p-System started around 1977 as an idea of Prof. Kenneth Bowles at UCSD, who felt that the number of new platforms coming out at the time would make it difficult for new languages to gain acceptance. In particular he was interested in Pascal as a teaching language, which had just been announced. UCSD introduced two features which were tremendous improvements on the original Pascal, variable length strings, and "units" of independantly compiled code (and idea taken from the then-evolving Ada programming language). Nicklaus Wirth credits the p-System, and UCSD Pascal in particular, with popularizing the language. It was not until the release of Turbo Pascal that UCSD's version started to slip from first place among Pascal users.
The machine independence was achieved by defining a virtual machine called the p-Machine (or pseudo-machine, which many users began to call the "Pascal-machine" like the OS, although the UCSD documentation always used "pseudo-machine") with its own instruction set called p-Code (or pseudo-code). This p-Code was optimized specifically for generation by the Pascal programming language and all the original development was done in UCSD Pascal. Each hardware platform then only needed a p-Code interpreter program written for it to port the entire p-System and all the tools to run on it. Later versions also included additional languages that compiled to the p-code base.
In most ways the p-System was identical in concept to the Java platform. Both use a virtual machine to hide operating system and hardware differences, and both use programs written to that virtual machine to provide cross-platform support. Likewise both systems allow the virtual machine to be used as the complete operating system for the target computer, or running in a "box" under some other operating system. The differences are in the details, primarily in that the Internet has changed the distrubution model, so Java spends considerably more effort on security and the ability to quickly download programs in compressed form.
There were four versions of UCSD p-Code engine (p-Code incompatible) each with several revisions of the p-System (and UCSD Pascal); represented with the leading Roman Numeral; operating system revisions were enumerated as the "dot" number following the p-Code Roman Numeral. vis: II.3 represented the third revision of the p-System running on the second revision of the p-Machine.