【问题标题】:Erlang: Compute data structure literal (constant) at compile time?Erlang:在编译时计算数据结构文字(常量)?
【发布时间】:2012-02-07 16:47:27
【问题描述】:

这可能是一个幼稚的问题,我怀疑答案是“是”,但我没有运气在这里和其他地方搜索“erlang 编译器优化常量”等术语。

无论如何,erlang 编译器能否(将)在编译时创建一个常量或字面量的数据结构,并使用它而不是创建代码来一遍又一遍地创建数据结构?我将提供一个简单的玩具示例。

test() -> sets:from_list([usd, eur, yen, nzd, peso]).

编译器能否(将)简单地将集合粘贴到函数的输出处,而不是每次都计算它?

我问的原因是,我想在我正在开发的程序中有一个查找表。该表只是可以在编译时计算(至少理论上)的常量。我想只计算一次表格,而不必每次都计算。我知道我可以通过其他方式做到这一点,例如计算事物并将其存储在流程字典中(或者可能是 ets 或 mnesia 表)。但我总是从简单开始,对我来说,最简单的解决方案是像上面的玩具示例一样,如果编译器对其进行优化。

如果这不起作用,还有其他方法可以实现我想要的吗? (我想我可以研究一下解析转换,如果它们可以解决这个问题,但这比我想要的要复杂吗?)

这只是在。我使用带有“S”选项的 compile:file/2 来生成以下内容。我不是 erlang 汇编专家,但似乎没有执行优化:

{function, test, 0, 5}.
{label,4}.
    {func_info,{atom,exchange},{atom,test},0}.
  {label,5}.
    {move,{literal,[usd,eur,yen,nzd,peso]},{x,0}}.
    {call_ext_only,1,{extfunc,sets,from_list,1}}.

【问题讨论】:

    标签: erlang compiler-optimization


    【解决方案1】:

    不,erlang 编译器不会对set 是的外部模块的调用执行部分评估。你可以使用著名的parse_transct_expand 模块来实现这个效果。

    【讨论】:

      【解决方案2】:

      如果该集合不是 erlang 的本机数据类型,并且(事实上)它只是一个用 erlang 编写的库,我认为编译器在编译时创建集合是不可行的。

      【讨论】:

      • 这套只是一个例子——不要以此为基础。如果您暗示 Erlang 将使用某些数据结构进行此优化,哪些符合条件?
      • @XZ,我想这对你来说可能很有趣forum.trapexit.org/viewtopic.php?t=6009
      【解决方案3】:

      如您所见,集合在 erlang 中没有优化(与任何其他用 erlang 编写的库一样)。 解决问题的方法是计算一次集合并将其作为参数传递给函数或使用 ETS/Mnesia。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 1970-01-01
        • 2018-11-13
        相关资源
        最近更新 更多