On Saturday, 24 June 2017 at 05:16:45 UTC, MysticZach wrote:
On Friday, 23 June 2017 at 21:36:07 UTC, Moritz Maxeiner wrote:
Contracts within the DbC paradigm *are* abstractions that do not necessitate any particular implementation.

In practice, though, what must any such implementation actually achieve?
[...]
2. prevent programs in invalid states from continuing

With "program" in this abtract domain meaning the specific computational task that broke the contract, not necessarily the entire implementation domain OS process - it's just that the finest safe termination of computational tasks in the presence of bugs on modern OSs you get for free (because of process isolation) is a process. With a runtime environment (e.g. a VM like the JVM, or an appropriate druntime implementation) that supports safe killing on a finer resolution (e.g. threads and fibers) there's no inherent reason not to map contract violations to thread/fiber killing instead of process killing (if it's proven to be safe within that runtime).

3. provide information about those invalid states after the fact

All it *must* do is identify which contract failed (i.e. (file,line/row,column)). The rest is optional.

It would only couple the contracts with asserts if the DIP also specifies that asserts *must* be used for the lowering (which I would be against btw).

[...]. I'd rather not deal with that problem. It's vastly easier to just put my faith into the `assert` grammar, and hope that any improvements that it needs and receives will apply equally to `assert`s as well.

I would simply copy the current assert grammar into a separate contract grammar, so that further modifications to the assert grammar do not change the new contract grammar. But as I said, it's not important to me, it was just an observation/question. Should the need ever arise for (new) contract and assert grammar to diverge it can be dealt with then by whoever does the diverging.

Reply via email to