C中无法实现哪些数据结构和算法?

时间:2014-01-28 03:21:16

标签: c algorithm data-structures

这可能听起来很幼稚,但是在有足够的代码的情况下,是否存在无法在C中构造的任何数据结构/算法?我理解图灵完成的论点。我也知道拥有一个优雅的解决方案是有益的,时间复杂性很重要(即在Ruby / Java / C#/ Haskell / Lisp中实现时更具表现力或简洁性)。我研究或使用的所有语言似乎都已创建或随后重构为基于C的编译器,解释器和/或虚拟机。一些复杂的数据结构是否只能通过解释器和/或虚拟机实现?如果该虚拟机或解释器是基于C的,那么这不仅仅是底层C代码的另一个数据结构抽象吗?即C具有简单类型系统,但是作为动态类型系统的基础。我很惊讶地发现使用预处理器(ioccc.org Immanuel Herrmann)在C语言中可能会出现元编程。我也看到了一些模仿Erlang并发模型的有趣C算法,但不记得源代码。

启发这个问题的是StackOverflow帖子(Lesser Known Useful Data Structures)和Patrick Dussud在channel9(Garbage Collection - Past, Present and Future)上的访谈 - 解释他们如何编写第一个CLR垃圾收集器(用Lisp编写,目标是JVM) ,从Lisp编译为C ++ for CLR)。

所以,在一天结束时,在我完成打卡之后,我想知道这个问题是否可能更多是关于C编程语言设计而不是编程方便和时间复杂性。例如,我可以在Prolog中实现一个非常优雅且非常难以理解的任何其他方式的高度复杂的算法,但我仍然受到组装指令和计算机体系结构(开/关)的限制。棒,所以我整晚都在这里。

3 个答案:

答案 0 :(得分:15)

用于在O((log n)^3)多项式时间内对整数进行分解的

Shor's algorithm无法在C中实现,因为它可以运行的计算机尚未正式存在。也许有一天会有量子电路完整版的C,我将不得不修改我的答案。

开玩笑说,我认为没有人能给你一个满意的答案。我将尝试涵盖一些方面:

  • Vanilla,标准C可能无法使用处理器的整个功能集。例如,您无法明确使用最新Intel处理器的TSX功能。您当然可以使用操作系统原语,内联汇编,语言扩展或第三方库来规避这一点。
  • C本身并不擅长并行/异步/并发/分布式编程。在这个领域可能会使很多任务变得无比容易的语言的一些例子是Haskell(很快就可以Data Parallel Haskell),Erlang等提供非常快速和轻量级的线程/进程和异步I / O.在C中使用绿色线程和大量异步I / O可能不太令人愉快,尽管我确信它可以完成。
  • 最后,在用户级别的方面,当然你可以模仿每个图灵完整语言,正如你所指出的那样。

答案 1 :(得分:6)

任何Turing-complete机器或语言都可以实现任何其他图灵完备语言,这意味着如果没有其他方法,它可以通过解释实现任何其他图灵完备语言的任何程序。所以你问的问题是不正确的;问题不在于任务是否可以完成,而是你必须努力完成任务。

特别是C语言几乎作为“高级汇编语言”起作用,因为它可以让你逃脱更多近期语言所不具备的东西,因此可能会让更难实现的解决方案更多强烈检查的语言。

这并不意味着C是所有这些目的的最佳语言。它迫使你在内存管理,边界检查和面向对象等许多方面更加注重细节(你可以在C中编写OO代码,但你必须从头开始实现它)。您必须为可能构建到其他语言中的内容显式加载和调用库。 C数据类型可以令人难以置信地复杂化(尽管typedef和宏可以隐藏大部分复杂性)。等等。

任何特定任务的最佳工具是(a)你是或可以变得舒适的工具; (b)这非常适合手头的任务,(c)你有可用的。

答案 2 :(得分:2)

看看图灵的完整性:Turing Completeness

基本上,任何图灵完成的语言都可以执行所有图灵可计算功能。 C是图灵完整语言,所以理论上你可以在C中实现任何已知的可解算法(尽管它可能非常低效)。