【问题标题】:What data structures and algorithms are not implementable in C? [closed]哪些数据结构和算法不能在 C 中实现? [关闭]
【发布时间】:2014-02-19 04:45:04
【问题描述】:

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

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

所以,归根结底,在我打完卡片之后,我想知道这个问题是否可能更多地是关于 C 编程语言设计,而不是编程的便利性和时间复杂度。例如,我可以在 Prolog 中实现一个高度复杂的算法,该算法非常优雅且很难以其他方式表达,但我仍然受到汇编指令和另一端的计算机体系结构(开/关)的限制棍子,所以我会在这里整晚。

【问题讨论】:

  • 我认为您的意思是“优雅”而不是“雄辩”。 :)
  • 在 C 中可能没有什么是做不到的,但是在很多情况下 vanilla C 是一个糟糕的选择,要么是因为它太原始且编码成本太高,要么是因为它太危险且容易出错。
  • @ooga - 这是一个语音合成应用程序。
  • 您说您理解“图灵完备”的含义,然后您问是否存在无法用 C 实现的算法。因此,我不相信您真的理解“图灵完备”的含义.我无法对这个问题做出正面或反面;你到底在问什么?
  • 基本上,如果你不能在 C 中做到这一点(问题不是由于需要对机器进行汇编级访问),那么你不能用任何其他语言做到这一点。

标签: c algorithm data-structures


【解决方案1】:

Shor's algorithm 用于在 O((log n)^3) 多项式时间内分解整数无法在 C 中实现,因为它可以运行的计算机尚未正式存在。也许有一天会有一个完整的 C 量子电路版本,我将不得不修改我的答案。

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

  • Vanilla,标准 C 可能无法利用处理器的整个功能集。例如,您无法明确使用最新 Intel 处理器的 TSX 功能。您当然可以使用操作系统原语、内联汇编、语言扩展或第三方库来规避这种情况。
  • C 本身并不擅长并行/异步/并发/分布式编程。 Haskell(也许Data Parallel Haskell 很快?)、Erlang 等可能使该领域的许多任务变得无限容易的一些语言示例,它们提供了非常快速和轻量级的线程/进程和异步 I/O。在 C 中使用绿色线程和大量异步 I/O 可能不太愉快,尽管我确信可以做到。
  • 最后,在用户层面,您当然可以用任何其他语言来模拟每种图灵完备语言,正如您正确指出的那样。

【讨论】:

  • 您也可以将汇编包含到 C 中,这意味着解释器所做的任何事情,您也可以。但我想这不会被认为是“香草”
  • @Niklas B. - 这是一个非常有趣的算法。我想一切最终都是硬件架构的结果。我添加处理器并使用 openCL,我有很好的并行性,但正如上面指出的那样,这不是普通的。
  • @Stix:当有人执行它并阅读你所有的私人 RSA 加密邮件时,我变得更加有趣 :)
【解决方案2】:

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

C 特别是作为一种“高级汇编语言”的功能,因为它可以让您摆脱许多最新语言无法做到的事情,因此可能会允许更难实现的解决方案。严格检查的语言。

这并不意味着 C 是所有这些目的的最佳语言。它迫使您在许多领域更加关注细节,从内存管理到边界检查再到面向对象(您可以用 C 编写 OO 代码,但您必须从头开始实现它)。您必须显式加载和调用库,以获取可能内置到其他语言中的内容。 C 数据类型可能非常复杂(尽管 typedef 和宏可以隐藏大部分复杂性)。以此类推。

对于任何给定任务,最好的工具是 (a) 你现在或可以变得舒服的工具; (b) 这非常适合手头的任务,并且 (c) 你有空。

【讨论】:

  • 感谢您的回复,C语言上的很多优点。
【解决方案3】:

看看图灵完备性:Turing Completeness

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 2018-12-22
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多