如今,您需要一个真正的C编译器作为优化编译器,尤其是因为C不再是一种与硬件接近的语言,因为当前的处理器非常复杂(乱序,流水线,超标量,具有复杂的缓存和TLB,因此需要指令调度等)。即使今天的x86处理器都能够运行相同的机器代码,也不像上世纪的i386处理器那样。请参阅David Chisnall撰写的C语言不是低级语言(您的计算机不是快速的PDP-11)。
很少有人在使用像tinycc或nwcc这样的天真非优化C编译器,因为它们生成的代码比优化编译器所提供的代码慢几倍。
编码优化编译器很困难。请注意,GCC和Clang都在优化某些“源语言无关”的代码表示形式(GCC为Gimple,Clang为LLVM)。一个好的C编译器的复杂性不在解析阶段!
特别是,制作C ++编译器并不比制作C编译器难:解析C ++并将其转换为某些内部代码表示很复杂(因为C ++规范很复杂),但是众所周知,但是优化部分更加复杂复杂(在GCC内部:中端优化,源语言和目标处理器中立,构成了编译器的主要部分,其余部分在几种语言的前端和若干处理器的后端之间保持平衡)。因此,大多数优化的C编译器也能够编译其他一些语言,例如C ++,Fortran,D,... GCC的C ++特定部分大约占编译器的20%...
同样,C(或C ++)的使用如此广泛,即使人们没有完全遵循正式的标准(人们对语言的语义定义不够准确),人们也希望他们的代码是可编译的(因此每个编译器可能都有自己的解释方法)的)。还要查看CompCert证明的C编译器和Frama-C静态分析器,它们关心C的更正式语义。
优化是一个长尾现象:实现一些简单的优化很容易,但是它们不会使编译器具有竞争力!您需要实现许多不同的优化,并巧妙地组织和组合它们,以获得具有竞争力的真实编译器。换句话说,现实世界中的优化编译器必须是复杂的软件。顺便说一句,GCC和Clang / LLVM都有几个内部专用的C / C ++代码生成器。两者都是巨大的野兽(数百万个源代码行,每年以百分之几的速度增长),拥有庞大的开发人员社区(数百人,大部分时间是全职或至少一半时间)。
请注意,有没有(据我所知)多线程的C编译器,即使一些编译器的部分可以并行运行(如程序内优化,寄存器分配,指令调度...)。与之并行构建make -j
并不总是足够的(尤其是LTO)。
另外,很难从头开始为C编译器的编码提供资金,并且这种工作需要持续数年。最后,当今大多数C或C ++编译器都是自由软件(新兴公司不再有新的专有编译器市场,或者至少是垄断商品(如Microsoft Visual C ++)),并且几乎免费成为编译器所需要的软件(因为他们需要来自许多不同组织的捐款)。
我很高兴获得从头开始作为免费软件在C编译器上工作的资金,但是我还不够天真地相信今天有这种可能!