是否有高级语言(如C)的编译器可以通过指定目标的硬件资源来针对各种体系结构?
我想知道是否存在可以通过指定诸如处理器的可用寄存器和指令集(即每个指令如何改变处理器的状态)以及架构的存储器布局等特征来编程体系结构的编译器。
我知道像gcc这样的编译器可以针对多个archtectures,但我想知道是否有编译器可以通过交换配置文件来编译新架构,以便瞄准新架构。
答案 0 :(得分:3)
根本问题是各种处理器的功能并不是特别统一。查看IA64上的捆绑,ARM / Thumb上的双指令集,SPARC上的寄存器窗口,PPC上的计数寄存器。甚至可能在多个体系结构上的功能(如ARM和Itanium上的预测)也可能完全不同,您不会共享实现。为了编写一个好的编译器,这些都是你需要理解的非常独特的功能,它们不仅仅是设计者选择的不同配置。鉴于它们往往是给定处理器的唯一事实,你在编译器中启用它们的任何切换实际上都是编译器中的特定代码,以支持该处理器,将其隐藏在一些配置选项后面以允许您启用它只是对此的混淆。
话虽如此,许多处理器必须处理许多常见功能。因此,您会发现大多数现代编译器定义了指令编码,寄存器文件(和别名)以及配置文件中的各种其他花絮,然后它们用于生成与手写位集成的编译器源的一部分。
查看LLVM X86后端的重要部分(~30%)是.td(目标定义)文件
Phoenix:X86 louis$ ls -al | grep cpp
-rw-r--r-- 1 louis louis 27627 Nov 1 03:32 X86CodeEmitter.cpp
-rw-r--r-- 1 louis louis 661 Oct 29 18:56 X86ELFWriterInfo.cpp
-rw-r--r-- 1 louis louis 46558 Oct 29 18:56 X86FastISel.cpp
-rw-r--r-- 1 louis louis 43660 Oct 29 18:56 X86FloatingPoint.cpp
-rw-r--r-- 1 louis louis 59915 Oct 29 18:56 X86ISelDAGToDAG.cpp
-rw-r--r-- 1 louis louis 312709 Nov 1 03:32 X86ISelLowering.cpp
-rw-r--r-- 1 louis louis 109229 Oct 29 18:56 X86InstrInfo.cpp
-rw-r--r-- 1 louis louis 17396 Oct 29 18:56 X86JITInfo.cpp
-rw-r--r-- 1 louis louis 44111 Nov 1 03:32 X86RegisterInfo.cpp
-rw-r--r-- 1 louis louis 10369 Oct 29 18:56 X86Subtarget.cpp
-rw-r--r-- 1 louis louis 15265 Oct 29 18:56 X86TargetAsmInfo.cpp
-rw-r--r-- 1 louis louis 9365 Oct 29 18:56 X86TargetMachine.cpp
Phoenix:X86 louis$ ls -al | grep td
-rw-r--r-- 1 louis louis 6870 Oct 29 18:56 X86.td
-rw-r--r-- 1 louis louis 13480 Oct 29 18:56 X86CallingConv.td
-rw-r--r-- 1 louis louis 77361 Nov 1 03:32 X86Instr64bit.td
-rw-r--r-- 1 louis louis 31517 Oct 29 18:56 X86InstrFPStack.td
-rw-r--r-- 1 louis louis 11690 Oct 29 18:56 X86InstrFormats.td
-rw-r--r-- 1 louis louis 156188 Oct 29 18:56 X86InstrInfo.td
-rw-r--r-- 1 louis louis 32971 Oct 29 18:56 X86InstrMMX.td
-rw-r--r-- 1 louis louis 183502 Oct 29 18:56 X86InstrSSE.td
-rw-r--r-- 1 louis louis 23653 Nov 1 03:32 X86RegisterInfo.td
答案 1 :(得分:1)
AFAIK,gcc就是这样工作的。检查gcc文档中的"Machine Descriptions"。当然,创建这些.md
文件是一项重要的编程工作。
答案 2 :(得分:0)
前一段时间我正在收听一个播客,其中谈到了一个用Java编写的Java虚拟机,它主要针对多个不同的平台,使用某种平台定义文件。我认为我正在听Java Posse而我认为它可能是Maxine Research Virtual Machine。