Erlang源码分析
文章平均质量分 90
瑞仙
这个作者很懒,什么都没留下…
展开
-
Erlang list的++操作和append函数的底层实现
当提到Erlang中list的++操作符时,我们常会想到它的性能问题。有些人知道++操作比较耗时,就改用函数append来代替。到底++操作和append函数之间有什么区别?我们来查看一下它们在Erlang源码及C源码中的实现。在$ERL_TOP/lib/stdlib/src/lists.erl可以找到如下代码:%% append(X, Y) appen原创 2013-07-23 09:04:45 · 7466 阅读 · 3 评论 -
重启Erlang Socket服务时,报出{error, eaddrinuse}错误的解决方法
重启Erlang Socket服务时,gen_tcp:listen/2返回{error, eaddrinuse}错误,是因为上次关闭Socket服务后,TCP 套接字仍处于TIME_WAIT状态,等待数分钟,TIME_WAIT 状态退出之后可以正常启动。如需立即启动,可以在调用gen_tcp:listen/2时将reuseaddr选项设置为true,声明可重用端口,详见:http://原创 2014-01-09 16:11:39 · 4805 阅读 · 0 评论 -
Erlang的crypto模块与最新的openssl动态链接库不兼容的问题与解决方案
CentOS 6.3 64位,装完Erlang后,出现了crypto模块使用不正常的情况,开始猜测是最新版本的openssl的动态链接库有问题,也请教了余峰老大,叫我在centos 6.2环境下测试一下,于是在一台老服务器上编译当前最新版的erlang R16B03,没有出现问题,但是,用yum更新了OpenSSL后,同样的问题出现了。 新版本的openssl编译出来的动态链接库的问题?原创 2014-01-06 21:57:59 · 18440 阅读 · 6 评论 -
实例阐述浮点数解包运算过程
浮点数在计算机中存储或传输时,常会遇到读出来的浮点数有N(N>10)位小数的问题,这里以Erlang实例阐述产生这种现象的原因。原创 2014-03-15 19:39:28 · 1933 阅读 · 0 评论 -
Erlang安装时加载openssl的libcrypto.a失败,执行crypto:start()报错的解决方案
两个多月前写过一篇关于这个问题的文章,由于写得比较简略,很多同学还是很纠结这个问题,所以在此补充一下具体的操作过程。很多同学根据我上一篇文章重装后仍然失败的原因,常见的有如下几个:1、加-fPIC参数重装openssl后,不明确新编译出来的静态库libcrypto.a在哪里,如果以前有安装过的,不明确是否被覆盖;2、对于已经编译安装过的源码目录,没有执行make clean;2、重装erlang时,没有具体指定最新安装的ssl目录;3、重装erlang后,直接执行erl时,仍然执行了老的erl,可以原创 2014-03-12 10:31:08 · 14483 阅读 · 1 评论 -
iOS推送通知(Push Notification)的Erlang实现
关于cer/pem证书转换,网上很多资料,我这就不说了,网上有PHP及其他语言实现的Push Notification,可以参考,但大多都是版本OUT了,为了更好的做PUSH服务定制,我这里以Erlang(gen_server)实现iOS Push Notification原创 2014-09-24 21:29:52 · 2389 阅读 · 0 评论 -
Erlang R16+ Crypto模块与最新Openssl不兼容问题
原文地址:http://www.kongqingquan.com/archives/145服务器上新安装了R1601版本后,启动crypto模块 时出现下面的错误:The on_load function for module crypto returned {error,{load_failed,“Failed to load NIF library: ‘/usr/local原创 2014-12-31 12:21:06 · 2203 阅读 · 0 评论 -
Erlang Port实现调用系统命令并逐行输出执行过程
最近在做一个通过WEB调用系统命令的工具,难点是如何获取执行过程,同时可以逐行输出?想起以前有看到霸爷提到rebar中封装了类似的功能,于是从rebar_utils中整出了下面的东西,很好用。-module(sh_port).-export([sh/1, sh/2]).%%%% Options = [Option] -- defaults to [use_stdout, abo原创 2015-01-24 10:11:15 · 1693 阅读 · 0 评论 -
Erlang静态键值对(key-value)数据分别写入erl文件与ETS表读取的测试
(1)、静态键值对(key-value)数据直接写成erl文件编译后读取比读ETS表快6倍左右;(2)、数据量越大,数据结构越复杂,两者差距越明显;(3)、erl文件太大(大于10M)时,编译会很慢(大于1分钟);(4)、数据量在1w左右,写成erl文件3M内,建议用erl文件形式更快更直接。原创 2015-04-05 10:12:13 · 2263 阅读 · 0 评论 -
Erlang的tv、appmon等GUI工具在R17以上版本的启动方法
Erlang R17版本以上,按以前的方法启动tv、appmon等工具,出现如下错误:kernel-poll not supported; "K" parameter ignoredErlang/OTP 17 [erts-6.4] [64-bit] [smp:4:4] [async-threads:10]Eshell V6.4 (abort with ^G)(rolong@127.0原创 2015-04-13 15:43:52 · 4683 阅读 · 0 评论 -
AStar A* 算法的Erlang实现
%% @author rolong@vip.qq.com%% 本代码来自 瑞仙的Erlang开发博客%% http://blog.csdn.net/zhongruixian-module(astar1).-export([ find_path/2 ,test/2 ]).-record(state, { open原创 2015-04-24 11:40:33 · 2115 阅读 · 3 评论 -
PHP扩展模块解包(由term_to_binary生成的)Erlang ext term格式的二进制数据
有些同学想把Erlang数据通过term_to_binary函数封包后以二制进形式存入数据库,然后用PHP读取并解包成PHP数组。为了解决上面的这种应用场合中遇到的问题,参考peb(Php-Erlang Bridge)扩展写了这个类似erlang:binary_to_term/1函数功能的binary扩展,可以理解为是PHP版的binary_to_term。原创 2013-10-24 15:15:26 · 2743 阅读 · 1 评论 -
初探Erlang的term_to_binary数据封包机制
erlang:term_to_binary/1,2函数返回值是Erlang扩展term格式(Erlang external term format)的binary,即ext_binary(),这个函数能把Erlang数据封装成二进制流,是一种存储和传输Erlang数据的有效途径,甚至可以用这种封包/解包方式用作Socket的通信协议(某页游项目就是这么干的)。读懂Erlang扩展term格式的二进制数据,你就可以用任意语言解包Erlang数据。直接分析二进制流,语言之间沟通无限。原创 2013-10-16 17:46:29 · 5307 阅读 · 0 评论 -
Erlang运行时提供的原子操作API
尽管Erlang给开发人员提供的语义是基于消息传递式的同步,对于应用开发者来说,使用这种语义可以避免使用锁;但是在Erlang运行时(ERTS)中,为了充分利用多核处理器中多个处理器核心,Erlang运行时采用了多线程的结构,例如一个调度器就运行在一个线程中,因此Erlang运行时本身也是一个多线程应用程序。目前大部分多核处理器都采用共享内存的架构共享数据,因此这些线程之间通信的最高效方式就是通过转载 2013-09-13 17:22:29 · 1703 阅读 · 0 评论 -
Erlang原子(atom)的内部实现及应用
Erlang的原子(atom)在匹配中有着重要作用,它兼顾了可读性和运行效率。 通过atom,可以实现很多灵活高效的应用,例如动态生成模块名和函数名,动态调用函数。在很多非FP语言里,我们经常是组合字符串来生成函数名,然后赋给一个变量来达到动态调用函数的目的,但是在Erlang里,把字符串变量当作函数名来用是不行的。Erlang的atom是为匹配(比较)而生的,它的作用就是为了匹配更快捷。atom数量上限是1M,并且不参与GC,一旦创建将永远保存,一旦数量超出上限,VM很快就会宕掉,所以不可滥用atom。原创 2013-07-29 15:34:15 · 2972 阅读 · 2 评论 -
Erlang Binary的内部结构和分类介绍
我们先来重温一下《Erlang数据类型的内部实现》一文。 Erlang中封装binary数据指针时,尾部都会被贴上boxed标签(即最后2位为10B),指针所指向的内容首4字节(确切的说是sizeof(Eterm)字节)是一个header,从《Erlang数据类型的内部实现》一文中关于header的一段注释中可以看到:/* * HEADER representatio原创 2013-07-24 14:45:12 · 2193 阅读 · 0 评论 -
Erlang数据类型的内部实现
Erlang中有8种基础数据类型(integer、 float、 atom、 reference、 fun、 port、 pid、 binary)和两种复合结构(tuple、list)。在erl编程时,对这些数据类的内存分配及引用都是透明的,了解erl数据类型的内部实现,可以让我们更优更合理的运用数据类型,更好地评估程序性能。假设erl中有这么一组数据: 1、2、3、"a"、"b"、"c"原创 2013-07-22 11:15:45 · 3770 阅读 · 4 评论 -
Erlang中list和tuple的构建及转换的内部实现
Erlang数据类型的内部实现为探索erl内部的tuple和list的构造和内部实现,我们可以从list_to_tuple/1这个erlang的bif函数说起。先看看$ERL_TOP/erts/emulator/beam/bif.c文件中list_to_tuple/1函数的C源码。为了便于说明,对源码做了少量修改,并增加了一些变量打印。list_to_tuple/1的内原创 2013-07-22 16:34:54 · 5916 阅读 · 0 评论 -
Erlang二进制创建的内部机制和优化(二)
Erlang二进程创建的内部机制和优化(一)这一节以实例分析的方式继续探索二进制创建的内部机制。为了验证上一节的内容,首先在erl_bits.c中的erts_bs_appen函数里加入一些调试输出。void print_bin(char *title, unsigned char *data, int len){ Uint index = 0;原创 2013-07-27 08:20:04 · 1444 阅读 · 0 评论 -
Erlang虚拟机(VM)简介
Erlang代码是运行在Erlang的虚拟机(VM)上的,所谓虚拟,说它是虚拟一台真实的机器,还不如说它是虚拟了一个运行Erlang指令的CPU来得更确切。Erlang运行在虚拟机上,就好比C语言运行在真实的机器上。Erlang语言的代码在编译时,也有中间的汇编代码,了解它的汇编指令,可以进一步理解Erlang代码在VM里的运行机制。下面我们就把Erlang的Beam模拟器看作是一原创 2013-07-27 18:00:37 · 5976 阅读 · 0 评论 -
实例分析Erlang的汇编指令
《Erlang虚拟机(VM)简介》一文中介绍的寄存器和指令参数类型是学习Erlang VM相关知识的基础,也是理解本文内容的前提,这里就不赘述了。先看将要分析的实例的Erlang源代码:%% mytest.erl-module(mytest).-compile(export_all).%% 返回atomt1() -> ok.%% 调用BIFt2(A) ->原创 2013-07-27 23:33:08 · 2399 阅读 · 0 评论 -
实例分析Erlang二进制(Binary)匹配的内部机制
Erlang的二进制操作很简单很强大,《Erlang二进制创建的内部机制和优化》一文介绍了binary的创建,现在就来探索它的逆过程,匹配操作。下面是一个简单实例,它的功能是binary_to_list,把二进制流按字节匹配出来生成list。%% test.erl-module(test).-export([t/1,t2/4]).t(>) -> [H|t(T)];t原创 2013-07-28 13:44:52 · 1971 阅读 · 0 评论 -
实例分析Erlang二进制(Binary)的匹配优化
从《实例分析Erlang二进制(Binary)匹配的内部机制》一文中了解到二进制匹配机制,现在该是付诸行动、动手优化Erlang程序匹配操作的时候了。先看来自《Efficiency Guide User's Guide》的两个Erlang函数实例,它们的功能都是判断一个list和一个binary的内容是否相等。test.erl-module(test).-compile(ex原创 2013-07-28 17:28:34 · 3359 阅读 · 0 评论