2

我现在正在编写一种可以编译为 C 的语言,当我说 IL 时,我的意思是因为 C 是我编写代码的语言,然后由另一个 c 编译器(例如 gcc 或 clang)生成程序集。

我生成的C代码,会不会更有利于:

  • 如果我做一些简单的选择传递(不断传播,删除死代码,......)这会减少 C 编译器必须做的工作量,还是因为它不是真正的人类 C 代码而使其变得更难?
  • 如果我要编译成三地址代码或 SSA 或其他形式,然后将其输入到带有函数、标签和变量的 C 程序中——这会使 C 编译器更容易还是更难优化?

哪种链接在一起形成以下问题...

  • 从编译为 C 的语言生成良好 C 代码的最佳方法是什么?
  • 是否值得进行任何优化并将其留给编译器?
4

1 回答 1

1

通常,进行窥视孔类型优化没有多大意义,因为 C 编译器会简单地为您完成这些。代价高昂的是 a) 浪费或不必要的“礼物包装”操作,b) 内存访问,c) 分支错误预测。

对于 a),请确保您没有传递过多的数据,因为虽然 C 会进行持续传播,但它可以检测到两个缓冲区实际上是相同基础数据的别名的程度是有限的。对于 b) 尽量保持函数的简短性和对相同数据的操作,同时限制堆内存的使用以提高缓存性能。对于 c),编译器理解 for 循环,它不理解 goto 循环。所以它会认为

for(i=0;i<N;i++) 

通常会采用循环体,它不会认为

if(++i < N) goto do_loop_again 

通常会跳。

所以真正的规则是让你的自动代码尽可能像人类一样。虽然如果它太像人类,那么就会提出一个问题,即你的语言必须提供 C 没有的东西——非 C 语言的全部意义在于在 C 源代码中创建一个 gotos 意大利面条,这是一个很好的结构输入脚本。

于 2016-10-01T14:23:16.360 回答