关于C作为中间语言的问题
Questions about C as an intermediate language
我现在正在编写一种可以编译为 C 的语言,当我说 IL 时,我的意思是在 C 中是我编写代码然后由另一个 c 编译器生成汇编的语言,例如gcc 或 clang.
我生成的C代码,会不会更有利于:
- 如果我做一些简单的 opt pass(持续传播、删除死代码,...)这会减少 C 编译器必须做的工作量,还是会因为它不是真正的人类 C 代码而使它变得更难?
- 如果我要编译成三地址代码或 SSA 或其他某种形式,然后将其提供给具有函数、标签和变量的 C 程序 - 这会使 C 编译器更容易或更难优化?
哪一种link组合起来形成下面的问题...
- 从可编译为 C 的语言生成良好的 C 代码的最佳方法是什么?
- 是否值得进行任何优化并将其留给编译器?
一般来说,进行窥孔类型优化没有多大意义,因为 C 编译器会简单地为您做这些。昂贵的是 a) 浪费或不必要的 "gift-wrapping" 操作,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,这是一个很好的结构输入脚本。
我现在正在编写一种可以编译为 C 的语言,当我说 IL 时,我的意思是在 C 中是我编写代码然后由另一个 c 编译器生成汇编的语言,例如gcc 或 clang.
我生成的C代码,会不会更有利于:
- 如果我做一些简单的 opt pass(持续传播、删除死代码,...)这会减少 C 编译器必须做的工作量,还是会因为它不是真正的人类 C 代码而使它变得更难?
- 如果我要编译成三地址代码或 SSA 或其他某种形式,然后将其提供给具有函数、标签和变量的 C 程序 - 这会使 C 编译器更容易或更难优化?
哪一种link组合起来形成下面的问题...
- 从可编译为 C 的语言生成良好的 C 代码的最佳方法是什么?
- 是否值得进行任何优化并将其留给编译器?
一般来说,进行窥孔类型优化没有多大意义,因为 C 编译器会简单地为您做这些。昂贵的是 a) 浪费或不必要的 "gift-wrapping" 操作,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,这是一个很好的结构输入脚本。