一些背景
我正在致力于构建一种用于数字媒体编程的编程语言,它应该支持使用非共享消息传递和软实时的并发性(即尽最大努力计算音频/视频而不会丢失样本或帧并具有恒定的吞吐量) 。
事实证明,这两个功能很难结合起来,主要是因为一个特定的限制:实时代码不应该动态分配内存。
我的语言应该可以很容易地实现这样的事情:
- 一个线程根据参数计算音频样本。例如,这些可以是合成器的不同控件的值。该线程“实时”运行。
- 一个线程接收来自用户或另一台计算机的输入以更改这些值。例如,这可能是 GUI 线程,对用户用鼠标转动旋钮做出反应。
我希望用户设置的新值通过队列发送到合成器引擎。现在,如果我只想发送浮点数和其他原子值,那么问题就不再有趣了。其实我想要any一种数据能够从一个线程流到另一个线程,甚至是复杂的对象或数据结构,并且这对于线程和优先级的任何配置都应该是可能的。如果没有实时方面的动态内存分配,如果不对程序员施加看似任意的限制,这将变得非常困难。
Erlang 经常被宣传为非常适合实时系统。然而,我的理解是,Erlang 从来不会禁止内存分配。如果我这样做,就会解决很多问题,但代价是在执行这些分配的代码中引入非确定性时序。
问题
那么,是什么让 Erlang 如此适合呢?它是否实现了特殊技巧来规避内存分配引起的问题,还是完全忽略了该问题?是否采用另一种实时方法?
举个例子来说明问题
假设我们正在用 Erlang 编写一个合成器,它必须每 50 毫秒产生 64 个样本,否则声音中就会出现裂纹和爆音。我们还假设,当我在字符串上移动某个滑块时,必须将一个小对象(假设它是一个包含参数名称和新值的列表或元组)从 GUI 进程发送到音频进程,其中副本已创建。这将需要动态内存分配。 Erlang 如何帮助我确保此分配不会延迟我的音频计算?
实时代码can动态分配内存,只是需要更加小心。
In real hard实时动态内存处理将成为在确定系统是否可以在分配的时间内完成其必须完成的任务时必须考虑的另一个因素。困难是最坏的情况。
In soft实时通常足以检查动态内存处理不会花费太多时间并导致太长的暂停。软是平均情况。
erlang 系统对于软实时应用程序来说非常出色,动态内存处理相当高效,并且通常不会导致任何明显的暂停。虽然它可能会介绍some非决定论这本身不应该给你带来任何问题。我的意思是,如果时间对您来说很重要,那么您无论如何都应该为应用程序计时,例如,以便音频样本按时“到达”。
erlang 是否适合您的应用程序语言是一个完全不同的问题。尚未真正优化的一件事是数值计算。 Erlang 当然可以做到这些,但它的速度远不及低级语言。它们通常对于使用 erlang 的应用程序类型并不重要。不过,还有 Wings 3D,这是一款开源细分建模器,其灵感来自 Izware 的 Nendo 和 Mirai,是用 erlang 编写的。所以一切并非毫无希望。 :-)
实际上,找出答案的唯一方法是编写一个小测试并尝试一下。另一个问题是詹姆斯提到的,你更喜欢使用哪种类型的语言?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)