PostScript is comparable to other programming languages like COBOL, Basic, C or Pascal. In fact, it closely resembles Forth, a fairly obscure programming language that I played around with years ago.
Every programming language is written for a specific goal: Java was created to make programs that can be deployed in a cross-platform environment. BASIC was developed to give beginners an easy-to-understand introduction to programming. COBOL was meant for writing business applications.
Although PostScript is flexible enough to be used for writing games and so, it is meant to be used as a page description language: its instruction set is optimized to define how graphic objects (text, lines, images,..) are placed on a 2-dimensional page. It is a device-independent language: the content of the pages is described without reference to any specific device feature (like the resolution or which paper cassette has to be used on a laser printer). Theoretically, this means that any PostScript file can be sent to any device. Of course, it would be unpractical if PostScript could not be used to also control device-specific settings. Device-specific drivers allow such code to be added to PostScript code. This means that most PostScript programs do contain a number of device-specific commands. This is no problem as long as the PostScript file is only intended to be sent to that specific device.
PostScript was developed by Adobe in the early ’80s. The company have kept improving the language until early 2000 so that there are three different versions of it: PostScript level 1, PostScript level 2, and PostScript 3. Don’t ask me why they dropped the ‘level’ in the latest version, marketing people have probably spent weeks discussing this brilliant move. You can read more about the history of PostScript and the differences between the various levels on these pages.