[Erlang]如何添加自己的BIF

步骤

1. 运行configure

2. 将你的bifs添加至erts/emulator/beam/bif.tab

bif re:grep/2 bif re:compile/1

3. 创建一个C代码文件

erts/emulator/beam/erl_bif_re.c

4.将你的C代码文件添加至erts/emulator/<arch>/Makefile里

RUN_OBJS = $(OBJDIR)/erl_bif_re.o \


5. implement your bifs by stealing bits from existing erl_bif_*.c files

参考其余的erl_bif_*.c文件,加入下面这段代码

?


1

2

3

4

5

BIF_RETTYPE re_grep_2(BIF_ALIST_2){

  Eterm result;

  result = magic_function();

  BIF_RET(result);

}


6. 运行make; make install

重点回顾:

步骤0-3只需执行一次,如果你将下面的bif

?


1

bif re:grep/2

添加至bif.tab时,erl_bif_re.c文件要实现下面这个函数

?


1

BIF_RETTYPE re_grep_2(BIF_ALIST_2);

时间: 2024-11-17 10:00:47

[Erlang]如何添加自己的BIF的相关文章

分析erlang进程监控的实现

Erlang支持Monitor和Link两种监控进程的方式,使得所有进程可以连成一个整体.当某个进程出错退出时,监控进程会收到该进程退出的消息通知.有了这些特点,使用Erlang建立一个简单,并且健壮的系统就不是什么难事.前面有文章分析了两种方式的用法,这里分析下monitor和link的实现. 源码分析 monitor 和link实现有点类似,下面以monitor为例做说明(erlang版本R16B02) erlang:monitor/2的实现 // bif.c 实现 erlang:monit

erlang虚拟机代码执行原理

erlang是开源的,很多人都研究过源代码.但是,从erlang代码到c代码,这是个不小的跨度,而且代码也比较复杂.所以这里,我利用一些时间,整理下erlang代码的执行过程,从erlang代码编译过程,到代码执行过程做讲解,然后重点讲下虚拟机执行代码的原理.将本篇文章,献给所有喜欢erlang的人. erlang代码编译过程 erlang对开发者是友好的,从erlang程序文件编译成能被erlang虚拟机识别的beam文件,在这个编译过程还对开发者暴露中间代码.借助这个中间代码,我们就可以逐步

从erlang时间函数说到时间校正体系

很多人会注意到这个问题,erlang提供了2个时间函数,erlang:now() 和 os:timestamp().用法一样,都是返回当前的时间.具体时间是从1970年1月1日零时算起,到现在经过的时间,结果为{MegaSecs, Secs, MicroSecs}. 这两个函数有什么区别? os:timestamp() 获取到的时间为操作系统的时间,不做任何修正:而erlang:now(),每次获取都会确保生成了唯一的时间,就是说,erlang:now()在实现上对时间做了一个校正,每次都生成一

分析erlang热更新实现机制

Joe Armstrong在描述Erlang的设计要求时,就提到了软件维护应该能在不停止系统的情况下进行.在实践中,我们也因为这种不停止服务的热更新获益良多.那么Erlang是如何做到热更新的呢?这就是本文要讨论的问题. 在前面的文章也说到了.erlang VM为每个模块最多保存2份代码,当前版本'current'和旧版本'old',当模块第一次被加载时,代码就是'current'版本.如果有新的代码被加载,'current'版本代码就变成了'old'版本,新的代码就成了'current'版本.

erlang判断模块导出函数问题

erlang本身提供一个接口,可以用来检查模块是否有导出函数,这个接口是erlang:function_exported/3,但是很多时候这个接口无法正常使用. 下面重现一下这个问题: 1> erlang:function_exported(crypto,start,0). false 2> crypto:start(). ok 3> erlang:function_exported(crypto,start,0). true 注意:例子中并不是说一定要crypto:start()才能使

erlang二进制数据垃圾回收机制

erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内.假设超过了64 bytes.就被保存到进程外的共享堆里,能够给节点内全部进程共享. erlang有两种二进制容器:heap binaries和refc binaries. heap binaries Heap binaries are small binaries, up to 64 bytes, that are stored directly on the process heap. They

erlang 健壮性

erlang 提供了简单易用的并发编程模型,基本不需要再考虑多线程并发问题.但实际应用中并不是那么的完美,很多地方需要注意,标准库也很坑人的:再者多线程编程很多很容易解决的事情,在erlang中是那么的蛋疼和无奈,嗯,erlang只是专注于自己擅长领域,慎入. 1.进程message_queue_len 很多问题归根结底都处在message_queue_len 太长,每个进程都带着一个buffer 无限的queue,嗯,来着不拒. queue 因为各种各样原因消费不过来,经典的gen_serve

erlang_base01_语法

##erlang学习总结 ###1.退出,输入 haut(). ###2.-module ###3.module_name:function_name( arguments ) 例如调用tut:double(10),说明调用tut模块的double函数. ###4.模块名为tut -module(tut). -export( [double/1, fact/1] ). double(X)-> 2 * X. fact(1) -> 1; fact(N) -> N*fact(N-1). 分号表

centos 7下rabbitmq安装

安装erlang环境 添加rabbitmq依赖的erlang yum命令repos # In /etc/yum.repos.d/rabbitmq-erlang.repo [rabbitmq-erlang] name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7 gpgcheck=1 gpgkey=https://www.rabbitmq.com/rabbitmq-release-signing