Messages can be sent to and received from ports, but these messages must obey the so-called "port protocol." Ports are created with the built-in function open_port. Atoms are used within a program to denote distinguished values. Tuples are containers for a fixed number of Erlang data types. Erlang is a general-purpose, concurrent, functional programming language.