Erlang之自我见解

关于Erlang

Erlang是一门函数式编程语言。Erlang是瑞典电话公司爱立信于1987年左右开发的一种功能语言。Erlang以来自丹麦的数学家,统计学家和工程师Agner Krarup Erlang命名。Erlang也是一个国际单位(缩写为Erl),表示通信中的数据流量(流量)。

Erlang的功能如下:

  • 功能类型
  • 单一替代
  • 模式匹配
  • 动态类型
  • 过程
  • 容错

单一替代

Erlang变量只能分配一次。尝试多次分配给同一个变量将导致错误。这意味着无法编写常规循环等。事实上,在Erlang中,已使用递归或更高阶函数实现了一种循环。

Erlang变量应该以所有大写字母或下划线(_)开头。

动态类型

Erlang没有静态类型。

功能类型

Erlang是一种功能语言。

  • 没有条件
  • 作为第一类对象
  • 高阶函数编程

过程

该过程与OS管理的过程不同。在其他语言中,它是在单个OS级别进程中执行的多个执行的流程,例如“线程”。但是,由于Erlang中既没有全局变量也没有可重写对象,因此这些控制流之间没有共享状态。这种共享状态是分离线程和进程的一个重要因素,并且声称Erlang是一个“进程”,只是它没有共享状态。

在进程之间没有共享状态也意味着进程不必局限于单个OS进程。Erlang进程可以存在于多个OS进程中,并支持分布式处理。

Erlang中的进程间通信由“消息”完成。可以使用任何Erlang值作为消息。消息由“!”运算符发送,并使用receive语句接收消息。

消息发送示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-module(pingpong).
-export([start/0, ping/2, pong/0]).

ping(0, Pong_PID) ->
Pong_PID ! finished,
io:format("ping finished~n", []);

ping(N, Pong_PID) ->
Pong_PID ! {ping, self()},
receive
pong ->
io:format("Ping received pong~n", [])
end,
ping(N - 1, Pong_PID).

pong() ->
receive
finished ->
io:format("Pong finished~n", []);
{ping, Ping_PID} ->
io:format("Pong received ping~n", []),
Ping_PID ! pong,
pong()
end.

start() ->
Pong_PID = spawn(pingpong, pong, []),
spawn(pingpong, ping, [3, Pong_PID]).

容错

由于Erlang是一种最初设计用于需要可靠性的电话交换机等环境的编程语言,因此它的设计使错误不会停止整个程序的运行。进程中发生的异常仅停止该进程并启动调试器。然后,可以在继续之前修改程序并重新加载模块。