开始啃 Erlang 程序设计,第二口

原创 2015年07月09日 09:54:46

Erlang 速览,既走马观花式的看看大概

本章要达到的学习目标:老Joe的要求是理解如何运行代码和编译模块,这两点,当然我得再掏出更多相关信息。并通过一个文件服务器的例子展示用Erlang 写多进程程序的优越性。反正确实比C++/C#/Java要方便很多。

                          1.如何运行代码

                          2.编译模块

2.1 Erlang Shell

        linux shell 下输入 erl 既进入 erlang shell  交互式会话中,它支持一种称为 REPL 方式来学习 erlang.

书上说请注意,每一条表达式,都必须以一个句号后接一个空白符结尾。我打了句号直接回车也行。

help(). 查看 erlang shell 中所有能输入的与 shell 相关的命令。

2.2 进程,模块和编译

模块是代码的容器,有两种形式,给人操作的源代码形式,给EVM操作的 抽象码形式。 源代码 --- erlc ---> 抽象码。

模块与进程的关系,就像类与对象的关系。一个是死的一个是活的。我觉得模块主要占内存,进程主要占CPU,两个占的系统资源不同。

进程负责执行模块里的函数。在 erlang shell里执行的情况与在 erlang shell外执行的情况不一样,看我写的第一篇,hello,erlang.

在 erlang shell外运行编译器,是编译erlang代码的首选方式, 因为可以利用 工程构建工具,使用项目自动化构建出来。书上说高级用户喜欢自动编译,对Erlang shell 的使用也会变少。那我得一开始从高手开始。

2.3 你好,并发

用于进程的代码包含在模块里,要创建一个进程, 需要调用spawn,创建进程。Erlang对代码采用一种所谓“尾递归”的优化,意思是此函数的运行空间是固定的。

------- file_server -------

receive 

{Client, list_dir} -> Client ! {erlang:self(), file:list_dir(Dir)};

{Client, {get_file, File}} -> Full = filename:join(Dir, File), Client ! {erlang:self(), file:read_dir(Full)}

end,

这段代码很紧凑,所以很容易忽略所发生的细节。(我反复读了10遍,确实没有多余的部分),抽象的很高的语言。

这段代码有三个要点:1.回复给谁 2. self()的用法 3.模式匹配被用于选择消息

Erlang编译器和运行时会正确推断出如何在收到消息时运行适当的代码。不需要编写任何的 if-then-else或 switch代码来设定该做什么, 这是模式匹配带来的乐趣之一,会为你节省大量工作。c(file_server).后 beam 载入EVM,就等待什么时候被其它进程调用,或自己 spawn 一个进程调用啦。同一个beam 可以 spawn N个进程出来,只要内存够大。

2.3.2 客户端代码

用一个 file_client模块来访问 file_server模块, 这个模块的主要目的是为了隐藏底层通信协议的细节。客户端代码可以通过调用此客户端模块导出的 ls, get_file 函数来传输文件。

------------ file_client.erl -----------------------------

-module(file_client).

-export([ls/1, get_file/1]). % 提供 2个 API供其它地方调用

% 一定要有这个 Server 参数,不然不知道要向哪个进程发消息,这个Server 就是 服务器的PID,向这个进程发消息,才有反应。

ls(Server) ->   %  一个用户接口

Server ! {erlang:self(), list_dir},   % 一定要先发个消息过反,服务器进程收到后匹配上了消息才能回过来,相当于一个激活过程。

receive 

{Server, FileList} -> FileList

end.

get_file(Server, File) -> % 第二个用户接口,第一步也是先要向 服务器进程发个消息,然后再处理接收的消息

Server ! {erlang:self(), {get_file, File}} ->

receive

{Server, Content} -> Content

end.

从Erlang角度看, 如何启动和停止服务器,连接套接字, 从错误中恢复等都是琐碎的细节(以后学到OTP框架自己都处理)。

而问题本质在创建并行进程 ,以及发送和接收消息。

在Erlang里用进程来构建问题的解决方案。思考进程的结构(也就是说哪些进程间相互有关联系),思考进程间传递的消息以及消息包含何种信息是思考和编程方式的中心。


   



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《Erlang 程序设计》练习答案 -- 第八章 顺序编程补遗

% (1).复习这一张关于Mod:module_info()的部分。输入命令dict:module_info()。这个模块返回了多少函数?% (2).code:all_loaded() 命令会返回一个...

Erlang程序设计 笔记

Erlang程序设计 跳转至: 导航、 搜索 目录 1 顺序编程2 并发编程3 分布式编程4 文件编程5 socket编程6 ETS和...
  • cteng
  • cteng
  • 2014-10-31 22:43
  • 1196

《Erlang 程序设计》练习答案 -- 第九章 类型

% (1).编写一些导出单个函数的小模块,以及被导出函数的类型规范。 % 在函数里制造一些类型错误,然后对这些程序运行 dialyzer 并试着理解错误消息。 % 有时候你制造的错误无法被 dialy...

《Erlang 程序设计》练习答案 -- 第七章 二进制型与位语法

% 编写一个函数来反转某个二进制型里的字节顺序-module(reverse_byte). -export([reverse_byte/1]).% 注释为将对象先转化为二进制,然后进行反转。 %rev...

《Erlang 程序设计》练习答案 -- 第十二章 并发编程

% (1).编写一个start(AnAtom, Fun)函数来把spawn(Fun)注册为AnAtom。 % 确保当两个并行的进程同时执行start/2时你的程序也能正确工作。 % 在这种情况下,必须...

《Erlang 程序设计》练习答案 -- 第三章 基本概念

% (1).快速浏览 3.13 节,然后测试并记忆这些行编辑命令在 Erlang shell 中输入 Ctrl + A 行首 Ctrl + D 删除当前字符 Ctrl + E 行尾 Ctrl +...

《Erlang程序设计》——笔记

语法:     1.模式匹配:=表示一个模式匹配操作。Lhs=Rhs实际上是这样一个过程,对右端求值(Rhs),然后将结果与左端(Lhs)进行模式匹配。     2.分号:     逗号(,...

《Erlang程序设计中文版》-读书笔记

读>,只记录容易忘记或自己不懂的内容。 Chapter 2  变量可以16进制和32进制记号:16#cafe、32#sugar

《Erlang 程序设计》练习答案 -- 第十三章 并发程序中的错误

% (1).编写一个 my_spawn(Mod, Func, Args) 函数。它的行为类似 spawn(Mod, Func, Args), % 但有一点区别。如果分裂出的进程挂了,就应打印出一个消息...

《Erlang 程序设计》练习答案 -- 第六章 顺序程序的错误处理

% (1).file:read_file(File) 会返回 {ok, Bin} 或者 {error, Why}, % 其中 File 是文件名, Bin 则包含了文件的内容。请编写一个 % myfi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)