A programming language is a formal language. Most likely its context-free, sometimes context-sensitive, rarely just regular (mostly eso-langs, and some assembly languages). There usually exists a formal grammar somewhere that defines the syntax of the language. Sometimes, this grammar isn't even written down explicitly and only exists inside the reference implementation of the parser for the interpreter or compiler of the language.
The other part of a programming language is it semantic definition. What does a syntactically valid program do? In case of Java for example, this is defined in the same document that also defines the syntax, the Java Language Specification (JLS). In case of C#, it is defined in as ISO/IEC 23270 Information technology — C# Language Specification.
I'll use the abstract of the latter as example:
This specification describes the form and establishes the interpretation of programs written in the C# programming language. It describes:
- The representation of C# programs;
- The syntax and constraints of the C# language;
- The semantic rules for interpreting C# programs;
- The restrictions and limits imposed by a conforming implementation of C#.
So what is a programming language? Its mostly a description of its syntax (grammar) and its semantic (what does the program mean).
Now, what do people mean when they "Download [language]"?. Well, in case of Java, they mean that they download a JDK -- one of the many JDKs that conform to the JLS and the acceptance tests (TCK). The reference implementation of Java is the OpenJDK. It contains both a compiler for java (
javac) and the JVM, on top of which the bytecode produced by the compiler is run. The JDK thus includes tools to both build/compile Java programs as well as run them.
People usually don't mean they downloaded the language specification when saying that they "downloaded [language]".
Similarly, when people say they "download python" or "download ruby", what they mean is that they download a vm/interpreter that is able to run that language. In case of ruby, most people will likely just use the official reference implementation you can get at ruby-lang.org. But even for ruby other options exist, like JRuby and Rubinius. JRuby runs ruby programs atop the Java VM (JVM).
Suffice to say, saying you "downloaded [language]" is almost always imprecise and can lead to confusion, since it is a very colloquial term that can mean very different things for different languages or even people (when I say "download java", do I mean HotSpot? OpenJDK? Coretto? Zulu? Liberica?). Its almost always better to be precise.