C# 4.0 编译时图灵是不是完整?

Posted

技术标签:

【中文标题】C# 4.0 编译时图灵是不是完整?【英文标题】:Is C# 4.0 compile-time turing complete?C# 4.0 编译时图灵是否完整? 【发布时间】:2012-08-12 15:28:27 【问题描述】:

众所周知,C++ templates are turing-complete、CSS is turing-complete (!) 和 C# overload resolution is NP-hard(即使没有泛型)。

但是 C# 4.0(具有协/逆变、泛型等)编译时图灵完备吗?

【问题讨论】:

【参考方案1】:

与 C++ 中的模板不同,C#(和其他 .net 语言)中的泛型是运行时生成的功能。编译器会进行一些检查以验证使用的类型,但实际替换发生在运行时。如果我没记错以及preprocessor directives,Co 和逆变也是如此。很多 CLR 魔法。

(在实现层面,主要区别在于 C# 泛型类型替换在运行时执行,泛型类型 从而为实例化对象保留信息)

参见 MSDN

http://msdn.microsoft.com/en-us/library/c6cyy67b(v=vs.110).aspx

更新: CLR 通过存储在与已编译程序集关联的元数据中的信息进行预执行类型检查 (Vis-à-vis Jit Compliation),它作为其众多服务之一执行此操作 (ShuggyCoUk answer on this question explains it in detail)(其他包括内存管理和异常处理)。因此,我会推断编译器将状态理解为进程,并将状态理解为机器内部状态(TC,部分意味着能够参考以前的数据(符号)来查看数据(符号),有条件地评估)(我犹豫是否要说明TC 的确切定义,因为我自己不确定我是否完全掌握了它,所以请随时填写空白并在适用时纠正我)所以我会说有点忐忑,是的,是的,可以。

【讨论】:

泛型在运行时被实例化,你是对的。但是“一些检查”也很可能是图灵完备的。你永远不知道 :) 此外,预处理器指令是编译时的。 预处理器指令是编译时的,你说得对,先生。我的错,让我改正。 但是你说 C# 没有预处理器。我提到编译器确实如此,我对此进行了更正。我在重复什么?此外,在添加了 .NET 运行时的附加功能之后,OP 还专门询问了编译器是否为 TC。虽然我同意这不是一个完整的答案,但我认为它至少部分解决了 OP 对编译器的疑惑。 嗯,在更新答案后,如果我们将 JIT 视为 C# 编译器的一部分,那么它肯定是图灵完备的。虽然不是 :) 但是你让我想到了编译的 TypeRef 解析步骤,我想我可以在这个中编码一个图灵机。所以,我想我现在会接受这个答案并尝试 :) 好吧,感谢您提出有趣的问题。当你有东西时发表评论。我很想知道你是怎么做的。

以上是关于C# 4.0 编译时图灵是不是完整?的主要内容,如果未能解决你的问题,请参考以下文章

C# 4.0中的动态类型和动态编程

这个对象生命周期扩展闭包是 C# 编译器错误吗?

针对 .NET Framework 3.5 编译的项目允许 C# 4.0 功能

如何使用 C# 4.0 编译器让 MonoDevelop 以 .NET 2.0 框架为目标?

使用vs2015编译器编译libpqxx时发生的错误以及解决办法

为 iOS 4.0 编译 pjsip