一些背景知识
我正在建设一个编程语言,用于数字媒体节目,这应该不使用共享的消息传递和软实时支持并发(即尽最大努力计算音频/视频,而不会丢失样本或帧,并以恒定的吞吐量) 。
事实证明,这两种功能都相当困难结合起来,主要是因为一个特定的约束:实时代码不应该动态分配内存。
我的语言应该可以很容易实现这样的事情:
- 一个线程计算基于参数音频样本。 这些可以是,例如,一个合成器的不同的控制的值。 该线程运行“实时”。
- 一个线程接收来自用户或来自另一计算机输入来改变这些值。 这可能是GUI线程,例如,反应用户用鼠标的旋钮转动。
我想用户所设置的新值,通过队列来合成引擎发送。 现在,如果我只是想送浮标和其他原子值这个问题不会很有趣。 其实,我想任何类型的数据,以便能够从一个线程流向另一个,甚至是一个复杂的对象或数据结构,这应该线程和优先事项的任何配置是可能的。 而对实时端的动态内存分配,这将成为没有施加什么好像对程序员任意限制非常困难。
二郎经常做广告作为一个非常适合实时系统。 我的理解是,二郎不绝,但是,不允许内存分配。 如果我做了同样的,它将使很多问题消失,在执行这些分配的代码引入非确定性时间的成本。
问题
是什么让这样二郎山一个不错的选择? 是否实行特殊的技巧来规避内存分配引起的问题,或者它完全忽略的问题? 是否采取另一种方法来实时?
一个例子来说明这个问题
让我们假设我们正在写在二郎山,具有生产64个样本每50毫秒的合成,否则有在声音裂缝和持久性有机污染物。 让我们假设,当我走动一些滑块在弦上,一个小物体(让我们说这是一个列表或含参数的名称和新值的元组)必须从GUI程序发送到音频处理,其中创建副本。 这将requrie动态内存分配。 二郎将如何帮助我确保这种分配不耽误我的声音计算?
实时代码可以动态分配内存,它只是要多加小心了。
在真正的硬实时的动态内存处理只会成为另一个的那些有工作时的系统是否可以做什么它必须在规定时间内时要考虑的因素。 硬盘是最坏的情况。
在软实时它通常是足以检查动态内存处理不会采取太多的时间和导致过长的停顿。 软是平均情况。
Erlang的系统正好相当的软实时应用程序的不错,动态内存处理是合理有效的,通常不会造成任何明显的停顿。 虽然它可能会推出一些非确定性,这本身应该不是你的任何问题。 我的意思是,如果时间对你很重要,那么你无论如何都应该进行定时的应用程序,例如,使音频采样时间“到达”。
这是一个完全不同的问题,如果Erlang是为您的应用正确的语言。 有一件事情一直没有得到真正的优化是数字计算。 当然二郎可以做出来,但它已无处低级语言的速度。 他们一般都没有到过二郎山已用于该类型的应用的关键。 但话又说回来有翅膀3D,一个开源的细分建模者将从Izware由Nendo和未来的启发,这是写在二郎山。 因此,所有并非全无希望。 :-)
真正找出的唯一方法就是写一个小测试,并尝试一下。 另外一个问题是什么詹姆斯提到的,你更愿意使用哪种语言?
由于二郎是由爱立信通信在电信应用创建的,快速和可扩展是一个重要的考虑因素。
你可能想看看这篇文章就试图让二郎准备硬实时的应用程序,看看他们需要克服的是什么问题。 http://lambda-the-ultimate.org/node/2954
您可能会发现一些仍在有可能是一个表明,塞你的应用程序还解决好。
您也可以找到这个的兴趣,FP会比OOP不同,所以你们中的一些OOP中遇到的问题将在FP领域不同。 http://blog.ribomation.com/2009/06/28/the-ups-and-downs-of-erlang/
在函数式编程,一旦你设置一个变量是不变的,通常,这样你就不会创造大量新的对象。 通过递归你会发现,你将有较少的变量,因此垃圾回收变得越来越重要,这可能有助于解决您遇到的内存问题。
但是,你需要看到您的问题将在FP工作得很好,因为它并不适用于所有情况下的最佳语言。
在结束第1章,利尼/汤普森书,这是优异的,它谈论代码SLOC差与一个C ++电信应用:作为C 85%++代码是防御编码,内存管理,高级别通信,这是非常不必要的在功能相当二郎代码。
看看,如果你在书店或可以从别人借钱。
也读到研成硬实时应用
http://lambda-the-ultimate.org/node/2954
http://www.scribd.com/doc/415282/05nicosi
我真的不这样一个问题达成一致。 它要求太多。
“......这需要动态内存分配,如何将二郎山帮助我确保这种分配不耽误我的声音计算?”。
这是不可能的,有相应的工具(在二郎山或任何其他语言)给你提前这样的保证。
这一直是使用的一种方法是定时测试或基准。
如果你想证明你的代码不会耽误您的音频计算,你将有可能需要自己构建这方面的证据。 但在证明步骤可能依赖于以前的计时测试。