erlang编译运行
A. Web 有哪些 Erlang 语言应用的例子
Mochiweb
一句话介绍: MochiWeb is an Erlang library for building lightweight HTTP servers.
Mochiweb在Erlang项目中被当做一个Web组件被广泛使用(比如RabbitMQ的plug-in),它的设计相当收敛,除了基础的Web请求处理没有提供特别复杂的功能集(后面会提到其它Web Server).目前我已经在两个项目中使用了Mochiweb,得心应手.
Mochiweb项目代码有很多值得学习的地方,比如 mochiglobal [ 链接 ],Parameterized mole [链接]今年夏天我把Mochiweb代码打印了一份,看得很是过瘾.这里有一篇实战风格的入门文章:A practical introction to MochiWeb - Alex Marandon[链接]
使用Rebar很容易编译运行,里面自带一个简单的Echo demo,你可以使用Rebar快速建立起来自己的站点框架,动手试试吧
项目地址:mochi/mochiweb · GitHub
Cowboy
一句话介绍: Cowboy is a small, fast and molar HTTP server written in Erlang.
使用Cowboy需要通过编写Handler来定制如何处理Web请求.这是它设计上的一大特色.项目源码自带了N种版本的hello_world,也是可以非常快上手.编译运行依然是rebar搞定,这个项目现在保持更新,每天都能收到github推送的代码变更邮件.
项目地址:extend/cowboy 路 GitHub
YAWS
一句话介绍:Yaws is a HTTP high perfomance 1.1 webserver particularly well suited for dynamic-content web applications.
这个略显怪异的名字是Yet another Webserver的缩写.其提供的已经不是简单的脚手架了,而是支持动态内容输出,REST,文件上传SOAP等等.在其官网上有丰富的文档和样例代码.O'Reilly在2012年6月出版的 Building Web Applications with Erlang 一书中使用的就是YAWS.这本不足150页的小册子是很好的YAWS入门教程.估计国内出版社不会引进这样一本冷冷的书,自己找电子版读吧,很容易找到.
项目地址:Yaws
Misultin [停止更新]
一句话介绍: Misultin development has been discontinued.
是的,这个项目已经不再继续更新了;停止更新的原因是作者认为各个Web server项目有"too much plication of efforts".作者在项目介绍中倒是简单评价了Mochiweb和Cowboy:
Mochiweb has been around the block for a while and it's proven solid in proction, I can only recommend it for all basic webserver needs you might have. Cowboy has a very interesting approach since it allows to use multiple TCP and UDP protocols on top of a common acceptor pool. It is a very modern approach, is very actively maintained and many projects are starting to be built around it.
项目地址:ostinelli/misultin ¡ GitHub
看过Misultin作者的一番评论,其实可以回答不少人关于"用Mochiweb做Web项目很痛苦"的问题:如果你要做一个丰富多彩的Web站点,在Mochiweb提供的脚手架上,你要完成很多工作,显然你需要其它选择,呃,或许你需要选择一个Web Framework了.对于大多数框架来说,其设计的总要目标就是开发效率和常见应用场景的支持.我们看看有哪些Erlang Web Framework可用吧!
Elrang Web Frameworks
除了http://Asp.net MVC,RoR之外,其实还有很多Web Framework可用,看看Erlang世界里面的解决方案吧:
ChicagoBoss
一句话介绍:Chicago Boss is a server framework inspired by Rails and written in Erlang.
ChicagoBoss是现在非常活跃的Erlang Web Framework,在各种细节上都为新手准备的相当周到比如60秒快速上手教程什么的.甚至它说自己区别于其它Erlang Web Framework的就是" it is easy to set up and use."它之间Web Server是选择的Misultin现在已经迁移到Cowboy.前端MVC架构,内置消息队列BOSSMQ,数据存储方面选择性也比较多:Mnesia MongoDB Mysql PostgreSQL Riak ,Tokyo Tyrant;模板方案依然是使用ErlyDTL.
另外,我觉得ChicagoBoss的文案是这些项目里面写的最棒的,直接命中你最想知道的两个问题:
"Chicago Boss is a server framework inspired by Rails and written in Erlang. It offers all the conveniences of modern web development, including Comet. What sets Chicago Boss apart from other non-Erlang frameworks is that it can handle large amounts of traffic without any drop in performance. What sets Chicago Boss apart from other Erlang frameworks is that it is easy to set up and use."
项目地址:ChicagoBoss/ChicagoBoss 路 GitHub
入门PDF: http://www.evanmiller.org/chicago-boss-tutorial.pdf
Nitrogen
一句话介绍:Nitrogen Web Framework is the fastest way to develop interactive web applications in full-stack Erlang.
看群里面讨论,采用Nitrogen的项目也不在少数,这个项目动态模板方案不是采用ErlyDTL,而是自己有一套解决方案Nitrogen records [链接].网站上的例程和Step by Step教程足够详细,入门应该比较快.
项目地址:Nitrogen - Nitrogen Web Framework for Erlang
Zotontic
一句话介绍:Zotonic is the open source, high speed, real-time web framework and content management system, built with Erlang.
应该说Zotontic和其它框架的差异更多是在业务定位上了,提供了很多CMS直接可用的功能,查看其features列表能够看到详细介绍,注意:"Typically 10 times (and much more) faster than PHP content management systems." [链接]
Zotontic构建在Mochiweb和PostgreSQL之上.
项目地址:http://zotonic.com/
BeepBeep
一句话介绍: BeepBeep is a simple web application framework for Mochiweb inspired by Rails and Merb
BeepBeep 构建在 MochiWeb 和 ErlyDTL (后面会介绍) 基础之上. 沿袭了mochiweb的优良传统一键建站,基于ErlyDTL提供Django 模板的视图展现.
这个项目已经09年之后就没有实质性的更新,最近一次更新是2010年更新了一下README,慎重选择吧.
还有一个项目ErlyWeb同样是
B. 如何用gdb调试erlang运行期
1: 对于在应用程序中加入参数进行调试的方法:
直接用 gdb app -p1 -p2 这样进行调试是不行的。
需要像以下这样使用:
#gdb app
(gdb) r -p1 -p2
或者在运行run命令前使用set args命令:
(gdb) set args p1 p2
可以用show args 命令来查看
2. 加入断点:
break
break
break +offset
break -offset
(在当前行号的前面或后面的offset行停住。)
break filename:linenum
在源文件filename的linenum行处停住。
break filename:function
在源文件filename的function函数的入口处停住。
break ... if
...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置 break if i=100,表示当i为100时停住程序。
3. 查看运行时的堆栈:
使用bt命令
4. 打印某个变量的值:
print val
5. 单步: n
继续运行: c
step
单步跟踪,如果有函数调用,他会进入该函数。
next
同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。
set step-mode
set step-mode on
打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。
set step-mod off
关闭step-mode模式。
finish
运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。
until 或 u
当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
6.在GDB中执行shell命令:
在gdb环境中,你可以执行UNIX的shell的命令,使用gdb的shell命令来完成:
eg. shell make
7. 运行环境
可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。
8.观察点(WatchPoint)
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程 序。我们有下面的几种方法来设置观察点:
watch
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch
当表达式(变量)expr被读时,停住程序。
awatch
当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前所设置了的所有观察点。
9. 维护breakpoint
clear
清除所有的已定义的停止点。
clear func
清除所有设置在函数上的停止点。
delete [breakpoints] [range...]
删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。
比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。
disable [breakpoints] [range...]
disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止 点。简写命令是dis.
enable [breakpoints] [range...]
enable所指定的停止点,breakpoints为停止点号。
10、程序变量
查看文件中某变量的值:
file::variable
function::variable
可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:
gdb) p 'f2.c'::x
查看数组的值
有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:
int *array = (int *) malloc (len * sizeof (int));
于是,在GDB调试过程中,你可以以如下命令显示出这个动态数组的取值:
p *array@len
如果是静态数组的话,可以直接用print数组名,就可以显示数组中所有数据的内容了。
11.输出格式
一般来说,GDB会根据变量的类型输出变量的值。但你也可以自定义GDB的输出的格式。例如,你想输出一个整数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用GDB的数据显示格式:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101
11.查看内存
使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
x/
n、f、u是可选的参数。
n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
n/f/u三个参数可以一起使用。例如:
命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示三个单位,u表示按十六进制显示。
12.自动显示
你可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的GDB命令是display。
display
display/
display/ expr
expr是一个表达式,fmt表示显示的格式,addr表示内存地址,当你用display设定好了一个或多个表达式后,只要你的程序被停下来,GDB会自动显示你所设置的这些表达式的值。
格式i和s同样被display支持,一个非常有用的命令是:
display/i $pc
undisplay
delete display
删除自动显示,dnums意为所设置好了的自动显式的编号。
disable display
enable display
disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。
info display
查看display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否enable。
13. 设置显示选项
set print address
set print address on
打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的,
show print address
查看当前地址显示选项是否打开。
set print array
set print array on
打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。这个选项默认是关闭的。与之相关的两个命令如下,我就不再多说了。
set print array off
show print array
set print elements
这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个来指定数据显示的最大长度,当到达这个长度时,GDB就不再往下显示了。如果设置为0,则表示不限制。
show print elements
查看print elements的选项信息。
set print null-stop
如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off。
set print pretty on
如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。
14.关于显示源码list
C. erlang自带的C编译和makefile编译有什么区别
makefile提供了控制编译的方式,比如,我要编译那些目录下的那些文件,编译结果生成到哪里,c,c++等等语言都提供makefile编译控制机制,而且语法都类似甚至一样。而你的erlc或者c(mole)是erlang的编译实现方法。
D. erlang可以做一些在什么方面的应用呢请专家解释一下
编程语言吧。
Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。
Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适合于构建分布式,实时软并行计算系统。 使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅只是一两个环节,比起C程序的线程切换要高效得多得多了。 使用Erlang来编写分布式应用要简单的多,因为它的分布式机制是透明的:对于程序来说并不知道自己是在分布式运行。 Erlang运行时环境是一个虚拟机,有点像Java虚拟机,这样代码一经编译,同样可以随处运行。它的运行时系统甚至允许代码在不被中断的情况下更新。另外如果你需要更高效的话,字节代码也可以编译成本地代码运行。
E. 如何调试Erlang程序
在erlang环境搭建好之后,它会默认自带一个调试的工具---erlang debugger(这个名字起得很好(^_^)).
Erlang debugger的简单使用:
假设我们有一个写好的test.erl.
1.编译模块。编译模块的时候,应该这样编译
c(test,[debug_info]).
2.打开debugger。在erlang shell中输入"im()."即可。
3.设置断点。在打开的monitor中,把左下方的Auto Attach下的三个选项全部选上,即First Call, On Break, On Exit(这个细节是很重要的)。然后选择Mole->Interpret Moles,在打开的窗口中,选择test.erl源文件。这时,在刚才的Monitor窗口中,双击左上脚的test,在打开的"View Mole test"新窗口中,选择Break->Function Break,选择一个自己的函数(当然,在Break当中,可以选择其他的方式进行断点的设置)。至此,断点设置成功。
4.开始调试。在erlang shell当中输入要调用的函数(就像平时我们没有调试的时候,直接输入模块调用那样。eg: test:reverse([1, 2, 3, 4]). 这个是我随便输的)。然后大家在打开的窗口当中就可以调试自己的程序了。
F. 什么是Erlang,普及一下
Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。Erlang问世于1987年,经过十年的发展,于1998年发布开源版本。Erlang是运行于虚拟机的解释性语言,但是现在也包含有乌普萨拉大学高性能Erlang计划(HiPE)开发的本地代码编译器,自R11B-4版本开始,Erlang也开始支持脚本式解释器。在编程范型上,Erlang属于多重范型编程语言,涵盖函数式、并发式及分布式。顺序执行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言。
G. 开始接触erlang,erlang怎么编译成一个独立运行的程序
escript可以直接执行erl源码
$ cat factorial #!/usr/bin/env escript %% -*- erlang -*-
%%! -smp enable -sname factorial -mnesia debug verbose
main([String]) ->
try
N = list_to_integer(String),
F = fac(N),
io:format("factorial ~w = ~w\n", [N,F])
catch
_:_ ->
usage()
end;
main(_) ->
usage().
usage() ->
io:format("usage: factorial integer\n"),
halt(1).
fac(0) -> 1;
fac(N) -> N * fac(N-1).
?
$ factorial 5
factorial 5 = 120
$ factorial
usage: factorial integer
$ factorial five
usage: factorial integer
H. erlang语言,gen_server.erl编译时出现错误。求大神指导
第一个错误原因是你调用gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).时宏?SERVER没有定义,应该是书上的例子没有把打完全吧。
解决这个问题在代码start_link()上一行前边加上
-define(SERVER, ?MODULE).
这个时加入宏?SERVER的定义,让?SERVER 指向当前模块。
第二个错误提示函数没有定义,这种情况一般是符号错误,检查每个函数最后的句号和函数开头的->
你自己找一找吧
I. erlang protobuffs怎么编译
客户端lua,通信协议是protobuf,以前用网易的proto-gen-lua,使用过程遇到些问题需要绕,比如:1、每次更改、增加proto都要生成新的文件,代码规模剧增2、由于lua本身,每个文件最大文件内全局local变量不能超过200个,所以当proto规模太大时,生成的lua文件就不能用,需要把proto拆分3、我之前做proto-gen-lua的集成,好像使用protobuf2.5的不行,被迫只能用2.4了,然后对proto里message的格式支持不全,比如message内包含其他的message是不行的,无奈只能把要包含的message定义再写在message内部最近新项目,想研究下protobuf的动态解析,于是在github上发现了这个项目:/zhanjunxiong/luapb/issues/2动态解析的序列化反序列化效率肯定比生成代码差很多,所以高并发server可能不适用,客户端没太大影响
J. 我有一个erlang代码,这个 程序怎么使用
去下个erlang的环境 然后make 然后运行。。。windows linux都行 如果开点分 可以帮你看看