Language, like “religion” or “poetry” and many other such abstract words, has fuzzy borders revealing its construed nature. In the above diagram I illustrated the components of language. Toying with any of these components makes one person’s language different from the next. But as for how we should classify these resulting different languages is complicated. In the diagram below, I put the above components in the right column, then I put terms used to describe different language variants in the left column.
Changes in vocabulary can be a form of “slang” (an alternative word) or “jargon” (a technical term). Change prosody in a language and you get an “accent”. These sub-classifications are easy to understand. But get enough difference in vocabulary and accent and you’ll get another dialect or language. Change grammar and almost inevitably you get another language. But the definition border is fuzzy — see this wiki article on “dialect continuum“.
“Mutual Intelligiblity” is a major decision in classifying languages: when two speakers can not understand each other, they are said to speak different languages. But this is not a clear line. It is unclear exactly how much of the other language should be unintelligible before it counts as a different language and not a dialect. And further, we have the problem that sometimes person A can understand person B’s language but not visa versa.
Heck, some call their languages different from their neighbors simply due to national identity or ethnicity, even though they are essentially the same. Examples: Bosnian, Serbian and Croatian (all of the Shtokavian dialect).
Similarly, though essentially mutually understandable, the difference of scripts will be enough for speakers to insist that they have different languages and not different dialects. Examples: Hindi (Devanagari script) vs. Urdu (Arabic script)