简短的回答:
如果您需要编译器的性能而不是解释器(或预编译器 + 解释器)的易用性,那么您别无选择。您将编译成一些较低级别的语言,而 C 是当今的汇编语言,C++ 与 C 一样可用且适用于该任务。您没有理由害怕这条路线。实际上,从某种意义上说,这是一条非常常见的路线。
长答案:
生成的代码绝不是不寻常的。即使是相对适度地使用生成的代码,也会导致 C 源代码“不同于任何程序员所编写的”,无论是在数量(微小的变化重复数百万次的琐碎代码模式)或质量(一个人类永远不会使用,但仍然是合法的 C++)。还有相当多的编译器可以编译成 C 或 C++,其中一些是编写 C 和 C++ 语言标准的人所熟知的。
最常见的 C 和 C++ 编译器可以很好地处理生成的代码。是的,它们从来都不是完美的。
- 编译器可能有各种简单的限制,例如最大代码行长度;一旦你遇到它们,它们往往会被记录在案,并且很容易在你的生成器中遵守。
- 编译器可能有缺陷。
- 与手写代码相比,某些类型的缺陷实际上对于生成的代码来说并不那么令人担忧。一旦你开始理解模式并关心问题,你的代码生成器实际上给了你一定程度的自由来系统地处理许多情况。
- 只要有足够多的编译器用户,就会很快发现实际上导致编译器无法正确编译有效代码的缺陷。它们被编译器供应商视为特别高优先级的缺陷。即使编译器本质上已经死了或服务于一个利基市场,因此没有可用的修复程序,互联网上往往会提供大量信息,包括人们解决缺陷的现有经验(不同的编译器,不同的代码构造,不同的编译器)开关......解决方案变化很大,可能会让人感到尴尬,但没有人会因为某些软件有问题而放弃他们的工作,对吧)?因此,通常可以选择可搜索的解决方案。
争取跨编译器的可移植性通常是件好事,但也要了解和跟踪可移植性的限制。如果您没有很好地测试过特定的 C 或 C++ 编译器,请不要声称它可以作为工具集的一部分工作。
您在问 C 和 C++ 之间的隐含问题。好吧,这里有更多的灰色阴影。C++ 是一种非常丰富的语言。您可以在生成器中将几乎所有 C++ 功能用于良好的目的,但在某些情况下,您应该问自己一个特定的主要功能是否会成为一种负担,从而使您付出的代价比它给您带来的更多。例如,不同的编译器使用不同的模板实例化策略。隐式实例化可能会导致可移植生成代码的不可预见的复杂性。如果模板确实可以极大地帮助您设计生成器,请不要犹豫使用它们;但是,如果您对它们只有一个边缘用例,请记住,您比大多数人有更好的理由来限制您生成的语言。