[erlang-questions] Looking for tricky protocol examples for verification research
zxq9
zxq9@REDACTED
Fri Oct 31 17:20:04 CET 2014
On 2014年10月31日 金曜日 11:14:15 you wrote:
> On Fri, Oct 31, 2014 at 12:47 AM, zxq9 <zxq9@REDACTED> wrote:
> > In other words, you want to define a contractual way that different
> > processes
> > can verify the external behavior of one another, instead of doing the
> > actor
> > version of duck typing that we tend to use all the time?
>
> It wouldn't be so much the processes verifying each other, but some
> overarching part of the runtime, or perhaps an analysis tool that verifies
> the "contract" for each process. Think of a type system: the type checker
> verifies that every function has the right type, and then a programmer who
> uses the function can be confident that the result of the function will be
> what they expect. I'm not saying I want to invent a type system, but I want
> to enable a similar style of reasoning for concurrent programs, where a
> programmer can just assume that another process acts in a certain way
> because that behavior is checked by another mechanism. Contracts in Racket (
> http://docs.racket-lang.org/guide/contracts.html) also enable this kind of
> reasoning, although with enforcement happening at run-time.
>
> I'm not sure what you mean by the "actor version" of duck typing, though.
> Could you expand on that, or point me towards an example?
In a duck typed language like Python we can treat anything as some type if it
implements the basic methods expected of that type. An outside process doesn't
need to care (sure we could introspect, but needing to is usually regarded as
a sign of using the wrong tool).
Erlang processes can be thought of the same way if we accept that in Erlang
"process" means something much closer to what languages like Python mean by
"object" than is commonly imagined. If I have a game character process it
might have an AI controller, or it might have a player controller. The
character process doesn't need to know or care, and we could actively swap out
AI for player control on the fly and the character process wouldn't care, so
long as all controllers, regardless of subtype (if we decide to use this term
"type"), adhere to the "controller" protocol.
Erlang lacks inheritance, so this talk of types is often limited to mean "a
particular sort of Erlang term()", but in some sense protocol definitions are
interface definitions that parallel duck typing very closely. This is true of
any network API as well, actually, hence the loose coupling enjoyed by network
components that communicate via bland protocols (as opposed to overly rich
ones nobody bothers to implement).
I think the main issue here is that most protocols internal to Erlang programs
are informally specified, if at all. The closest thing I see to a contract
system governing message protocols is Erlang behavior definitions. Come to
think of it, Erlang behavior definitions might be a good place look for
inspiration with regard to a message protocol contract system. They mandate
callback function definitions, but those callback functions are required to
adhere to certain protocol expectations which are handled directly
(received/emitted) by functions defined in the governing module of the
behavior.
These modules could be seen as describing (but not defining on their own) a
message protocol that could be enforced by contract. Properly -spec'd
functions would contain the information needed in most cases, but there are
probably some weird edges there. The only ones necessary to evaluate would be
the ones mandated by the behavior module (in practice that is mostly true, but
this is not explicit -- it is not necessary that everything demanded by a
behavior be ultimately message related).
Blah. I wrote this thinking through it as I typed, so there's almost certainly
something ridiculous up there. But basically it should be possible to extend
behaviors or add something very similar to them that would do what you want.
The problem is that the compiler will care but not the runtime, and this is a
very different problem.
-Craig
More information about the erlang-questions
mailing list