Evaluating Programming Languages

How do we evaluate a given programming language?

External Evaluation Criteria

The actual users of languages (businesses, engineers, scientists, students, managers, secretaries, etc.) have certain demands on the languages they use. One legitimate way to evaluate languages is to ask whether a given language meets the needs of a given user community.
Rapid development
Programmers are more expensive than machines, so they'd better be able to make fast progress. (We should consider both the language and its environment in making this evaluaiton.)
Easy maintenance
Maintenance is expensive.
Reliability and safety
When computers go down, planes crash, phone systems break, nuclear reactors melt down, cash machines close. We'd like to avoid this.
Portability
I'd like my program to run on many different platforms, with minimal rewriting.
Efficiency
The compiler should be fast. The code itself should be fast.
Low training time (learnability)
The language should be easy to learn. Training is expensive.
Reusability
Writing software components once is cheaper than writing them twice.
Pedagogical value
The language should support and enforce the concepts you want to teach.

Internal Evaluation Criteria

Although the above demands are all important, we should still ask what makes a good language, independent of the demands of its users. This is a little like the question "What makes a good artwork?" as opposed to "What makes a good Hollywood movie?" Here are some qualities of a good language.
Readability
Understand what you, or someone else has written.
Writeability
Say what you mean, without excessive verbiage.
Simplicity
The language should have a minimal number of primitive concepts/features.
Orthogonality
The language should support the combination of its concepts/features in a meaningful way.
Consistency
The language should not include needless inconsistencies. (But remember Ralph Waldo Emerson: "A foolish consistency is the hobgoblin of small minds.")
Expressiveness
The programmer should be able to express their algorithm naturally.
Abstraction
The language should support a high level of data and control abstraction.

We will generally make use of these and other internal evaluation criteria when comparing languages.