【问题标题】:Intelligent compilers can't prevent infinite loops and SQL Cartesian joins [closed]智能编译器无法防止无限循环和 SQL 笛卡尔连接 [关闭]
【发布时间】:2013-11-08 02:08:11
【问题描述】:

由于以下两个问题,我的程序崩溃了,这让我很沮丧:

  • 无限循环(例如 C# 或 Javascript)
  • SQL 连接我忘记添加连接子句的地方

如果编译器足够称职,这些问题似乎是可以预防的。如何以编程方式预防这些问题?

【问题讨论】:

  • 简单。不要写无限循环,也不要忘记添加一个JOIN。
  • 如果笛卡尔积是您真正想要的怎么办?毕竟,它们有时很有用。但是要回答这个问题,即使只是在一个神秘的评论中,它也被称为The Halting Problem。事实证明,检测无限循环(可能)是一个np-Hard 问题。
  • 编译器不应该是“智能的”,这是程序员应该在关系中提供的。编译器也应该按照你告诉他们的去做。
  • 另外,如果你学过编程,你可能会意识到编写一个可以判断其他程序是否会停止的程序存在一定的问题。
  • @JoelCoehoorn 这不仅仅是 NP 难,这是不可能的。

标签: c# sql loops cartesian-product


【解决方案1】:

出于优化原因,现代编译器可以并且执行展开循环,但在不提前知道一些数据的情况下,甚至无法对循环是否会终止进行启发式(参见:dataflow programming)。事实上,决定你的程序本身是否会终止被称为Halting Problem

在其他情况下,您想要无限循环。例如,图形引擎通常会这样做:

while(true)
   render

至于你的 SQL 连接......我想当你错过一个时应该很明显。在某些情况下,当您不提供 INNER JOIN 时,就隐含了,因此从这个意义上说,您的编译器正在修复这个确切的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-04
    • 2010-10-24
    • 2012-10-18
    • 1970-01-01
    • 2018-10-13
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多