There are many makes and models of computers. There are many programming languages.
Let’s say that two computer programs are equivalent if, when we run both programs with the same inputs, we get the same outputs.
Let’s say that two programming languages are equivalent if, for each program that we can write using Language A, we can write an equivalent program using Language B.
Let’s say that two computers are equivalent if, for each program that we can run on Computer A, we can write and run an equivalent program on Computer B.
These definitions of equivalence allow differences. One program might be more concise than another, equivalent program. One language might allow clearer expression than does another, equivalent language. One computer might execute instructions more quickly than another, equivalent computer. Different computers have different sizes and costs and use different amounts of energy. Of course, there are also cosmetic differences like colors.
All programming languages are equivalent. All computers are equivalent.
If we can solve a problem with one programming language, we can solve it also with another programming language. If we can solve a problem with one computer we can also solve it with another computer.
We have allowed differences among equivalent languages and computers. Some of these differences give us good reasons for prefering one language over another and one computer over another. However, if we are sufficiently patient, we can solve our problem with any language or computer.
Does this surprise you? Did these claims seem obvious to you?
Some of you might want to challenge my claims. Can you identify exceptions to my claims? Could you write more precisely about the equivalence of programming languages and computers? Have you read about research that promises to deliver now computing technologies that might require a new understanding of machines and languages?