<div dir="ltr">Hi Rich,<div class="gmail_extra"><br><div class="gmail_quote">On Mon, May 19, 2014 at 2:57 PM, Rich Neswold <span dir="ltr"><<a href="mailto:rich.neswold@gmail.com" target="_blank">rich.neswold@gmail.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div>On Sat, May 17, 2014 at 10:33 AM, Vlad Dumitrescu <<a href="mailto:vladdu55@gmail.com" target="_blank">vladdu55@gmail.com</a>> wrote:<br>



> I was thinking today (obvious from the number of mails to the list :-) ) and<br>
> was considering how great idea protocol checkers are and wondered why they<br>
> aren't used and popularized more.<br>
<br>
</div>Protocol checkers are wonderful.<br>
<div><br>
> One of the possible reasons is that in order to be able to use them<br>
> everywhere, one has to use a specific architecture: with middleman processes<br>
> in front of every server process. This is somewhat clunky, introducing<br>
> elements that are not related to the application domain. Besides, it makes<br>
> it difficult to add them to existing applications.<br>
<br>
</div>A colleague and I have developed a protocol compiler which takes a<br>
protocol specification file and generates source code to<br>
marshal/unmarshal the messages. It's very similar to Google's protobuf<br>
idea and we seriously considered using their's, but there were some<br>
requirements at Fermilab which it didn't meet, so we rolled our own.<br>
We support C++, Java, Objective-C and Erlang (which are all used in<br>
our Control System) and we also target Python and OCaml (which are<br>
experimental.)<br>
<br>
We don't use middleware: each generator uses the target language's<br>
method of choice to prep an outgoing message. So, for example, the C++<br>
code will write to a stream; the Erlang code builds a binary (which<br>
can then be sent to a socket.); etc.<br>
<br>
The generated code for each target language validates the messages and<br>
will only succeed if every required field is present and is of the<br>
correct type and in range. Handling protocols, before this tool was<br>
created, was tedious and error-prone. Now adding features is a breeze<br>
and we regularly add or refactor protocol messages.<br></blockquote><div><br></div><div>Generating the code for marshalling from a protocol specification is very useful too, but I think it falls short in some areas. </div>


<div><br></div><div>A marshaller is always needed and if it is generated from a higher-level description, it is less prone to errors. However, it is local to the endpoint of the connection and knows only of the messages it handles. In order to make sense of what's happening in a system, one needs to gather information from all these stubs and put it together, which is difficult to do 'live'. </div>


<div><br></div><div>A proxy process knows about all messages going back and forth, their timing and order. It can even hold state and issue warnings/errors right away based on the whole conversation going on. A server process could have a single proxy in front of it, handling all connections from clients, or there could be one proxy per client connection, making it an implementation of channels. The latter is probably more difficult to implement transparently (if possible at all).</div>

<div><br></div><div>regards,<br></div><div>Vlad</div><div><br></div></div></div></div>