【问题标题】:What Turing complete macro languages are available for C/C++哪些图灵完备的宏语言可用于 C/C++
【发布时间】:2011-11-11 09:04:02
【问题描述】:

序言

Lispers 声称相对于更多“主流”语言的优势之一是宏语言实际上是图灵完备的(我不记得这是 On Lisp 中的 Paul Graham 还是它是 Land Of Lisp)1 中的 Conrad Barski,至少在外人看来,这似乎是正确的——C/C++ 中的预处理器指令似乎并不图灵完备(老实说,它们更像是一种注释语法)。

现在...问题

  1. 这是一个准确的评估吗?只涉足 C 语言,这让我觉得这是 Lispers 过分热心的另一点
  2. 是否有值得注意的图灵完备宏语言(用于 C/C++)?
    • 是否有任何正在进行中或失败的尝试可能值得在未来寻找?
    • 我听说 Python 现在可以作为编译 C/C++ 的主干(暗示 Python 可以用来编写宏),但我还没有看到证实这一点。是真的吗?

(我不会问诸如“什么是最好的......”之类的意见问题)

1.顺便说一句,这两本书都非常好,只是说'

【问题讨论】:

  • (您可能希望暂停一分钟来考虑一下 Lisper 立场的幽默——Lisp 来自 Church/McCarthy 学派,但它正在谈论图灵完备性(这并不是说两者是互斥的!只是起源描绘了一个跨标准。))
  • “宏语言”是什么意思? C 和 C++ 中唯一的宏是 #define 宏和模板。模板是图灵完备的,#define 宏不是。如果您只是在谈论代码生成,那么显然,您可以从以任何语言编写的应用程序生成 C/C++ 代码。
  • C++ 模板已经完成。它们真的很难使用,并且无法像 lisp 可以操作 lisp 代码一样创建和操作代码。
  • “又一个 Lispers 过于热心的地方” 然而 另一个 笼统的概括。 C++ 程序员总是进行全面概括。
  • 在将自己喜欢的语言与另一种语言进行比较时,他们不会是第一个“忘记”某些事实的人。但是在你提出指控之前,你可能想检查他们是否真的在谈论 C++ 而不是明确地谈论预处理器。另外,我很确定重点不是图灵完整性而是homoiconicity,至少通常是当这个话题出现时......

标签: c++ c compiler-construction macros


【解决方案1】:

C 宏实际上是图灵完备的,如果处理不止一次。查看this related question,尤其是在接受的答案中链接到的Turing machine implementation

但是,是的,这是作弊。那里使用的解决方案强烈暗示 C 宏确实不是图灵完备的。

【讨论】:

  • 正如该问题的最佳答案所述,PP 本身并不完整,它需要构建脚本以使其运行多次。我猜这是因为 PP 拒绝扩展递归宏。
【解决方案2】:

关于 C 预处理器不是图灵完备的评估既准确又毫无意义。任何对于 C 预处理器来说过于复杂的计算,如果用预处理器(例如代码文本操作)术语来表述,很可能难以理解并且应该被编码。

C++ 模板是预处理器魔法的既定继承者,并且比那些模板更容易理解。所以,Lispers 又一次完全正确,没有抓住重点,就像往常一样:-)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 2011-02-05
    • 2010-09-14
    • 2011-04-05
    • 1970-01-01
    • 2010-10-03
    • 2011-06-21
    • 2023-03-07
    相关资源
    最近更新 更多