One line of thinking that intersects a lot of my interests (how to build new math, diagramming, and logic theories) involves what visualization apps are (mathematically-speaking), some favorite topics from Linguistics, Mathematical Logic, and Philosophy.
Generally, languages have multiple parts:
i. How symbols turn into expressions is called a grammar (well-formed formulae in mathematics).
ii. People often fixate on symbols while ignoring expressions. Visualization or text-editing apps import or load various letters, symbols, number marks, and so on using common standards like Unicode and ASCII. Symbols, by themselves, are merely random markings.
They must be combined according to specific rules (concatenated) to make acceptable and even meaningful expressions (invalid syntax or grammar rules out many kinds of expressions from bearing meaning).
iii. Text editing apps provide a collection of symbols (whether shapes, letters, characters, and so on). It's up to the creator (the writer, designer, or programmer) to combine these basic linguistics primitives to form meaningful units of expression (morphemes, memes, expressions).
iv. I mentioned this here and it's worth repeating: text editors and visualization apps have value because they are top-level metalanguages (as a matter of mathematical definition). Their value comes from the fact that we create object languages out of the supplied, imported, or customary visual or linguistic vocabularies.
i. The assignment of meaning is called giving a semantics and is often done by fiat, rule, decree, declaration, or stipulation.
ii. Meaning is often defined by context (loosely: who, where, when, why, how) and pragmatics (accepted social conventions).
iii. Visualization tools and text-editing apps provide the vocabulary for creators to define their own meaning.
i. For example, social conventions might dictate that one expression is grammatically valid but not acceptable for "polite company".
ii. In programming, we rely on peer review to alter, update, improve, delete, or otherwise modify existing code bases (programs written in various languages). For example, this typically involves adhering to certain stylistic norms, consulting with peers, getting manager approval to merge a Pull Request into a specific development branch, etc. These speech acts all fall under the general umbrella of pragmatics.
iii. Reasoning to the intended meaning of an expression or utterance is called implicature. We use this ability all the time (to detect sarcasm, disambiguate expressions, or "get the hint").
iv. Standards, specifications, or protocols like ASCII, HTTP, and Unicode also represent consensus-making for coordinating the implementation of symbols, communication, and procedures. Norms, practices, and standards that intersect language (and programming) all broadly fall under pragmatics.
Language also involves a host of other concepts including morphemes (common meaning units of words), etymology (the history of words and their uses), translation (the relationships of meanings between expressions or words in multiple languages), phonemes (common sound blocks), rhetoric (persuasion and debate), reading, writing, speaking, listening, and so on.
Tarski coined this distinction in his attempt to address the Liar Paradox. Unlike Russell, who wanted to address the Semantic Paradoxes (as a whole, including the Liar Paradox) by defining linguistic Types and specifying the exact conditions under which these could be built out of each other (or used in general inference-making), Tarski wanted to draw more careful distinctions between the languages we use to talk about another language.
i. Just because those three languages were written does not imply that their creators wrote or created all the others that are (or were originally) written in them or that compile to them (or did). It took decades of development to create Java, C#, Ruby, Python, etc.
ii. Some of those object languages even added to the top-level metalanguage using the top-level vocabulary and libraries but adding something that didn't exist before (like Generics, Abstract Classes, Interfaces, generic Pragmas/Guards, various data structures, and so on). Those were non-trivial enhancements.
iii. The relationship between metalanguages and object languages is made fairly clear when we consider the relationship between writing, say, Java in C (Java was originally written in C then the rest of Java was rewritten in Java). Java was the object language and C the metalanguage Java was constructed out of.
Special thanks to the great folks at Draw.io! They make one of the best and easiest visualization tools out there.