About question 2: Execute this:
FullForm[Hold[a;]]
You will see that the full form contains a Null
(this is how the input syntax of WL is defined):
HoldForm[CompoundExpression[a,Null]]
And CompoundExpression
returns the last expression (evaluated, but Null
evaluates to Null
).
Null
has been around since the beginning. When I was learning Mathematica and coming from the C & Pascal programming languages, I used to think of Null
as what a procedure returned (void
in C) as opposed to an "actual" value returned by a function (which has to have a type in C). Of course, every WL function returns something. But if you execute a command that returns Null
, you get, as Eric already mentioned, no output in the notebook. That seemed like a "procedure" to me.
Missing[]
was introduced as Mathematica was expanded to handle data and data sets, including curated data like CountryData[]
. Since Missing[]
may have arguments, it allows for more robust handling of data, which has grown in importance since Mathematica began. (By "data sets" I don't mean Dataset
, which was a big step in the evolution of how data is handled and came a while after Missing[]
was introduced.)