Questions and discussion on UBF

Joe Armstrong joe@REDACTED
Tue Apr 29 10:05:59 CEST 2003

I think the answer to most of these questions has to do with complexity.

  At the outset  I wanted things to be *as simple  as possible* - that
why things  are as they are. If  you want more complexity  I think you
should layer them on top of the existing infratructure.


On Mon, 28 Apr 2003, Fabien Dagnat wrote:

> Hello,
> As I am working on using contracts on component (or service, if one 
> prefer) oriented specifications, I'm looking at UBF.
> I'm asking myself why allowing any type for messages in the contracts. I 
> know that this is linked with the fact that in Erlang a message may be 
> of any type. But:
>    - a programming rule specifies that all messages should be tagged.
>    - as a "universal" format, it should conform to other language
>      culture too.
> Indeed, in a more abstract view (than erlang usual one), it would be 
> "better" to name (give a tag) messages (from a specification point of 
> view). Combined with some (yet to completly implement) type system, it 
> would perhaps be possible to ensure that a server respect its contracts...
> My second question is why just allowing named type in the automaton 
> description.
> More precisely why not having something like:
> +STATE start
>         ls            => files()     & start;
>         {get, file()} => binary()    & start
> 		     | noSuchFile() & stop.
> Is there any technical (or philosophical) limitation that I haven't 
> thougth of? I think it would save type definitions and help reading the 
> automaton (without always shifting to type definitions to remember what 
> are the message types). I know that the current syntax is similar in 
> this point to the message definition in WSDL, but I don't see WSDL as a 
> panacea of XML encoding of interfaces.
> Next, to go back to my point on universality. Why not having:
> +STATE start
>         ls()                 => files()     & start;
>         get(file : string()) => binary()    & start
> 		            | noSuchFile() & stop.
> My point here is that I would like to add to the contract some pre and 
> post conditions and to do this usually we have to refer to some 
> arguments of the message. Furthermore, to do this, I would like to add 
> some state variables to the state.
> For exemple, a bank account contract could be:
> +STATE start
>    open() => ok() & created.
> +STATE created
>    deposit(sum : int()) => ok() & credit(sum).
> +STATE credit(balance : int())
>    deposit(sum : int())  => if (sum > 0) ok() & credit(balance + sum);
>    withdraw(sum : int()) => if (sum <= balance) ok() & credit(balance - 
> sum);
>    balance()             => {ok, sum} with sum = balance & credit(balance).
> I don't advocate that this is a great example of the interest of pre 
> and post conditions. But, I think it is sufficiently interesting to 
> illustrates what I was thinking of.
> It is clear that this way of thinking contracts embed a lot more 
> (behavioral) semantics that the current UBF. Indeed, it shift some part 
> of the server state to the "contract checker". But, it could gave some 
> interesting property like the fact that the "contract checker" could use 
> several servers giving them the needed state with the message (we would 
> get some fault tolerance or some load balancing capacity).
> Finally, why not allowing a return state in the ANYSTATE declaration. 
> Suppose, I would like to have a stop message available in all states 
> that brings the server in a stopped state. For example,
> +STATE stopped
>    start() => ok() & s1.
> +STATE s1
>    ...
> +STATE s2
>    ...
>    stop() => ok() & stopped.
> Thanks in advance for any answer, opinion, criticism...
> Fabien

More information about the erlang-questions mailing list