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

原创 2015年07月07日 09:55:29

《Erlang 程序设计》看了下价,89。大书店里买的也不能还价。版权声明上,源版是 2013年,简体中文版本 2014年出来的。然后 是 Joe Armstrong 的一段话:

                            这个世界是并行的。

              如果希望将程序的行为设计得与真实世界物体的行为相一致,那么程序就应该具有并发结构。

              使用专门为并发应用设计的语言,开发将变得极为简便。

               Erlang 程序模拟了人类如何思考,如何交互。

                                                                          --- Joe Armstrong

我这是第二版

里面还有个第一版推荐序

看了下重点是下面几句:

          如果开来不能有效地以并行化的软件充分利用并行化的硬件资源,那我们的计算效率就会停滞。

           Erlang 从其构思时,就把“并行”放到中心位置,其语言机制和细节的设计无不从并行角度出发和考虑,并且一直完善到今天。

           现在需要的是学会用 计算云,这种手段去实现 “云计算” 这个结果。学Erlang 是进入这个的捷径。

第二版 没有推荐序是不是写的不好呀?!直接到前言啦

前言中的几个重点我摘了出来

关于 erlang 特性的东西

(1)Erlang从一开始就被设计用于自下而上地编写并发式,分布式,容错,可扩展和软实时系统程序。

(2)Erlang是函数式编程语言,函数式编程禁止代码存在副作用。副作用和并发性不能共存。

(3)Erlang各进程只能用一种方法进行交互,那就是交换消息(分布式编程的基础).

学习路线图:

概念---> 顺序编程---> 并发及分布式编程 ---> 库和框架 ---> 完整例子

按照《C# 本质论》的做法,我也给 Erlang 做了张脑图

今天先啃第一部分只有 14页,好啃

搞清4点

              1.介绍什么是并发: 模拟并行(以各种方式利用计算机资源模拟并行状态【为上层应用】)

              2.并发与并行的区别:一个是模拟并行,一个是真正并行

              3.并发程序的好处:只要结构设计得合理能使用业务充分利用机器资源

              4.Erlang速览:erlang 中提供的直接支持并发的说语法糖

文件是代码的容器,从文件内容上看它有3类信息:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

|  %  一种以这个符号开头的 称为 注释(Comments):用来说明(一般说明人为的信息,写给人看),                                                                            |                                                       |                                                                                            惯用法是 %%%: 文档级说明,%%:函数级说明, %:行级说明                                                    |

|                                                                                            也用于 说明 本文件的编码规则, %% coding: utf-8  或 latin-l                                                    |

|  -    一种以这个符号开头的 称为 附注(Annotations):用来说明(一般说明给编译器运行时看的本模块的属性信息,指示系统编译及运行),      |                                  

|                                                                                              系统的有几类模块属性:                                                                                                                  |

| 1.预定义模块属性 ,                                                                                                                          |

| 2.行为模块属性 ,                                                                                                                              |

|                                                                                              3.定义记录 ,                                                                                                                                     |

| 4.预处理 ,                                                                                                                                          |

|                                                                                              5. 函数的类型说明,                                                                                                                          |

|                                                                                               用户也可以定义。 形如 -Tag(Value).                                                                                             |

| 原子()-> xxx. : 具体功能函数                                                                                                                                                                                                  |

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

1.1 给并发建模

         -mode(person).    意思是 告诉EVM,本文件用于包含 person 模块的代码。并且应该与 文件名同名。由于规定模块名 必须是原子,一般原子以小写开头,所以常见是小写

         也可以‘Nick’,放在‘’ 之中。常见的一些模块附注(或模块属性【module Attributes】):

1.预定义类:

-module(文件名). 用于声明模块名

-export([函数名/参数个数]). 用于声明能导出的函数名

-import(模块名, 函数名). 导入什么模块里的什么功能 

-compile(选项标志列表). 当编译时按指定方式编译

-vsn(). 指明本模块版本, beam_lib:version/1 查看。

-on_load(Function). 当模块载入VM时这个功能也自动载入

行为模块属性:主要是启用了行为模式后带入的一些

-behaviour(行为模式名).

-callback(参数).

        这些模块属性附注结尾一定要加 . 这个句点做为结束,不然编译会说找到前面这个名字

3. 定义记录

-record(记录名, 记录结构域).

4.预处理类:

-define(名字, 数据或函数). 用于定义宏

-include(“路径/文件名.扩展名”). 用于包含一些共公的 头文件

5.函数类型说明

-type

-spec

这两个我用得不多,说是利于差错分析器排错。

1.1.1 开始模拟

         文件中 是以一个 world:start() 为一个容器类,来启动各对象模块。

        书中用的 spawn 函数生成一个 erlang 进程,spawn 返回一个 erlang 进程的id号,保存于world模块 start 函数中的一批变量中,

        Pid = spawn(EVM 先按这个模块名创建一个进行,然后执行这里提供的函数名,这里有参数收入参数执行)

1.1.2 发送消息

        erlang 在语法层直接支持 erlang 进程间 消息的收发

               进程1                                                                           进程2

                    |                                                                                  |

      ______________                         ___________________________________________

      | 发给进程2  消息 | ----------------> | 收到 进程1 送来的消息(消息内含消息来源进程标识)|

      ------------------------                          ---------------------------------------------------------------------------

                   |                                                                                     |

      ____________________________________________________________________

     | EVM                                                                                                                                                    |

      -----------------------------------------------------------------------------------------------------------------------

     进程间 发消息的格式:   目的进程名  !  消息(带消息格式的消息体)

1.1.3 接收消息

使用 receive 操作符 处理接收

         格式:  receive

                               消息体1 -> 处理 1;

                               消息体N -> 处理N    % 最后一个不加冒号, 如果想处理其它情况,可以再加一个 Others

                       end.

         进程间交互方式:编程模型基于对现实世界的观察,或业务需求。


1.2 并发的好处

           这个就不废话啦,好处特多,装B显摆专用,然后就是增大发财机会!

           A. 性能 B. 可扩展性 C.容错性 D.清晰性

1.3 并发程序和并行计算机

           在多核计算机上,OS也许会关闭一个核来节能; 在云端,某个计算也许会被挂起并转移到一台新机器上,这些都不在我们控制范围之内。

           老Joe 认为,并发与软件结构有关, 并行与硬件结构有关。

1.4 顺序和并发编程语言

           老Joe认为,编程语言有两种:串行和并行。串行语言被用于编写串行程序,如果你强行写成并行处理,是自行增不必要的复杂度,因为语言设计初衷就是串行,而并行语言目标就是并行一直按这目标执行演进。

           在Erlang里,并发性由Erlang虚拟机提供,语言内建并发性。就样的好处理是在所有平台上,并发的语义和工作方式都相同。只并发就只需掌握 Erlang就行了。

1.5 小结

           世界是并行的,但你的业务并非并行,并非全部分并行,也许整个系统只有一部分或几部分需要并行处理,串行并行混合的情况更为常见。看各占比例多少,如果并行情况占用大多数,用并行语言可以减少工作量,并减少复杂度; 然后找出瓶颈,考虑按优势互补混合多种语言开发。如果串行业务逻辑占得多,使用并行方式及并行语言无非加大复杂度。毕竟我们的目标是以高效,经济,方便为宗旨。再说一下这一章没有代码,老Joe 虽然提到有 world.erl person.erl dog.erl rabbit.erl 这几个模块但没有给出源代码。


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

相关文章推荐

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

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

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

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

Erlang程序设计 笔记

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

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

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

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

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

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

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

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

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

《Erlang程序设计》——笔记

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

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

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

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

% (1).file:read_file(File) 会返回 {ok, Bin} 或者 {error, Why}, % 其中 File 是文件名, Bin 则包含了文件的内容。请编写一个 % myfi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开始啃 Erlang 程序设计,第一口
举报原因:
原因补充:

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