Hardware is everything you want to kick.
Software is what makes you want to kick it.
I have been responsible for writing a lot of different kinds of software – single computer programs and systems that bring those programs together – and for planning in its production.
Computers are completely stupid – they have, in themselves, no intelligence whatsoever. Computers follow precisely the instructions they are given in programs. Those instructions are extremely tiny actions that a computer can perform, like “add the number in this cell to the number in that cell and place it in that other cell” or “if that cell contains a zero then take your next instruction for such-and-such a cell, otherwise use the next instruction”. This is just not the way people think, and not at all like what the usual user of a computer wants to see.
We have computer programs, which are lists of instructions like these, and which perform things that are more like what the user wants. And when we have a lot of programs, we have to get those programs to talk to each other, and to run at the same time as other programs, without interference, and to writing information out to the screens or disks or … well, you can insert a long list here. What the user now sees is something like the Windows operating system, or Mac OS X, or Linux, or any of the large mainframe operating systems. These allow for much easier access to the power of the computer, and are what most people think of when they think about computers.
An Operating System is like a city built from bricks (small, individual machine instructions) which make walls (single programs) which make houses (groups of programs) which make roads and streets (groups of groups) which make suburbs (program system groups) which are collected together to make a city (operating system). And there are many more intermediate levels than I have described here.
And, no, my spelling is not wrong: programs are for computers, and programmes are for the theatre.
There are lots of computer languages – hundreds of them: each one specialises in one particular aspect of computing. You may have heard of control languages like Cobol, Fortran, Algol, PL/I, Basic, Pascal, Prolog, C, C++, Java, php, cvs, xml, html, RPG, Lisp… and there are many, many more. Ultimately every on of these languages has to be reduced to a sequence of the basic machine instructions – the tiny instructions – that get the computer to do anything, Each of these languages need to be compiled or interpreted by some computer program.
The programs, which change a computer language into another computer language are called compilers. Compilers are often connected into chains, each link of which performs one stage of the translation down to the base machine instructions: each link passes information to the next using an intermediate language, and eventually getting done to the tiny machine instructions.
So we need, in building computer systems, a lot of compilers. Writing compilers is a specialist skill. If there are ways of simplifying compiler writing they are useful, and should make the production of compilers faster and more secure. I personally have been involved in the writing of many compilers – probably about twenty of them directly.
There are compiler writing tools, into which descriptions of the source language (the language being translated from) and the target language (the language being translated to) are given, and the output is a compiler from that source language to that target language. A program that produces a compiler can be called a “compiler compiler”. I worked extensively with one particular language translation system called Protran (since renamed to Panache) – for references see my bibliography.
It is tempting to suppose that human, spoken languages (“natural languages”) can be described in the same way as computer languages, and that one language can be easily transformed into another (translated) by a computer. Well, it just ain’t so. Human languages seem to have their rules – but the rules are always changing, and being examined by users of the language and bypassed and ignored.
Human languages contain idioms, and references back to other texts. Why, for example, do we have, in English, all of the words “plucky”, “brave”, “courageous”, “valiant”, “valorous”, “gutsy” and so on… and lots of multi-word expressions besides, all with (ostensibly) the same meaning? Because they do not have exactly the same meaning, for a speaker of English – but other languages make different distinctions. (For more comments, see my bibliography).
When we complain about how poor some computer translation is, we forget that
Natural Languages ≠ Computer Languages.