standard. Atoms are constant literals. It is like enumeration types in other languages.
In the Erlang VM there is a global table storing actual values or literals of all the atoms
used in the system, and atoms are indices to the table in fact. There is no separate
Boolean type. Instead, the atoms true and false are used with Boolean operators. Since
Erlang is a functional programming language, a function can be considered as a type of
data. Functions can be passed as arguments to other functions, or can be results of other
functions. They also can be stored in composite data structures such as tuples and lists,
or sent in messages. A binary is a reference to a chunk of raw, untyped memory, or a
stream of ones or zeros. It is an efficient way of storing or transferring large amounts of
data. Because other data types are heavily tagged [2][33], which means in the internal
representations there are extra tags indicating the types of data objects. For example,
each integer has a tag. With binary, less tag overhead is introduced. A binary can be
manipulated on bit level. It’s a good way to implement messages or packets of com-
munication protocols like HTTP. References are unique values generated on a node,
and can be used to label and identify messages. Process and port identifiers represent
different processes and ports.
Erlang ports are used to pass binary messages between Erlang nodes and external
programs which may be written in other programming languages, such as C and Java.
An external program runs in a separate OS process, and is connected to a port via
pipes
6
on Linux. In an Erlang node, a port behaves like a process. For each port, there
is an Erlang process, named connected process, responsible for coordinating all the
messages passing through that port.
Erlang’s composite data types are tuples, lists and records. Tuples and lists are
used to store a collection of items. Items are data values that can be of any valid Erlang
types. The difference between tuples and lists is that they are processed differently. We
can only extract particular elements from a tuple. But lists can be split and combined.
Especially, a non-empty list can be broken into a head, the first element in the list, and
a tail, a list that contains all the remaining items. Characters and strings are not formal
data types in Erlang. They are represented by integers and lists of integers respectively.
Record is similar to structure in C programming language. It is a data structure with a
fixed number of fields. Fields have names and can be accessed by their names, while
in tuples, fields (items) are accessed by positions.
Erlang programs consist of modules, each of which contains a number of related
functions. Functions can be called from other modules if they are explicitly exported.
A function can include several clauses, and a clause is chosen to execute at runtime
by pattern matching according to the argument passed. Erlang doesn’t provide loop
constructs, so that loops are built with recursive function calls. To reduce stack con-
sumption, tail call optimization is implemented. A new stack frame is not allocated
when the last statement of a function is a call to itself.
The Erlang language is concise, but it has a large set of built-in functions (BIFs).
In particular, the OTP middleware provides a library of standard solutions for building
telecommunication applications, such as a real-time database, servers, state machines,
and communication protocols.
6
Pipe is used to communicate with a process by reading from or writing to associated file descriptors.
12