“Great” is a pretty subjective term.
I would define a “great” high-level, general-purpose programming language as popular, widely available, well respected, and evolving.
All of this really depends on the following interrelated attributes:
- It needs to be very well designed for the type of work it’s targeting and for the programming paradigm(s) it supports.
- It needs to become widely available, with implementations for a wide variety of targets (operating systems and hardware).
- Initially, it should be kept as simple as possible but no simpler (with apologies to Albert Einstein for the paraphrase). One interpretation of “great” is large, but bigger (and more complex) is not always better.
- It needs to become widely used and develop an enthusiastic user base and an ever-growing ecosystem of libraries, frameworks, training, etc.
- It needs to become standardized, so that it isn’t fragmented by a large number of incompatible dialects.
- It needs to be carefully enhanced over time to provide new, highly-requested features, while maintaining backward compatibility with existing source code (avoiding breaking changes, if at all possible).
There is a certain amount of “right place at the right time for the right task” involved, as well as being “championed” by one or more large organizations and/or high-profile, respected individuals. Without those factors, it can take a lot longer for a programming language to really catch on.
Some languages will catch on quickly and gain forward momentum, others will take much longer to catch on, and still others will never really catch on at all. There are new languages developed all the time, some in academia, some in industry. You only hear about a small fraction of them. And only some of those you hear about will ever achieve “greatness” in the long term.