确定性语言的适用性

时间:2011-08-16 17:27:15

标签: java c++ multithreading

现场出现了新的确定性语言,用于确定性地执行在多核上运行的多线程软件,例如Cilk++Deterministic Parallel Java

现在我的问题是,这些语言可用于实现任何类型的算法或仅用于特定算法。换句话说,这些语言是否以任何方式限制程序员?

2 个答案:

答案 0 :(得分:5)

“算法”的最常见定义不允许算法指定Turing machine无法执行的计算。假设您正在使用其中一个传统定义,

没有。可以用图灵完整语言指定所有图灵机(模数资源限制)。这些确定性语言总体上是图灵完整的。

也就是说,由于硬件接口原因,您可能无法编写某些类型的软件(而不是算法),例如需要与volatile memory处理好的设备驱动程序,而专用软件有时会因为安全性而无法预测原因,例如生成cryptographically strong密钥,盐或nonce。密码强的PRNG是确定性的,但生成密钥的最佳方法是通过真正的随机源。

作为一个例子,一个最小的JavaScript(并且只有JavaScript;没有DOM绑定)解释器减去Math.randomDate.now以及一些其他非确定性来源,因为它{{3指定交错。 JavaScript是一种图灵完备语言,可以表达像Java这样的语言可以使用的任何算法。您可以在该基本JavaScript中包含setTimeout之类的工具,该工具仅允许0作为延迟,以允许确定性延迟评估,从而提供切片时间的丰富确定性方法。

event-loop concurrency model是另一种事件循环并发语言,具有图灵完备的富有表现力的确定性子集。

Verilog是图灵完整的Java子集,旨在提供确定性保证,作为提供Joe-E的一部分,尽管它试图支持Java的线程模型。

除了事件循环并发之外,还有各种"Verifiable Functional Purity in Java"提供确定性,如actor model所述

答案 1 :(得分:0)

如果某些算法具有一定的随机性(蒙特卡罗算法),它们的效果最好。 但是,您可以使用Mersenne twister或类似的随机数生成器来模拟随机性。因此,通过使用RNG,您可以模拟非确定性行为。我不知道为什么会这样做呢。

非确定性的多线程可用作随机源, 所以你真的需要一些随机事件,然后使用非确定性MT可以是这样的来源,但可能有一百万个更好的选择(比如上线,下载天气数据)......