13

在 Programming Erlang 的开头,有以下内容:

是什么让 Erlang 成为您项目的最佳选择?这取决于您要构建的内容。如果您正在考虑编写数字运算应用程序、图形密集型系统或在手机上运行的客户端软件,那么抱歉,您买错书了。

隐含的信息是 Erlang 不适合计算昂贵的工作。是什么让 Erlang 如此不合适,或者我误解了?

4

3 回答 3

14

Erlang 适用于 I/O-bound 应用程序,即限制因素是 I/O 操作的延迟和吞吐量而不是指令可以通过 CPU 管道推送的速率的问题。Web 服务器和数据库是 I/O 密集型应用程序的好例子:限制因素可能是磁盘和网络,而不是 CPU。传统上“计算量大”的应用程序包括密码工具和科学模拟。

至于为什么 Erlang 在计算密集型问题上无法匹配 C 和 Fortran 等语言,我们必须考虑代码生成和缓存友好性等问题......我会尝试一下:

  • 代码生成:通常当你启动一个 Erlang 程序时,它会在基于线程代码的虚拟机BEAM 中运行。尽管 BEAM 对于大多数用途而言都表现得足够好,但与现代优化 C 编译器生成的那种代码相比,它的每个逻辑“指令”的开销要大得多。HiPE 项目为 Erlang 提供了本机代码编译器,该编译器在几年前已集成到主 OTP 源代码树中*。虽然它确实提高了 Erlang 的数字运算能力,但它仍然很难与编写良好的 C 或 Fortran 程序相匹敌。
  • 缓存友好性:内存系统是现代计算机的主要瓶颈:从主内存读取可能需要数百个处理器周期!为了解决这个问题,CPU 设计人员引入了多级缓存来隐藏内存延迟。缓存利用计算机程序的两个关键属性:时间空间局部性——也就是说,最近被引用的内存区域(和附近的区域)可能会再次被引用。像 C 和 Fortran 这样的语言对内存分配的位置和方式提供了很大的控制,使程序员能够调整算法以很好地使用缓存。对于像 Erlang 这样的动态语言,通常情况并非如此,其中内存分配对程序员隐藏,并由虚拟机自动处理。
  • 代码大小:关于空间局部性的论点也适用于代码;Erlang 代码,无论是原生还是字节码形式,通常都会比相应的编译 C 代码大。这导致指令高速缓存中更频繁的未命中。

请记住,这只是冰山一角,我绝不是 Erlang 或语言实现方面的专家。不过,不要让 Erlang 可能永远不会运行科学模拟的事实吓到你;对于许多应用程序来说,它是一种绝对出色的语言。

*HiPE 可通过 Debian 中的 erlang-base-hipe 软件包或./configure --enable-hipe源代码 tarball 获得。

于 2012-06-28T19:45:33.453 回答
10

只是 C 代码在大多数情况下可能会相当快。Erlang 擅长容错、分布式计算和并发。程序员往往同样精通编写 erlang 或其他语言,但如果您想要速度,请使用 C 或 C++,可能来自 erlang 端口,因此可以在您自己的 erlang 应用程序中使用此代码。

于 2012-06-26T19:11:49.277 回答
9

Erlang 是一种并发函数式编程语言,专为大型工业实时系统编程而设计。没有什么特别能阻止您开发“数字运算应用程序或图形密集型系统”,但该语言在实时事件处理中大放异彩。

于 2012-06-26T19:13:28.903 回答