关于C作为中间语言的问题

时间:2016-10-01 13:52:57

标签: c compiler-construction intermediate-language

我正在编写一种现在编译为C的语言,当我说IL时,我的意思是在C语言中我编写代码然后由另一个c编译器生成汇编,例如gcc或clang。

我生成的C代码对以下内容更有益:

  • 如果我做一些简单的选择通过(持续传播,死代码移除......)这将减少C编译器必须完成的工作量,或者使其变得更难,因为它不是真正的人类C码?
  • 如果我要编译说三地址代码或SSA或其他形式然后将其提供给带有函数,标签和变量的C程序 - 这会使C编译器更容易还是更难以优化?

哪种联系在一起形成以下问题......

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

1 个答案:

答案 0 :(得分:0)

一般来说,进行窥视孔类型优化没什么意义,因为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源代码中创建一个意大利面,这是一个很好的结构。输入脚本。