# Programación en Erlang/Características específicas del lenguaje
### Constructores de Alto Nivel

Erlang es un lenguaje declarativo. Los Lenguajes declarativos trabajan sobre el principio de tratar para describir lo que debe ser computado, en lugar de decir cómo se calcula este valor. Una definición de función-particularmente uno que utiliza un patrón de coincidencia (pattern matching) para seleccionar entre diferentes casos, y para extraer los componentes de las estructuras complejas de datos, leerán como un set de ecuaciones.

### Procesos concurrentes y paso de mensaje

Concurrencia en Erlang es fundamental para su éxito. En lugar de proporcionar hilos de que comparten memoria, cada proceso de Erlang se ejecuta en su propio espacio de memoria y en su propia heap y stack. Los procesos no pueden interferir unos con otros sin darse cuenta, al igual que todos es fácil en modelado de hilos, dando lugar a bloqueos y otros horrores.
Los procesos se comunican entre sí mediante el paso de mensajes, donde el mensaje puede ser cualquier valor de dato Erlang en absoluto. El paso de mensajes es asincrónica, por lo que una vez que se envía un mensaje, el proceso puede continuar procesando. Los mensajes se recuperan del proceso de buzón de correo selectivamente, por lo que no es necesario procesar los mensajes en el orden en que se reciben. Esto hace que la concurrencia de más robusta, en particular cuando los procesos son distribuidos a través de diferentes equipos y el orden en que se reciben los mensajes dependerá de las condiciones de ambiente la red. La Figura 1-1 muestra un ejemplo, donde un "servidor de la zona" procesa calcular áreas de formas para un cliente.

### Escalable, segura y concurrencia eficiente

La Concurrencia de Erlang es rápida y escalable. Sus procesos son de peso ligero en el que la máquina virtual de Erlang no crea un subproceso de sistema operativo para cada proceso creado. Se crean, programado, y manipulados en la máquina virtual, independiente del sistema operativo subyacente. Como resultado, el tiempo de proceso de creación es del orden de microsegundos e independiente del número de procesos existentes simultáneamente. Los procesos de Erlang se comunican entre sí a través del paso de mensajes. A pesar de del número de procesos concurrentes en el sistema, el intercambio de mensajes dentro de la sistema le toma microsegundos. Todo lo que está involucrado en el paso de mensajes es la copia de los datos del espacio de memoria de un proceso hacia el espacio de memoria del otro, todo dentro de la misma máquina virtual.

### Propiedades livianas en tiempo real

A pesar de que Erlang es un lenguaje de alto nivel, se puede usar para tareas con limitaciones livianas en tiempo real. La gestión del almacenamiento en Erlang es automatizado, con la recolección de basura en práctica en función de cada proceso. Esto le da al sistema un tiempo de respuesta en el orden de milisegundos, incluso en la presencia de basura recolectada en la memoria. Debido a esto, Erlang puede manejar grandes cargas sin degradación en el rendimiento, incluso durante los picos de sostenido.

### Robustez

¿Cómo se construye un sistema robusto? Aunque Erlang no puede resolver todos sus problemas, facilitará en gran medida su tarea en una fracción del esfuerzo de otros lenguages de programación. Gracias a una serie de simples pero potentes mecanismos de control de errores y del seguimiento de los constructores de excepciones, una biblioteca de módulos muy general se han construido, diseñado con robustez en su núcleo. Al programar para el caso correcto y dejando que estas bibliotecas manejen los errores, no sólo son programas más cortos y fáciles de entender, pero usualmente contienen menos errores.

### Coincidencia de patrones (Pattern Matching)

Coincidencia de patrones en Erlang se usa para:
* Asigna valores a las variables
* Control del flujo de ejecución de los programas
* Extraer valores de tipos de datos compuestos
La combinación de estas características permite escribir conciso, legible y potente
Pattern = Expression
Y como dijimos antes, es una generalización de lo que ya vimos cuando hablamos acerca de las variables. El patrón se compone de estructuras de datos que puede contener tanto variables dependientes y no dependientes, así como valores literales (como los átomos, enteros o cadenas). Una variable de la dependiente es una variable que ya tiene un valor, y una variable independiente es una que todavía no depende de un valor. Ejemplos de patrones incluyen:
Double {Double, 34} {Double, Double} [true, Double, 23, {34, Treble}]
La expresión se compone de estructuras de datos, variables dependientes, operaciones matemáticas, y llamadas a funciones. No puede contener valores independientes.
¿Qué sucede cuando se realiza una comparación de patrones? Dos resultados posibles:
* El patrón de concordancia puede tener éxito, y esto resulta en las variables independientes se convierten en dependientes (y el valor de la expresión que se retorna).
* El patrón de concordancia pueden fallar, y ninguna variable se convierte en dependiente como consecuencia de ello.