




免费预览已结束,剩余36页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
HeadfirstErlang byalex Erlang的历史 Erlang得名于丹麦数学家AgnerKrarupErlang 同时还表示EricssonLanguage由爱立信所辖的CS Lab开发 目的是创造一种可以应对大规模并发活动的编程语言和运行环境问世于1987年 于1998年发布开源版本在编程范型上属于多重范型编程语言 涵盖函数式 并发式及分布式最大的商业用户是爱立信 其他知名用户有北电网络 A以及T Mobile等 Erlang的特性 Fail fast 中文译为速错 即尽可能快的暴露程序中的错误 面向并发的编程 COPconcurrency orientedprogramming 代码热插拔函数式编程动态类型及早求值或严格求值脚本语言 Erlang的简单示例 求N的阶乘 声明模块名 必须和文件名一致 定义了该模块儿中那些函数可以被外部调用 递归结束条件 即1的阶乘是1 递归 即N的阶乘是N N 1 Basic1 变量 变量不变 任何变量在赋值前称为自由变量 赋值后称为绑定变量 模式匹配 表示模式匹配 而不是赋值 比如Lhs Rhs实际是这样一个过程 对Rhs求值 之后和Lhs进行匹配 单一赋值有利于编写质量更高的代码 Basic2 原子 在Erlang中 原子表示非数字的常量值 类似于C C 中的宏定义 alex delia 126都是原子原子以小写字母开头 后接数字 字母 下划线 或 单引号引起的字符也是原子 这样原子的开头可以是大写字母或数字 比如 Alex 本身不需要引号的原子也可以用引号引起来 比如 a 和a是相同的原子的值就是原子本身 Basic3 元组 将若干以逗号分隔的值用 括起来 就形成了元组 比如 wang miao miao 将一个元组绑定到变量Baby 元组没有名字 通常用一个原子作为元组的一个元素来标明这个元组代表的含义 元组是可以嵌套的 Basic3 元组 提取元组的值 号两边的元组必须含有相同数量的元素 提取元组的某个值 是占位符 表示我们不关心这个位置的值 Basic4 列表 将若干以逗号分隔的值用 括起来 就形成了列表 比如 wang miaomiao 0 5 列表的各个元素可以使不同的类型列表的第一个元素称为列表的头 移除列表头剩余的部分称为列表的尾 我们可以用 H T 的方式表示列表访问列表头是非常高效的 列表相关函数都是从提取列表头开始的 向列表中增加元素 从列表中提取元素 Basic5 字符串 严格讲 Erlang并没有字符串 字符串实际上是一个整数列表 用双引号将一串字符括起来就是一个字符串 一个字符串 采用整数列表方式定义的一个字符串 整数列表中包含不可打印字符 因此全部以整数显示 后面接字母 打印该字母的ASCII码 顺序型编程1 模块 定义一个模块 函数定义包括函数头和函数体 一个函数可以包含多个子句 用 隔开 函数的目 arity 就是它所拥有的参数数量 同一个模块中的两个函数如果名字相同而目不同 那么它们是完全不同的两个函数 顺序型编程2 fun fun是个匿名函数 可以作为一个变量使用 fun作为参数使用 fun作为返回值使用 lists是标准库的一个模块 顺序型编程3 列表解析 列表解析是一种无须使用map filter和fun来创建列表的方式 它能使程序简洁且更容易理解 通过格式 以列表解析替代map 三个经典例子 排序 毕达哥拉斯三元组和变位词 顺序型编程4 算术表达式 顺序型编程5 断言 断言 guard 是一种用于强化模式匹配功能的结构 可以在函数的头部使用断言 这是必须使用when关键字 也可以在任何允许使用表达式的地方使用断言 断言序列 断言集合G1 G2 G3 Gn中 只要其中任何一个断言为true 整个断言集合为true 断言集合G1 G2 G3 Gn中 只有所有的断言为true 整个断言集合才为true 原子true其他常量 这些在断言表达式中都会求值为false断言谓语 参考下页 断言BIF 参考下页 比较表达式算术表达式布尔表达式短路布尔表达式 and andalso和or oralso 合法断言表达式 顺序型编程5 断言 断言谓语 断言BIF 顺序型编程6 记录 记录提供一种方法把一个名字和元组中的一个元素对应起来 记录定义方法 1 在后缀为 hrl的文件 reocrds hrl 中定义记录 记录的声明不能用于Shell 只能用于源代码 1读取记录toto 2创建一个todo记录的拷贝 3创建一个todo记录的拷贝 并修改status和text的值 4创建一个X1记录的拷贝 并修改status的值 5通过模式匹配 提取记录中的值 7可以通过点语法提取记录中某个字段的值 8记录实质就是元组 通过rf剥去记录的伪装 顺序型编程7 case if语句 case语句 if语句 caseExpressionofPattern1 whenGuard1 Expr seq1 Pattern2 whenGuard2 Expr seq2 end ifGuard1 Expr seq1 Guard2 Expr seq2 异常 当系统遇到错误就会自动抛出异常 最常见的错误是模式匹配失败 或者调用BIF时传入了错误类型的参数exit why 当想终止进程的时候 就需要这个函数 如果这个异常未被捕获 那么系统向所有与当前进程相连接的进程广播 EXIT Pid Why 消息throw why 抛出一个调用者可能会捕获的异常 这个函数的调用者有两个选择 要么忽略异常 要么使用try catch捕获异常并处理erlang error why 抛出那些 崩溃错误 这些错误可以等同于内部产生的系统错误 抛出异常 隐式 显式 可忽略 等效于Value Value 可忽略 用于善后处理 使用 捕获每一个可能的异常 使用 忽略所有的异常 使用erlang get stacktrace 查看最近的栈跟踪信息 顺序编程进阶1 二进制数据 Erlang使用二进制类型结构存储大量的原始数据 相比于列表和元组 二进制类型更省内存 性能够高二进制类型表示法 用 括起来的 0 255的整数 或者是字符序列 二进制类型例子 speclist to binary IoList binary 将IoList的内容转换为一个二进制数据 specsplit binary Bin Pos Bin1 Bin2 在Pos指定的位置上将二进制数据Bin分为两个部分 specterm to binary Term Bin 将任何Erlang值转换为二进制数据 结果数据以 外部数据格式 的形式存在 可以用于文件或者网络传输 specbinary to term Bin Term term to binary的逆函数 specsize Bin Int 返回二进制数据Bin的长度 二进制类型BIF 顺序编程进阶2 比特语法 模式匹配的一种扩展 用于对二进制数据中的单个比特位或比特串进行封包和解包比特语法是针对协议编程而设计的 非常高效 16bit色彩封包和解包 Erlang的看家本领 顺序编程进阶2 比特语法 比特语法 每个元素有4中表示方式 总比特数必须是8的倍数 Size指明了单一区块的长度 默认为类型的长度 TypeSpecifierList是一个有连字符间隔的 形如End Sign Type Unit的列表 每一项的前置项都可以忽略 而且没有顺序要求 省略时 取默认值 粗体为默认值 样例 MEPG同步帧解包COFF数据IPv4头解析 顺序编程进阶3 apply 函数引用 BIFapply Mod Func Arg1 Arg2 Argn 将Mod模块中的Func函数应用到参数Arg1 Arg2 Argn上 等效于 Mod Func Arg1 Arg2 Argn 尽量避免使用apply 当通过apply调用时 很多分析工具无法分析出其工作细节 编译器也无法对它优化 两个调用在功能上等效 但是性能可能差很多 我们使用funMod Func Arity方法来引用一个本地或外部模块的函数 顺序编程进阶4 宏 Erlang宏定义的语法 Erlang预定义宏 FILE 扩展当前文件 MODULE 扩展当前模块 LINE 扩展当前行 宏的流程控制 undef Macro ifdef Macro ifndef Macro else endif TRACE宏的例子 顺序编程进阶5 数值类型 Erlang数值类型包括整数和浮点数整数的计算是精确的 变量代表的长度仅受限于可用的内存 Erlang的浮点数包括5个部分 一个可选的符号 一个数值部分 一个小数点 一个小数部分 以及一个可选的指数部分浮点数在内部以IEEE的64bit的格式表示浮点数的范围是 10的323次方 10的308次方 传统语法 比如12 123 34567K进制整数 采用K Digits的方式表达 比如2 0110010 16 fe34 语法 ASCII码的整数表示 三种表示方式 顺序编程进阶6 小问题集锦 模块属性 module import export compile vsn等预定义模块属性块表达式 使用begin end组织的一个类似子句的实体 块的值是最后一个表达式的值布尔类型 没有独立的布尔类型 使用原子true和false取而代之布尔表达式 not and or xor 非短路 短路布尔表达式 andalso orelse 和 对列表进行添加和删除操作注释 只有以 开头的单行注释 没有块注释epp Erlang预处理器 使用命令compile M p 将预处理的输出写入一个文件转义字符 在一个格式化串中 w的意思是不做任何修饰打印原始结果表达式和表达式序列包含语法 使用 include Filename hrl 进程字典 Erlang的每个进程都有一个私有的数据存储结构 进程字典 key value对 可以使用BIF操作字典 由于进程字典难以调试 应该尽量少使用引用 全局唯一的Erlang值 使用BIFerlang make ref 创建比较表达式 注意 和 和 的区别下划线变量 如果一个变量在一个子句中只被使用一次 那么编译器会发出警告 而下划线变量则不会 下划线变量常用于命名一个不准备使用的变量 如open File Mode 编译运行1 ErlangShell 在命令行终端输入erl命令启动一个ErlangShellerlang halt 是一个BIF 用来即刻停止系统 但是不作任何清理工作 对于类型数据库的系统来说 意味着下次重启时要进行一次错误修复q 是init stop 的别名 用于友好的关闭系统 启动和关闭ErlangShell erlang保存了一系列的代码 在ErlangShell启动的时候顺序执行当前目录下的 erlang优先于HOME目录下的 erlang ErlangShell配置文件 code get path 获取当前加载路径code add patha code add pathz 分别在加载目录的头和尾加入新目录可以使用erl paDir1 paDir2 pzDirN pzDirN 1的方式启动ErlangShell ErlangShell加载路径 编译运行2 几种程序运行方法 hello erl 在Shell中运行 在命令行运行 s指定运行的模块和函数 fac erl 命令行参数的处理 Erlang内置一个Webtool工具分析崩溃转储 并发编程1 进程和并发原语 Erlang的进程是语言级别的 而不是OS级别的 每个进程都是一个独立运行的Erlang虚拟机 创建和销毁进程非常迅速在两个进程间收发消息非常迅速进程在所有的OS上行为相同可以创建大量进程进程间不共享数据 彼此完全独立进程间唯一的交互方式是消息传递 进程特征 Pid spawn Fun 创建一个新的并发进程 用于对Fun求值 可以使用返回的Pid向新进程发消息Pid Message向标识符为Pid的进程发消息 消息发送是异步的 返回值为消息本身 因此可以级联发送Pid1 Pid2 Pid3 Mreceive end接收一个发给当前进程的消息 Erlang并发原语 并发编程2 客户 服务器介绍 客户 服务器架构是Erlang的核心内容 采用的是轻量级的服务器机制 客户机和服务器表示进程扮演的不同角色 尾递归的函数可以无限循环 而不需要耗费空间 并发编程3 send receive原理 send并非把一个消息传递到一个进程去 而是把消息放到进程对应的邮箱里 receive检查邮箱 取出消息并删除 receive内部机制 receive完整语法 after是超时设置 可选 并发编程4 注册进程 注册进程示例 register AnAtom Pid 将一个进程的Pid注册为名为AnAtom的原子 如果这个原子已经被使用 注册就会失败unregister AnAtom 移除与AnAtom相对应的进程所有的注册信息whereis AnAtom Pid undefined判断AnAtom是否已经被注册 如果被注册了 返回注册进程的Pid 否则 返回undefinedregistered AnAtom atom 返回一个系统中所有已注册的名字的列表 注册进程采用了一种不同于Pid的方式标识进程 包括了4个BIF 并发编程错误处理1 概述 链接 link 链接定义了一种在两个进程间的传播路径 例如 A以B的pid作为参数调用link后 A B就被链接到一起 当B退出时 系统就会向另外一个进程发送退出信号 我们把一群与某个进程链接的进程集合称为该进程的链接集 退出信号 当一个进程消亡时 它会产生一个退出信号 系统会向这个进程的所有链接进程发送退出信号 其中包含一个描述消亡原因的参数 可以使用exit Reason 显式的设置原因 当一个进程成功的完成spawn所指定的函数而退出时 Why就是normal 进程Pid1可以通过exit Pid2 X 向Pid2发一个退出信号 Pid1发送之后仍然运行 系统进程 当一个进程接收到一个非正常的退出信号时它自己也会消亡 除非它是系统进程 系统进程收到内容Why的退出信号时 它把退出信号转换为消息 EXIT Pid Why 然后送入系统进程邮箱 调用process flag trap exit true 将一个进程转换为系统进程 扩展阅读 监视器 并发编程错误处理2 处理模式 并发编程错误处理3 例子 specspawn link Fun Pid 创建进程并建立链接的原子操作 和spawn link并不等价 specprocess flag trap exit true 把一个普通进程转换为系统进程 speclink Pid true 在两个进程间创建链接 这个操作是双向的 如果进程A运行了link B 那么A本身也被链接到了B specunlink Pid true 解除链接 specexit Why none 导致当前进程终止 并把终止原因设置为Why specexit Pid Why true 发送一个退出信号给Pid 退出的原因设为Why 分布式编程1 名字服务例子 编写Erlang分布式程序的一般步骤 名字服务 分布式编程2 Stepbystep 本地执行 同一台机器开启两个节
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 免烧砖生产物料运输方案
- 生活垃圾收集作业安全防护方案
- 源网荷储一体化项目分布式光伏建设方案
- 冷链设备智能化升级改造方案
- 成为邮电人:大学第一课 课件 第19章 企业风采-行业知名企业展
- 东南亚跨境电商市场行业发展趋势与挑战研究报告
- 导航安全培训师课件
- 黑龙江安全员b证考试题及答案
- 安全培训矩阵体系课件
- 安全培训知识学生课件
- 2026年高考政治一轮复习:必修+选必修共7册主观题背诵考点汇编
- 2025年《数字孪生与虚拟调试技术应用》课程标准
- TCCEAS001-2022建设项目工程总承包计价规范
- 人教版小学三年级数学(上册)全册教案
- 2024-2025学年人教版(2024)七年级英语上册 教学计划
- 中国文学理论批评史全套教学课件
- 工程结构设计原理课件--钢梁承载力计算原理
- 六年级上册美术课件-第一课图形创意与联想|冀教版共15张PPT
- 三年级上册信息技术全册课件ppt
- 小学语文分层作业设计
- 米亚基点焊机MDA-4000B全中文说明书
评论
0/150
提交评论