From 42a0387e886ddbf60b0e2cb977758e2ca74954ae Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= The OTP Design Principles is a set of principles for how
- to structure Erlang code in terms of processes, modules and
- directories. The OTP design principles define how to
+ structure Erlang code in terms of processes, modules,
+ and directories. A basic concept in Erlang/OTP is the supervision tree.
This is a process structuring model based on the idea of
- workers and supervisors.
In the following figure, square boxes represents supervisors and + circles represent workers:
In the figure above, square boxes represents supervisors and - circles represent workers.
In a supervision tree, many of the processes have similar structures, they follow similar patterns. For example, - the supervisors are very similar in structure. The only difference - between them is which child processes they supervise. Also, many - of the workers are servers in a server-client relation, finite - state machines, or event handlers such as error loggers.
+ the supervisors are similar in structure. The only difference + between them is which child processes they supervise. Many + of the workers are servers in a server-client relation, + finite-state machines, or event handlers such as error loggers.Behaviours are formalizations of these common patterns. The idea is to divide the code for a process in a generic part - (a behaviour module) and a specific part (a callback module).
+ (a behaviour module) and a specific part (a + callback module).The behaviour module is part of Erlang/OTP. To implement a process such as a supervisor, the user only has to implement - the callback module which should export a pre-defined set of + the callback module which is to export a pre-defined set of functions, the callback functions.
-An example to illustrate how code can be divided into a generic - and a specific part: Consider the following code (written in +
The following example illustrate how code can be divided into a
+ generic and a specific part. Consider the following code (written in
plain Erlang) for a simple server, which keeps track of a number
of "channels". Other processes can allocate and free the channels
by calling the functions
and a callback module
And a callback module
-module(ch2).
-export([start/0]).
@@ -173,27 +175,27 @@ handle_call(alloc, Chs) ->
handle_cast({free, Ch}, Chs) ->
free(Ch, Chs). % => Chs2
- Note the following:
+Notice the following:
(In
In
channels() ->
{_Allocated = [], _Free = lists:seq(1,100)}.
@@ -208,30 +210,30 @@ free(Ch, {Alloc, Free} = Channels) ->
false ->
Channels
end.
- Code written without making use of behaviours may be more - efficient, but the increased efficiency will be at the expense of +
Code written without using behaviours can be more + efficient, but the increased efficiency is at the expense of generality. The ability to manage all applications in the system - in a consistent manner is very important.
+ in a consistent manner is important.Using behaviours also makes it easier to read and understand - code written by other programmers. Ad hoc programming structures, + code written by other programmers. Improvised programming structures, while possibly more efficient, are always more difficult to understand.
-The module
The
The standard Erlang/OTP behaviours are:
-For implementing the server of a client-server relation
For implementing finite-state machines
For implementing event handling functionality
For implementing a supervisor in a supervision tree
The compiler understands the module attribute
-module(chs3).
-behaviour(gen_server).
@@ -248,13 +250,17 @@ free(Ch, {Alloc, Free} = Channels) ->
some specific functionality. Components are with Erlang/OTP
terminology called applications. Examples of Erlang/OTP
applications are Mnesia, which has everything needed for
- programming database services, and Debugger which is used to
- debug Erlang programs. The minimal system based on Erlang/OTP
- consists of the applications Kernel and STDLIB.
+ programming database services, and Debugger, which is used
+ to debug Erlang programs. The minimal system based on Erlang/OTP
+ consists of the following two applications:
+
+ - Kernel - Functionality necessary to run Erlang
+ - STDLIB - Erlang standard libraries
+
The application concept applies both to program structure
(processes) and directory structure (modules).
- The simplest kind of application does not have any processes,
- but consists of a collection of functional modules. Such an
+
The simplest applications do not have any processes,
+ but consist of a collection of functional modules. Such an
application is called a library application. An example
of a library application is STDLIB.
An application with processes is easiest implemented as a
@@ -266,12 +272,11 @@ free(Ch, {Alloc, Free} = Channels) ->
Releases
A release is a complete system made out from a subset of
- the Erlang/OTP applications and a set of user-specific
- applications.
+ Erlang/OTP applications and a set of user-specific applications.
How to program releases is described in
Releases .
How to install a release in a target environment is described
- in the chapter about Target Systems in System Principles.
+ in the section about target systems in Section 2 System Principles.