Joe Armstrong撰写的“编程Erlang”一书的第57页(2007)'list:map / 2'以下列方式提到:
我写的所有模块实际上都使用了类似的功能 列表:map / 2 - 这是如此常见,我几乎考虑地图 成为Erlang语言的一部分。调用这样的功能 因为模块列表中的映射和过滤器和分区是极其重要的 常见的。
“几乎”这个词的用法让我对Erlang作为一个整体和Erlang语言之间的差异感到困惑,如果甚至有差别的话。我的混淆是基于“语言”这个词的语义吗?在我看来,好像一个标准模块漂浮在它所实现的实际语言的边界周围。它的核心编程语言和它们中实现的标准库之间有什么区别?
我知道这是一个非常新的问题,但根据我的经验,跳到我自己的结论会导致坏事。我希望有人可以稍微澄清一下。
答案 0 :(得分:1)
考虑这个简单的程序:
1> List = [1, 2, 3, 4, 5].
[1,2,3,4,5]
2> Fun = fun(X) -> X*2 end.
#Fun<erl_eval.6.50752066>
3> lists:map(Fun, List).
[2,4,6,8,10]
4> [Fun(X) || X <- List].
[2,4,6,8,10]
两者都产生相同的输出,但第一个list:map/2
是库函数,第二个是核心的语言构造,称为list comprehension。第一个是implemented in Erlang(意外地也使用列表理解),第二个是parsed by Erlang。只有编译器能够在Erlang中优化其实现时,才能优化库函数。但是,只要在Beam VM中使用汇编程序编写并从结果beam
文件调用以获得最佳性能,就可以优化列表推导。
某些语言结构看起来像是语言的一部分,而实际上它们是在库中实现的,例如spawn/3
。当它在代码中使用时,它看起来像一个关键字,但在Erlang中,它不是reserved words中的一个。因此,Erlang编译器会自动在其前面添加erlang
模块并调用erlang:spawn/3
,这是一个库函数。这些函数称为BIFs(内置函数)。
一般来说,属于语言本身的是该语言编译器可以解析并转换为可执行代码的内容(换句话说,由language's grammar定义的内容)。其他一切都是图书馆。图书馆通常用他们设计的语言编写,但并非必须如此,例如,一些Erlang库函数是使用C作为Erlang NIF s。
编写的