I assume that, by definition, a language is a set of finite strings.
The first distinction to be made is between operational and
denotational concepts.
Denotational definition of a language is a precise specification of
the language through various (a priori) non computational mathematical
devices such as, for example:
a specification with a property of strings that characterise the
strings of the language. $\{ x^n \mid n$ is a prime integer$\}$
an algebraic characterisation from other languages and strings:
$L= (L_1 \cup L_2).abac$ where $L_1$ and $L_2$ are languages already defined. Note that $abac$ may also be viewed as a language with a single string. Regular expressions are an example of
such a definition, when they are interpreted as defining regular languages.
(Discussion of their pragmatic use for string matching in programming languages, under the name of Regex or Regexp, would require a specific presentation).
a system of language equations, of which the relevant language is a
solution with specific properties, for example the smallest
solution, if that is well defined. An example of such an equation is $A = A B a$ where $a$ is a symbol, and $A, B$ are variables ranging on languages over an alphabet containing $a$. A pair of languages $(\hat A,\hat B)$ is a solution if $\hat A$ is equal to the concatenation of itself with $\hat B$ and a final symbol $a$
any mix of the above
Then operational concepts give you ways of answering algorithmic
questions about the language or performing algorithmic tasks related to the language.
Among these operational concepts, two are classical ones:
if you are given a string, can you decide whether it is in the
language or not. Such an algorithm providing a decision procedure
is a recognizer.
can you enumerate all the strings in the language. If such an
algorithm exists, the language is said to be recursively
enumerable. There are many other names. Such an enumeration
algorithm is a generator of the language.
A generator provides a semi-decision procedure that can tell you
whether a string is in the language, but may not terminate if it is
not in the language.
A recogniser can always be used to have a generator (assuming your alphabet is denumerable, which is a general assumption in operational definitions). You just enumerate all the strings on the alphabet, and use the recognizer to determine whether it is in the language.
Both a generator or a recognizer may be used to define a language, operationally.
It is often the case that several "views" or "definitions" of the same language have to be used. It is then essential to prove consistency of the different views, to establish that they do define the same language. Very often, general theorems will provide that. For example, there are theorems that establish that some Context-Free recognizer building techniques (e.g., LR(k)) are consistent with the generator view of the CF grammars.
The same formalism may sometimes be read as fitting any of the above
concepts.
For example, a context-free grammar define the language as a
the smallest solution to a system of language equations.
It may also be read as a string rewriting system that can generate the
language.
And it can be used in a fairly direct way to decide whether a string
belongs to the language (without building any specific pushdown machine).
Note that there are many other thing one may want to do with a language, such as associating a structure with strings (e.g., parse-tree, or derivation tree, which need not be the same, depending on the kind of grammar considered). One may also want to associate semantics with the strings. But that is yet another type of problems, which may be very dependent of the kind of language considered.
Note following a remark by user @Vor. It seems that the concept of recognition,
and probably of recognizer, is not the same in various sub-communities of the field.
Two articles of Wikipedia seem to have differing views on this:
It is not exactly the same use of the concept of recognition, applied in one case to a string and in the other to the language. Nevertheless, it seems that the terminology is somewhat inconsistent.