<nobr><strong class="kgb" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BwnrR4ZCyR6zVApyM6QOXh8TYBK6yrzHOloa1A8CNtwHgxQgQCRgJIK2F0A0oFDgAUL_IsMP7_____wFgnfHcgdAFqgEKMjAwMDAzNjEyN7IBDW5ld3MuY3Nkbi5uZXTIAQHaAStodHRwOi8vbmV3cy5jc2RuLm5ldC9uLzIwMDcwOTA1LzEwODMxNy5odG1sqQJecjjveq-CPsgC7sPfA6gDAegDtwL1AwAEAAA&num=9&adurl=http://www.szleadtech.com.cn&client=ca-pub-5186439242807756");GgKwClickStat("编程","www.szleadtech.com.cn","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u7F16_u7A0B"' onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u7F16_u7A0B";KeyGate_ads.ShowGgAds(this,"_u7F16_u7A0B",event)' style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;">编程</strong></nobr>语言,而且它具有比编程语言更加贴近<nobr><strong class="kgb" onclick='javascript:window.open("http://s4.17luntan.com/ClickPortal/WebClick.aspx?id=-100848&k=%u64CD%u4F5C%u7CFB%u7EDF&siteid=0098295a-e262-40f7-ae50-7a6fbbdb678b&url=http%3A//news.csdn.net/n/20070905/108317.html&gourl=http%3A//ibm.csdn.net/ISN_J.aspx%3Faction%3DJMP%26pointid%3D2492&parm=A061421B2810B1773C3D917862C2C86794ADB5B4EB3092D1&alliedsiteid=0");' onmouseout="isShowAds = false;isShowAds2 = false" onmouseover='isShowAds = true;isShowAds2 = true;KeyGate_ads.Move(this,"","%u4E86%u89E3Linux%u5185%u5B58%u7BA1%u7406%u7684%u65B9%u5F0F","-100848","操作系统","%u63D0%u9AD8Web%u6570%u636E%u4F20%u8F93%u6548","http%3A//ibm.csdn.net/ISN_J.aspx%3Faction%3DJMP%26pointid%3D2492", event)' style="border: 0px none ; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;">操作系统</strong></nobr>的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。据说使用Erlang编写的Yaws Web<nobr><strong class="kgb" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BHxSe4ZCyR6zVApyM6QOXh8TYBJDi_y_A9YDfAsCNtwHgxQgQChgKIK2F0A0oFDgAUP7Yosn7_____wFgnfHcgdAFoAGQ_7D7A6oBCjIwMDAwMzYxMjeyAQ1uZXdzLmNzZG4ubmV0yAEB2gEraHR0cDovL25ld3MuY3Nkbi5uZXQvbi8yMDA3MDkwNS8xMDgzMTcuaHRtbIACAakCXnI473qvgj7IAozF7gSoAwHoA7cC9QMABAAA&num=10&adurl=http://www.tianfugongju.com&client=ca-pub-5186439242807756");GgKwClickStat("服务器","www.tianfugongju.com","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u670D_u52A1_u5668"' onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u670D_u52A1_u5668";KeyGate_ads.ShowGgAds(this,"_u670D_u52A1_u5668",event)' style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;">服务器</strong></nobr>,其并发性能是apache的15倍!
这个Erlang初始开源版本包含了Erlang的实现,同时它也是用于构建分布式高可用性<nobr><strong class="kgb" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BnG-K4ZCyR6zVApyM6QOXh8TYBN2poz3psvSUBMCNtwHgtg0QBBgEIK2F0A0oFDgAUN3ElvQDYJ3x3IHQBaoBCjIwMDAwMzYxMjeyAQ1uZXdzLmNzZG4ubmV0yAEB2gEraHR0cDovL25ld3MuY3Nkbi5uZXQvbi8yMDA3MDkwNS8xMDgzMTcuaHRtbIACAakCXnI473qvgj7IAqWmkASoAwHoA7cC9QMABAAA&num=4&adurl=http://www.mochabsm.com&client=ca-pub-5186439242807756");GgKwClickStat("系统","www.mochabsm.com","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u7CFB_u7EDF"' onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u7CFB_u7EDF";KeyGate_ads.ShowGgAds(this,"_u7CFB_u7EDF",event)' style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;">系统</strong></nobr>的Ericsson中间件的最大组成部分。
Erlang具有以下特性:
并发性 - Erlang具有超强的轻量级进程,这种进程对内存的需求是动态变化的,并且它没有共享内存和通过异步消息传送的通讯。Erlang支持超大量级的并发线程,并且不需要操作系统具有并发机制。
分布式 - Erlang被设计用于运行在分布式环境下。一个Erlang虚拟机被成为Erlang节点。一个分布式Erlang系统是多个Erlang节点组成的网 络(通常每个处理器被作为一个节点)。一个Erlang节点能够创建运行在其它节点上的并行线程,而其它节点可以使用其它操作系统。线程依赖不同节点之间 的通讯,这完全和它依赖于单一节点一样。
健壮性 - Erlang具有多种基本的错误检测能力,它们能够用于构建容错系统。例如,进程能够监控其它进程的状态和活动,甚至这些进程是在其它节点上执行。在分布式系统中的线程能够配置为在其它节点故障的情况下自动进行故障恢复,并在故障节点恢复时自动迁移回到恢复节点。
软实时性 - Erlang支持可编程的“软”实时系统,这种系统需要反应时间在毫秒级。而在这种系统中,长时间的垃圾收集(garbage collection)延迟是无法接受的,因此Erlang使用了递增式垃圾收集技术。
热代码升级 - 一些系统不能够由于软件维护而停止运行。Erlang允许程序代码在运行系统中被修改。旧代码能被逐步淘汰而后被新代码替换。在此过渡期间,新旧代码是共存的。这也使得安装bug补丁、在运行系统上升级而不干扰系统操作成为了可能。
递增式代码装载 - 用户能够控制代码如何被装载的细节。在嵌入式系统中,所有代码通常是在启动时就被完全装载。而在开发系统中,代码是按需装载的,甚至在系统运行时被装载的。如果测试到了未覆盖的bug,那么只有具有bug的代码需要被替换。
外部<nobr><strong class="kgb" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=Bl_A64ZCyR6zVApyM6QOXh8TYBJ3u_UDF1cqyAsCNtwHQyhYQEBgQIK2F0A0oFDgAUOub5a0FYJ3x3IHQBaABi8ao-gOqAQoyMDAwMDM2MTI3sgENbmV3cy5jc2RuLm5ldMgBAdoBK2h0dHA6Ly9uZXdzLmNzZG4ubmV0L24vMjAwNzA5MDUvMTA4MzE3Lmh0bWypAg42zjsYNYE-qAMB6AO3AvUDAAQAAA&num=16&adurl=http://avnet.imaker.com.hk/servlet/Elink%3Fid%3DAVT_CN_GG&client=ca-pub-5186439242807756");GgKwClickStat("接口","www.avnet.com.cn/em/","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u63A5_u53E3"' onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u63A5_u53E3";KeyGate_ads.ShowGgAds(this,"_u63A5_u53E3",event)' style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;">接口</strong></nobr> - Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。这种机制被用于和操作系统通讯、与其它语言编写的程序交互。如果出于高效率的需要,这种机制的一个特殊版本也允许例如C程序这样的代码直接链接到Erlang运行时系统中来。
Erlang组件
Erlang具有许多单独的组件,它们能够在开发应用时作为组建块(building blocks)使用。同时这些组件也熟知Erlang的系统消息(load、unload、start、stop、restart、change code)。
Inets - HTTP 1.0服务器和FTP客户端。
Mnesia - 使用Erlang的分布式实时数据库。它支持RAM复制、磁盘存储、动态改变shema、保存任意复杂的数据结构。Mnesia之所以非常快速,是因为它 运行在和应用相同的地址空间(因为Mnesia和应用都使用Erlang编写)。Mnesia展示了Erlang的强大:你能够使用多少种语言使用少于 20000行的代码编写一个全特性、工业强度、分布式的DBMS?
Orber - CORBA v2.0对象请求代理(ORB)。
SNMP – 可扩展的SNMP v1/v2代理和MIB编译器。
Erlang<nobr><strong class="kgb" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BjCVB4ZCyR6zVApyM6QOXh8TYBNHhqA_hz8KLAsCNtwGwvRAQAhgCIK2F0A0oFDgAULGEr539_____wFgnfHcgdAFqgEKMjAwMDAzNjEyN7IBDW5ld3MuY3Nkbi5uZXTIAQHaAStodHRwOi8vbmV3cy5jc2RuLm5ldC9uLzIwMDcwOTA1LzEwODMxNy5odG1sqQJecjjveq-CPsgCnZ5wqAMB6AO3AvUDAAQAAA&num=2&adurl=http://www.shxiguang.com&client=ca-pub-5186439242807756");GgKwClickStat("工具","www.shxiguang.com","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u5DE5_u5177"' onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u5DE5_u5177";KeyGate_ads.ShowGgAds(this,"_u5DE5_u5177",event)' style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;">工具</strong></nobr>和代码库
Erlang具有一套常用工具库:
Appmon - 进程组图形监控(在本地和远程节点上)。
ASN.1 - 支持ASN.1基本标记法和BER、DER、PER编码规则的编译时和运行时的代码包。
Compiler - Erlang编译器。
Debugger - 图形化Erlang调试器。
ERTS - Erlang运行时系统,包括虚拟机、垃圾收集、端口映射守护进程。
GS - 编写图形用户接口的代码库。
IC - 把OMG的接口定义语言(IDL)转换到Erlang、C和Java语言的编译器。
Kernel - 运行Erlang系统所必须的C代码:Erlang内建功能(BIFs);代码、启动、命名服务;对网络和分布式的支持;装载器、连接器、记录器;操作系统和文件系统接口。
Mnemosyne - 可选的用于Mnesia的查询语言。
Mnesia Session - 以IDL定义的与Mnesia接口的外部语言,它们通过IIOP和erl_interface协议对Mnesia进行访问。
OS monitor (OS_MON) - 监控CPU、硬盘、内存使用情况,包括SNMPv1/v2 MIBs。并且提供了与Solaris syslogd、Windows NT事件日志的接口。
Parse tools - 用于Erlang的LALR-1解析生成器(yecc),它和yacc类似。Yecc使用BMF语法定义作为输入,生成Erlang代码作为解析输出。Yecc被用于生成Erlang解析器。
PMan - 跟踪、查看Erlang进程状态(在本地或者远程节点上)的工具。
SASL - 进程、错误、崩溃报告处理、报告浏览、释放处理、重载管理。
Stdlib - 标准代码库:输入、输出;基于内存、磁盘的表存储(ETS和DETS);图表、字典、列表、字符串、集合、队列;正则表达式;数学公式。Erlang解释 器、tokenizer、解析器、lint和格式化打印。用于容错服务器的通用框架、事件处理器、状态机和线程监管等等。
Table visualizer - 查看ETS和Mnesia表格的工具。
Toolbar - 简化了对Erlang工具的访问。
Tools - 覆盖分析器、优化器、基于文字的跟踪器、Emacs模式、Emacs TAGS文件生成器、make工具、调用图形化工具。
十分钟Erlang快速入门
启动Erlang
如果你使用unix系统的话,请输入“erl”;而如果你使用Window系统的话,请点击Erlang的开始图标来启动Erlang。你应该看到如下界面:
os prompt > erl
Erlang (JAM) emulator version 4.7.3.3
Eshell V4.7.3.3(abort with ^G)
1>
“>”提示表示了系统正在等待输入。
将Erlang用作<nobr><strong class="kgb" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=BDLDr4ZCyR6zVApyM6QOXh8TYBJSb4Sy8l6CLA8CNtwGA0w4QDxgPIK2F0A0oFDgAUL6Dt4MGYJ3x3IHQBaoBCjIwMDAwMzYxMjeyAQ1uZXdzLmNzZG4ubmV0yAEB2gEraHR0cDovL25ld3MuY3Nkbi5uZXQvbi8yMDA3MDkwNS8xMDgzMTcuaHRtbKkCXnI473qvgj7IAuyVoASoAwHoA7cC9QMABAAA&num=15&adurl=http://www.centn.com/hw_6.asp&client=ca-pub-5186439242807756");GgKwClickStat("计算器","www.centn.com","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u8BA1_u7B97_u5668"' onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u8BA1_u7B97_u5668";KeyGate_ads.ShowGgAds(this,"_u8BA1_u7B97_u5668",event)' style="border: 0px none ; margin: 0px; padding: 0px; color: rgb(0, 0, 255); font-weight: normal; text-decoration: underline;">计算器</strong></nobr>
1> 2131836812671*12937192739173917823.
27579983733990928813319999135233
2>
记住每个表达式都是以句点和空格为结束符的!
编辑从前的表达式
我们使用简单的emacs行编辑命令编辑从前的表达式,最常用的命令如下:
•^P 获取上一行。
•^N 获取下一行。
•^A 将输入焦点移动到当前行首。
•^E 将输入焦点移动到当前行尾首。
•^D 删除当前光标所在的字符。
•^F 向前移动一个字符。
•^B 向后移动一个字符。
•回车 执行当前命令。
请注意: ^X 表示Control + X 。尝试按下Control+P,看看什么会发生?
编译你的第一个程序
在你所喜欢的文本编辑器中输入以下内容,并将其保存到文件中:
-module(test).
-export([fac/1]).
fac(0) -> 1;
fac(N) -> N * fac(N-1).
保存文件名为test.erl,请注意文件名必须和模块名相同。
通过输入c(test)编译程序,然后运行它:
3> c(test).
{ok,test}
30> test:fac(20).
2432902008176640000
4> test:fac(40).
815915283247897734345611269596115894272000000000
32>
Ok,现在你也可以尝试编写一些有趣的程序了。