Behaviours define callbacks & protocols define methods without signatures. Modules implementing a protocol should give definition for all those methods. Same for modules using a behaviour. What is the semantic difference?
One difference I can think of is, a protocol can be implemented for a single type only once where as we can implement a behaviour for a module multiple times based on our requirements. I am clear with when to use what. Is there any other difference other than this?
behaviouris deeply connected to OTP applications and therefore to supervision trees which are all about maintaining processes. In Erlang, a behaviour abstracts away common patterns (client-server, state machine etc) so that you don't have to callspawn*and pattern match messages manually (which is error prone). Fred Hebert's online tutorial helped me a lot to understand this: learnyousomeerlang.com/… - toraritte