Erlang(一)基本概念

文档

erlang基础

性能

可扩展性

容错性

清晰性

并发程序,并行计算机

编程语言有两种:顺序和并发

并发性由Erlang虚拟机提供,而非操作系统或任何外部库

=操作符

Erlang是一种函数式编程语言,模式匹配操作符,而不是一个赋值操作符 Erlang的变量只能赋值一次,一旦值被绑定,就不能改变 定义X=12改变的是地址X处的内存值

变量和原子语法

Erlang的变量以大写开头 小写字母开头的不是变量,而是符号常量,称为原子(atom)

函数式语言中变量不能改变,命令式语言可以

进程、编译和模块

-module (hello).
-export ([start/0]).

start() ->
     io:format("hello world~n").

Erlang内编译
c(hello).
hello:start().
halt().

hello.beam
hello.erl

Erlang外编译,erlc编译器是Erlang编译的首选方式

erlc hello.erl
erl -noshell -s hello start -s init stop 

加载了hello模块并执行hello:start函数,随后执行init:stop函数

Erlang的基本并发单元是进程(Process)

一个进程是一个轻量级的虚拟机,只能通过发送和接受消息来与其他进程通信 要创建一个进程,需要调用spawn,用于进程的代码包含在模块内

-module (afile_server). %%模块
-export ([start/1, loop/1]). %%可调用的函数/参数

start(Dir) -> spawn(afile_server, loop, [Dir]). %%进程

loop(Dir) ->
%% 等待指令 
     receiver
          {Client, list_dir} ->
               %% 做点什么
               Client ! {self(), file:list_dir(Dir)};
          {Client, get_file, File} ->    
               Full = filename:join(Dirm, File),
               Client ! {self(), file:read_file(Full)};
     end,
     loop(Dir).

Erlang编写无限循环的方法。变量Dir包含了文件服务器当前的工作目录,循环内等待指令,执行后再次调用自身继续下一个指令

Erlang对代码采用了一种所谓“尾部调用”的优化,此函数的运行空间是固定的。

loop函数永远不会返回

Client是发送请求进程的标识符

self(),服务器进程的标识符

模式匹配用于选择消息

在接受消息时运行正确的代码,不用编写任何的if else或者switch

基本概念

1、启动和停止erlang shell

Ctrl + C接a

q(). %%受控方式停止系统,是init:stop在shell中的别名

2、注释: %是注释的起点

不能在shell里输入附注,附注指以连字符开头的(-module -export)

Erlang可以用任意长度的整数执行整数运算。整数运算是精确的,不会溢出或者无法用特定字长来表示某个整数。

3、变量

当关联一个值和变量时,就是一种断言。这个变量具有该值,不会改变,不能被赋予其他值。(类似常量)

X=12345.
X.
X=1234(报错)

X不是一个变量

=不是赋值,是模式匹配操作符

Erlang的变量是一次性赋值变量。

X出现在不同函数里,X值是不相干的。

f()可以让shell忘记现有的任何绑定。使用这个命令之后,所有变量都会变成未绑定状态。

4、变量绑定和模式匹配

没有副作用意味着可以让程序并行

可以修改的内存区域叫可变状态

Erlang是函数式编程语言,具有不可变状态,没有内存共享,没有锁

Erlang变量是对某个值的引用,用指针代表绑定变量,指向一个包含值的存储区。这个值不能被修改。

5、浮点数

4/2
2.0(浮点数)
5 div 3
1(整数)
5 rem 3
2(整数)余数

6、原子

原子被用于表示常量值

原子是全局性的,不需要宏定义或者包含文件就能实现

原子以小写字母开头,接字母,数字,下划线或@

可以放在单引号内,引号形式可创建大写字母开头或包含数字、字母之外字符的原子

双引号用于给字符串字面量定界(单引号和双引号不能互用)

一个原子的值就是本身

7、元组

创建元组是用{}括起来,用,分隔。

{joy,18}

Erlang没有类型声明

P={10, 45}

创建一个元组绑定到P变量上

元组可以嵌套

Person={person,{name,joy},{height,1.82}}

元组会在声明时创建,不再使用时销毁。

Erlang使用一个垃圾收集器来回收所有未使用的内存,这样就不必担心内存分配问题

构建元组时使用变量,新的元组会共享变量所引用数据结构的值

不能使用未定义的变量创建元组

提取元组的值

Point = {point, 10, 45}

提取

{point, X, Y} =Point
X.
10
Y.
45

等号两侧的元组必须有相同数量的元素

同一模式里的_不必绑定相同的值

Person={person,{name,joy,arm},{footsize,42}}
{_,{_,who,_},{_,_}} = Person
who.
joy

8、列表

列表被用来存放任意数量的事物,用[]括起来,用逗号分隔

列表的第一个元素成为列表头,剩下的是列表尾

定义列表

[]空列表,T是一个列表,[H|T]也是一个列表,都是H,尾是T

ThingsToBuy = [{apples,6},{pear,6},{milk,3}]
ThingsToBuy1 = [{orange,1},{newpaper,2}| ThingsToBug]
ThingsToBuy1.
 [{orange,1},{newpaper,2},{apples,6},{pear,6},{milk,3}]

提取列表元素

用模式匹配操作来提取某个列表里的元素

[X|Y] = L

9、字符串

Erlang里没有字符串。

要表示字符串,一个由整数组成的列表或者一个二进制型。

当字符串表示为一个整数列表时,列表里的每个元素都表示一个Unicode代码点

可以用字符串字面量创建一个列表

Name="hello"(必须是双引号)

“hello”是列表的简写,包含了代表字符串里各个字符的整数字符代码。

如果将整数列表打印成整数,使用格式化写语句

X=[97,98,99].
"abc"
io:format("~w~n",["abc"]).
[97,98,99]
erlang9