当前位置:  开发笔记 > 编程语言 > 正文

erlang BEAM字节码

如何解决《erlangBEAM字节码》经验,为你挑选了2个好方法。

好吧,我希望我不会在这里打破一些垃圾邮件规则.我刚问了一个关于erlang编译器如何实现模式匹配的问题,我得到了一些很好的响应,其中一个是编译后的字节码(通过传递给c()指令的参数获得):

{function, match, 1, 2}.
  {label,1}.
    {func_info,{atom,match},{atom,match},1}.
  {label,2}.
    {test,is_tuple,{f,3},[{x,0}]}.
    {test,test_arity,{f,3},[{x,0},2]}.
    {get_tuple_element,{x,0},0,{x,1}}.
    {test,is_eq_exact,{f,3},[{x,1},{atom,a}]}.
    return.
  {label,3}.
    {badmatch,{x,0}}

它只是简单的二郎元组.我期待一些神秘的二元东西,猜不是.所以我在这里冲动地问这个问题(我可以看一下编译器的来源但是问题总是会因为额外的洞察力而变得更好),这个输出如何在二进制级别翻译?

{test,is_tuple,{f,3},[{x,0}]}的例子.我假设这是一条指令,称为'test'...无论如何,所以这个输出本质上是字节码级语言的AST,二进制编码只是1-1的翻译?这一切都是如此令人兴奋,我不知道我能否轻松地看到erlang编译器破坏了什么.

非常感谢



1> deepblue..:

好吧,所以我挖掘编译器源代码来找到答案,令我惊讶的是,使用'S'参数生成的asm文件到compile:file()函数实际上是按原样查询的(file:consult())和然后逐个检查元组以进行进一步的动作(第661行 - beam_consult_asm(St) - > - compile.erl).进一步在那里有一个生成的映射表(erlang源的编译文件夹),显示每个字节码标签的序列号,我猜这是用于生成字节码的实际二进制签名.好东西.但是你只需要使用consult()函数,你几乎可以使用随机语言的lispy类型语法,并完全避免使用解析器/词法分析器,只需将源代码查询到编译器中并用它做任务...代码作为代码的数据数据......


你看过Robert Virding的Lisp-Flavored Erlang(http://forum.trapexit.org/viewtopic.php?p=40268)

2> I GIVE CRAP ..:

编译器有一个所谓的模式匹配编译器,它将采用一种模式并将其编译为本质上是一系列分支,交换机等.Erlang的代码v3_kernel.erl在编译器中.它使用Simon Peyton Jones,"函数式编程语言的实现",可在线获取

http://research.microsoft.com/en-us/um/people/simonpj/papers/slpj-book-1987/

另一篇有价值的论文是Peter Sestoft撰写的论文,

http://www.itu.dk/~sestoft/papers/match.ps.gz

它通过检查更简单系统的部分评估来派生模式匹配编译器.这可能是一个更容易阅读,特别是如果你知道ML.

基本的想法是,如果你有,说:

% 1
f(a, b) ->
% 2
f(a, c) ->
% 3
f(b, b) ->
% 4
f(b, c) ->

假设现在我们有一个电话f(X, Y).说X = a.然后只有1和2适用.所以我们检查Y = b然后Y = c.如果在另一方面X /= a,然后我们知道我们可以跳过 1和2,并开始测试3和4的关键是,如果有任何符合它告诉我们一些有关在比赛可以继续,以及当我们做匹配.这是一组我们可以通过测试解决的约束.

模式匹配编译器寻求优化测试的数量,以便在得出结论之前尽可能少.静态类型语言在这里有一些优点,因为他们可能知道:

-type foo() :: a | b | c.

然后,如果我们有

-spec f(foo() -> any().
f(a) ->
f(b) ->
f(c) ->

我们没有匹配,f(a), f(b)那么f(c)必须匹配.如果不匹配,Erlang必须检查然后失败.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有