I’ve been doing this programming thing for some 20 years now. Things sure do change. One change I ponder from time to time is the matter of programming language levels. Allow me to explain.
The 1990s
When I first took computer classes in the early 1990s, my texts would classify computer languages into 3 categories, or levels. The lower the level, the closer to the hardware; the higher the level, the more abstract (and presumably, easier to use). I recall that the levels went something like this:
- High level: Pascal, BASIC, Logo, Fortran
- Medium level: C, Forth
- Low level: Assembly language
Keep in mind that these were the same texts which took the time to explain the history of computers from mainframes -> minicomputers -> a relatively recent phenomenon called microcomputers or “PCs”.
Somewhere in the mid-late 1990s, when I was at university, I was introduced to a new tier:
- Very high level: Perl, shell scripting
I think there was some debate among my peers about whether C++ and Java were properly classified as high or very high level. The distinction between high and very high, in my observation, seemed to be that very high level languages had more complex data structures (at the very least, a hash / dictionary / associative array / key-value map) built into the language, as well as implicit memory management.
Modern Day
These days, the old hierarchy is apparently forgotten (much like minicomputers). I observe that there is generally a much simpler 2-tier classification:
- Low level: C, assembly language
- High level: absolutely every other programming language in wide use today
I find myself wondering where C++ and Objective-C fit in this classification scheme. Then I remember that it doesn’t matter and this is all academic.
Relevancy
I think about this because I have pretty much stuck to low-level programming all of my life, mostly due to my interest in game and multimedia-type programming. But the trends in computing have favored many higher level languages and programming paradigms. I woke up one day and realized that the kind of work I often do — lower level stuff — is not very common.
I’m not here to argue that low or high level is superior. You know I’m all about using the appropriate tool for the job. But I sometimes find myself caught between worlds, having the defend and explain one to the other.
- On one hand, it’s not unusual for the multitudes of programmers working at the high level to gasp and wonder why I or anyone else would ever use C or assembly language for anything when there are so many beautiful high level languages. I patiently explain that those languages have to be written in some other language (at first) and that they need to run on some operating system and that most assuredly won’t be written in a high level language. For further reading, I refer them to Joel Spolsky’s great essay called Back to Basics which describes why it can be useful to know at least a little bit about how the computer does what it does at the lowest levels.
- On the other hand, believe it or not, I sometimes have to defend the merits of high level languages to my low level brethren. I’ll often hear variations of, “Any program can be written in C. Using a high level language to achieve the same will create a slow and bloated solution.” I try to explain that the trade-off in time to complete the programming task weighed against the often-negligible performance hit of what is often an I/O-bound operation in the first place makes it worthwhile to use the high level language for a wide variety of tasks.
Or I just ignore them. That’s actually the best strategy.
Thou shouldst consider the plight of the C++ coder in our modern world, a world where–among precompiled tongues–Java and .Net have the deepest of respect where respect is not deep.
The curt assemblies of C think us bloated curs and want us gone from sight, while the the slithering Python, the occult PHP and the glittering Ruby remember us as decrepit and old, hardly worth their attentions.
How did I know that the founder of Rosetta Code would have something to say on the matter? :-)
Hey, I wasn’t speaking as the founder of RC. If I were, I’d have used the ‘website’ form entry. :) (Actually, I can’t use RC credentials when near subjective comparisons of languages; it’d kill my neutrality cred, which is kinda necessary the way I have RC authority structured)
My day job’s C++ on Windows.
I still think C++ does deserve it’s own category: the “at most 10 people in the world fully understand it and how to use it best”.
For everyone else it might still end up the best choice but they can also always be confident that their implementation is sub-optimal and some of their colleagues probably will have to learn the language feature they just used because they weren’t aware of that specific one.
Their are a few ‘real’ languages that stretch some classifications though. TGhe biggie is Lisp Its adherents might argue that it is very high level, and yet in the eighties microprocessors used in workstations used lisp at the assembly level. Then there is forth it is an assembler as well as a systems programming language.; so more like C in your classification?
P.S. I agree with you about the need to know the low-level side of things – CPU architectures/Assemblers/C as well as high-level languages and datatypes, but there is far too much to learn as an undergraduate. Maybe people should retain a sense of the limits to their computing – they could have fun expanding their knowledge after formal training.
– Paddy.