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

本文介绍了《Erlang 程序设计》一书,强调了并发编程的重要性,并概述了Erlang语言在设计时便考虑了并发特性,适合构建并发、分布式、容错和软实时系统。作者Joe Armstrong认为Erlang通过模拟并发来实现与真实世界行为的一致性。学习Erlang是理解并利用计算云进行云计算的捷径。文章还提及了Erlang的并发特性、函数式编程禁止副作用的原则以及进程间通过消息传递交互的特点。最后,提出了学习Erlang的路线图和并发编程的好处。
摘要由CSDN通过智能技术生成

《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 这几个模块但没有给出源代码。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值