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

关于C作为中间语言的问题,c,compiler-construction,intermediate-language,C,Compiler Construction,Intermediate Language,我现在正在编写一种编译成C的语言,当我说IL时,我的意思是C中的as是我编写代码的语言,然后由另一个C编译器生成汇编,例如gcc或clang 我生成的C代码是否更有利于: 如果我做一些简单的opt传递(常量传播、死代码删除等等),这会减少C编译器必须做的工作量吗,或者因为它不是真正的人类C代码而使它变得更难 如果我编译成三地址码或SSA或其他形式,然后将其输入到带有函数、标签和变量的C程序中,这会使C编译器更容易或更难优化吗 哪种链接一起形成以下问题 从编译成C的语言中生成好的C代码的最佳

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

我生成的C代码是否更有利于:

  • 如果我做一些简单的opt传递(常量传播、死代码删除等等),这会减少C编译器必须做的工作量吗,或者因为它不是真正的人类C代码而使它变得更难
  • 如果我编译成三地址码或SSA或其他形式,然后将其输入到带有函数、标签和变量的C程序中,这会使C编译器更容易或更难优化吗
哪种链接一起形成以下问题

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

一般来说,进行窥视孔类型优化没有多大意义,因为C编译器只需为您进行这些优化。昂贵的是a)浪费或不必要的“礼物包装”操作,b)内存访问,c)分支预测失误

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

for(i=0;i<N;i++) 
if(++i < N) goto do_loop_again 

for(i=0;i)“非C语言的全部要点是创建一个通心粉”胡说八道!我用yacc编写的语言可以生成非常好的C而不需要goto。你能详细解释一下为什么这些操作很昂贵吗?你认为如果有人在编译成C之前编写糟糕的代码,这些操作可以优化吗?我不认为我可以限制堆内存的使用,因为这种语言的级别相对较低,没有GC或任何东西因此,程序员处理他们的内存管理。对主存的读写涉及到将数据从处理器中传出并返回,这比在处理器中进行的操作要昂贵得多。通过安排数据,使使用在一起的项目紧密相连,并使作用于相同数据的操作成为clo如果编译器的输出是结构良好的C,那么它添加了什么?用户编写C不是更容易吗?不完全正确-循环分析是在过程循环早已消失时进行的。循环分析是在CFG级别上进行的,并且
goto
和过程loo之间没有区别P