开始啃 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 程序设计,第一口

《Erlang 程序设计》看了下价,89。大书店里买的也不能还价。版权声明上,源版是 2013年,简体中文版本 2014年出来的。然后 是 Joe Armstrong 的一段话: 这个世界是并行的。...
  • chrome_lee
  • chrome_lee
  • 2015年07月07日 09:55
  • 240

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

% (1).复习这一张关于Mod:module_info()的部分。输入命令dict:module_info()。这个模块返回了多少函数?% (2).code:all_loaded() 命令会返回一个...
  • wwh578867817
  • wwh578867817
  • 2015年11月16日 15:58
  • 616

初学《Erlang程序设计》两周感想

Erlang初识
  • Nassue_sn
  • Nassue_sn
  • 2016年11月14日 10:04
  • 1202

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

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

lua程序设计第二版 读书笔记(9-10章)

书本下载地址                       http://download.csdn.net/detail/myy2012/5349646 本部分下载地址             ...
  • myy2012
  • myy2012
  • 2013年05月10日 15:44
  • 1049

《java语言程序设计》(第二版)——笔记(一)

作者:郎波     出版社:清华大学出版社         第一章   绪论 1.java语言特点:简单,面向对象,分布式,解释型,强壮,安全,体系结构中立,可移植,高性能,多线程,动态。 简单:去掉...
  • sunset91
  • sunset91
  • 2013年11月21日 20:58
  • 758

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

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

ROS机器人程序设计(原书第2版)学习镜像分享及使用说明

ROS机器人程序设计(原书第2版)学习镜像分享及使用说明 系统用于ROS爱好者学习交流,也可用于其他用途,并不局限于ROS。 这款镜像文件是基于一年前的Ubuntu ROS Arduino Gazeb...
  • ZhangRelay
  • ZhangRelay
  • 2016年11月24日 20:54
  • 12252

《挑战程序设计竞赛》 勘误 (转载+自己补充)

P113: 倒数第二段第一句“min(y1,y2)1,x2)”应改为“min(y1,y2)1,y2)”。 P130: 上面问题描述的限制条件“1NP P132: Milliona...
  • bat67
  • bat67
  • 2016年07月23日 19:41
  • 586

C语言程序设计现代方法第二版基础部分读书笔记(【美】K.N.King 著)

哈喽!我是甜筒科技【Aice】的大虫,首先先简单的谈谈本人对这本书的一些看法吧,刚刚从图书馆看到这本书的时候就感觉和其他书不一样,除了厚以外,简介的封面设计也吸引到了我。ps:为什么说感觉和其他书不一...
  • aice_dachong
  • aice_dachong
  • 2016年02月27日 11:14
  • 1096
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开始啃 Erlang 程序设计,第二口
举报原因:
原因补充:

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