Programming components

Joe Armstrong (AL/EAB) joe.armstrong@REDACTED
Mon Aug 29 10:55:08 CEST 2005



Dominic wrote:

> -----Original Message-----
> From: owner-erlang-questions@REDACTED
> [mailto:owner-erlang-questions@REDACTED]On Behalf Of
> erlang-list@REDACTED
> Sent: den 26 augusti 2005 17:50
> To: erlang-questions@REDACTED
> Subject: RE: Programming components
> 
> 
> Hi Joe,
> 
> >> Regarding types, I'm trying to understand what you
> >> find lacking in Erlang, and why you want it.
> >
> > Erlang has no syntax for defining types
> 
> I know, but I'm trying to understand why this is a
> problem. Erlang has no syntax for classes or
> inheritance, either, but last time I heard you thought
> they sucked ;-)
> 
> > Yes Erlang has integers etc. but there is no way to
> > say that the factorial function returns an integer
> >
> > 	I'd like to say
> >
> > 	fac(int()) -> int().
> >
> > 	But this is NOT Erlang
> 
> But that's what I like about Erlang. You get the fun
> out of functional, without the type-obsessive part.

Yes

> 
> >> Apart from development tools, or working around
> >> deficient languages, I can't really think of any
> >> good use for introspection. What do you have in
> >> mind?
> >
> > YES - contract checking. The protocol spec IS a
> > contract to follow some agreed protocol - so we can
> > check it dynamically - to do so we need the spec.
> 
> Ah, I see. It seems to me that /types/ is an
> insufficient ambition for contracts. Wouldn't it be
> more interesting to have Eiffel-like contracts for
> components? I haven't thought about this before, but it
> occurs to me right now that Erlang pattern matching
> would provide a very rich way to express preconditions,
> postconditions and invariants on a component. It would
> be even better than Eiffel!
> 
> > Processes do not have names, in the sense that
> > modules have names.
> 
> Now that's an interesting idea. In practice, it seems
> to me most people tend to have a module for a given
> process, so it's not a great shortcoming. But something
> like your suggested:
> 
> > There no file Foo.pro containing
> >
> > 	-process(foo)
> > 	-protocol(p)
> > 	...
> 
> ... would make the design more clear.

YES

> 
> > And there is not way of specify protocols - "read the
> > code and figure out in which order the messages are
> > sent" is NOT a good reply :-)
> 
> OK, now I see what you mean. I just don't want the
> solution to be base on strict typing...
> 
YES - now you're getting it.

Specifying protocols will make the design clearer.





I want a strictly checkable language-neutral type system to apply at the
boundaries to components. This MUST be a dynamic checker.

	If the spec says

	{"fac", int(1..1000}} => {"result", int()} within 2578 ms

This means that a component MUST compute factorials of integers less than
1000 within 2578 milliseconds.

Suppose you now want to compute factorial 123

Do this:

	Content-Type: text/myXML
	Content-length: NNNN
	<tuple>
	 <str>fac</str>
	 <int>123</int>
	</type>

	When you parse this you MUST get {<<"fac">>, 123}

or this

	Content-Type: text/erlBin
	Content-Length: NNNN
	- a binary -

	When you to binary_to_term on this you MUST get	{<<"fac">>, 123}
	
This can be checked against the spec

Then the system Must reply
	
	Content-length: NNNNN
	Content-Type: text/myXML
	<tuple>
	  <str>result</str>
	   <int>138764893423514 ... whatever</int>
	</tuple>

Or

	Content-lengh: NNNN
	Conent-Type: text/erlBin
	[[ term_to_binary  {<<"result">>, 13827651274 (whatever :-) } ]]

Within 2578 ms

All this must be dynamically checked.

Why?

	1) Proofs might be wrong
	2) Proofs involving timeing are impossible in multi-tasking systems

I want to capture functional and NON-functional behaviour at the interface

	A => B     within Time
	******            ****
	Functional        Non-functional

Type system might give me a handle on the function but but they do not address
the non-function bit

> Cheers,
> 
> Dominic Williams
> http://www.dominicwilliams.net
> 
> ----
> 

/Joe



More information about the erlang-questions mailing list