Let's say you have a programming language C, and a programming language C+.
Every valid C program is a valid C+ program, but not the other way around.
There can be at least two ways in which this happens:
1. C+ is "stricter" than C, but the strictness is optional: you can e.g. add type signatures that don't exist in C.
2. C+ is more "featureful" than C. E.g. it adds generics or whatever.
Is there a way to distinguish those two rigorously? Or is there no underlying deep difference?
Hm, that's not quite what I'm looking for. In this hypothetical, I guess I want to have some method of just taking the valid programs for C and C+ and then spitting out a 1 if C+ is stricter, and a 0 if C+ is more featureful. Like, what is the mathematical definition of those conditions?
@niplav Oh, I misunderstood and parsed "those two" as C or C+, not the two possible differences.
"Featureful" sounds sufficiently general to cover "stricter", so I'd *guess* there's no deep difference, but not with much confidence.
@niplav most strictness guarantees happen at compile time, and most features happen at runtime. These are not _quite_ the same thing, but might be a useful enough proxy for a first pass.
@niplav Run a C+ compiler on your program? Wouldn't that distinguish the two as rigorously as possible?