首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >今天的现代编译器是否执行运行时检查?

今天的现代编译器是否执行运行时检查?
EN

Software Engineering用户
提问于 2015-02-26 11:53:54
回答 2查看 278关注 0票数 1

这是关于编译器的。

编译器是否执行运行时依赖检查以决定将循环向量化?换句话说,编译器是否像在运行时一样通过逻辑进行跟踪,以确定循环是否可以向量化?

是在编译器编译代码时,如果启用了自动向量化(默认),那么输出就是以AVX程序集指令为目标的向量化代码,那么它什么时候执行依赖项检查?

EN

回答 2

Software Engineering用户

发布于 2015-02-26 18:12:25

对于编译器执行运行时检查(查找编译时找不到的警告和错误,包括循环矢量化),它开始危险地接近停车问题。

艾伦·图灵在1936年证明了解决所有可能的程序输入对停止问题的通用算法是不存在的。证明的一个关键部分是计算机和程序的数学定义,它被称为图灵机;停止问题在图灵机器上是无法判定的。这是决策问题的第一个例子之一。

考虑以下Java程序:

代码语言:javascript
复制
public class Halting {
  public static void main(String... args) {
    while(isCondition()) {

    }
  }

  private static boolean isCondition() {
    return true;
  }
}

此程序不返回编译器的错误或警告。它必须通过逻辑跟踪才能看到它是一个无限循环。怎样才能阻止理论运行时检查器以同样的方式陷入无限循环中呢?编译器不能被困在无限循环中,它不够聪明。

另一方面,请注意,这确实有一个错误:

代码语言:javascript
复制
public class Halting {
  public static void main(String... args) {
    String foo = null;
    System.out.println(foo.charAt(0));
  }
}

这就产生了警告:

空指针访问:变量foo只能在此位置为空。

这样的检查是编译器能做的最好的。但请注意,这没有任何警告,即使这是相同的问题:

代码语言:javascript
复制
public class Halting {
  public static void main(String... args) {
    String foo = getFoo();
    System.out.println(foo.charAt(0));
  }

  private static String getFoo() {
    return null;
  }
}
票数 5
EN

Software Engineering用户

发布于 2015-02-26 18:46:10

我认为没有,但这应该是可能的。例如,gcc 4.8 (向下滚动到IA-32/x86-64部分)具有内置的__builtin_cpu_supports函数和函数多版本控制支持,开发人员可以使用它为不同的体系结构编写不同的代码。我不明白为什么编译器不能自动使用这些特性生成依赖于运行时的不同代码页。

例如,手动:

代码语言:javascript
复制
__attribute__ ((target ("default")))
int foo(void)
{
  return 1;
}

__attribute__ ((target ("sse4.2")))
int foo(void)
{
  return 2;
}

int main (void)
{
  int (*p) = &foo;
  assert ((*p)() == foo());
  return 0;
}
票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/274547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档