我看到的所有资料似乎都在暗示构建一个交叉编译器比构建一个针对运行平台的编译器要难得多。这是真的吗?如果是,为什么会这样?似乎对于任意平台生成汇编代码和系统调用并不比为编译器运行的平台生成这样的代码和系统调用更难,但也许我只是天真了。
我看到的所有资料似乎都在暗示构建一个交叉编译器比构建一个针对运行平台的编译器要难得多。这是真的吗?如果是,为什么会这样?似乎对于任意平台生成汇编代码和系统调用并不比为编译器运行的平台生成这样的代码和系统调用更难,但也许我只是天真了。
为了进行链接,你必须在主机系统上拥有一些目标系统的系统文件(即sysroot)。
某些语言要求在编译时而不是运行时评估某些内容;此外,某些优化会导致在编译时评估那些在未经优化的情况下将在运行时评估的内容。当目标具有主机系统上不存在的数值类型时,在编译时和运行时获得相同的答案可能会比较棘手。
测试可能会更加麻烦。你需要两个系统,并且需要一种将程序从一个系统传输到另一个系统的方法。
但总的来说,这就是我遇到的一般性问题。
你是否在看一个特定的案例,比如“将GCC作为交叉编译器构建”,其中“构建”意味着“编译”,而不是“编写”?
这可能更困难,因为涉及到库的问题 - 对于交叉编译器,您需要针对目标平台的库。对于“本地”(即非交叉)编译器,您显然已经拥有目标库。
我同意您关于“创建代码生成器”的方面是相同的观点 - 或者至少更受目标处理器架构的影响,而不是编译器执行的位置。
而且,有明显的情况下,交叉编译器比非交叉编译器更容易。我认为,在8051托管的C++编译器上,无论它针对哪个平台,都会很费力。
以下问题的答案可能有助于您理解为什么这很困难。
我觉得这归结于不同操作系统以不同方式调用本地IO。要构建一个平台无关的编译器,您将需要精确了解所有细节,并基本上构建一个操作系统。
(我现在要离开工作,回家后会更新)