I was surprised when I ran the following code in my editor:
As it can be easily see
That is because the semicolon is not a symbol to terminate a statement.
It looks like that because it occurs almost always at the end of a statement.
Note the almost always... could be a hint.
Trying to get rid of the asymmetry, we can say it is always between statements!
That leads directly to the real meaning of the semicolon: it does not terminate statements - it separates statements.
Obviously, after the last statement, there is nothing to separate.
(Most languages allow a semicolon at the end of a block anyway, to prevent the related trivial errors. It can be done by discarding the semicolon, or, more explicit, by inserting a command that does nothing after the semicolon. )