将“通用组成的语言 X”编译成可移植 C 的编译器

Posted

技术标签:

【中文标题】将“通用组成的语言 X”编译成可移植 C 的编译器【英文标题】:Compilers that compile `generic made up language X` into portable C 【发布时间】:2012-06-17 06:04:53 【问题描述】:

我正在寻找两件事。第一个是术语。

将一种语言编译成另一种语言的编译器叫什么?

其次,有没有编译器可以将通用组成的语言X编译成可移植的C代码?

我只是把这个想法扔在那里,但我在想,如果我们为我们自己选择的语言创建自己的前端,而不是一路走来,编译器发出可移植的 C 代码。这样,我们可以添加新的语言特性,但仍然与现有的 C 代码非常兼容。

现在这种方法可能存在巨大缺陷(除了您需要构建它),但人们会这样做吗?

【问题讨论】:

我最近也一直在思考这些事情,但是一旦你阅读了一个标准(例如 C 的),你就会意识到有很多陷阱,你不太可能最终创建一个 好语言。即使是我们如此喜爱的 C 也有其阴暗的角落。实际上,您应该能够确保每个特性都与其他特性正交(这在 C++ 中绝对不是真的,这就是它现在变得一团糟的原因) 您可能想了解C--,这是一种专门设计为可移植汇编语言的类 C 语言。 en.wikipedia.org/wiki/Source-to-source_compiler 。看看Vala。这正是你所描述的。 好问题,但这应该在programmers.se上 【参考方案1】:

人们绝对会这样做。事实上,C++ 的原始实现是一个名为Cfront 的程序,它将 C++ 翻译成 C 代码,然后用 C 编译器进行编译。

如今,随着 JVM、CLR 和 LLVM 等中间“字节码”语言的盛行,将语言转换为 C 源代码的情况现在变得不那么普遍了。直接生成字节码比生成文本源代码要强大得多,也不那么烦人。这些字节码(在 LLVM 的情况下为“位码”)语言的级别低于文本编程语言,但仍高于与特定 CPU 或 CPU 系列相关的原始机器代码。

我会称这种程序为“翻译器”,但这只是我。 “编译器”也可以正常工作。

【讨论】:

当然,我一直在思考 C++,但完全忘记了 C++ 最初是如何演变的。我有一个跟进你,你有没有遇到过不同平台上的 ABI 问题?你认为这样的编译器可以解决这样的情况吗?如果 C ABI 仍然以 C 的形式发出,那么 C ABI 在哪里更稳定,并且使用具有 C 之外的功能的语言编写可能更便携? 抱歉,我最近没有任何将编译后的代码分发到不同平台的经验。多年前我尝试在 Linux 上这样做,结果是一场灾难(它可能已经改变,但我只是避免去那里)。 @JohnLeidegren,如果你坚持使用纯标准 C,是的,它绝对仍然是可移植的。如果您需要特定于平台的功能,您可能需要生成包含大量 ifdefs 的代码 @GregHewgill 我们的目标是广泛的 Linux 发行版和 UNIX 变体。我们在 C++ ABI 方面遇到了很多问题,但这几乎只发生在 10 年前的发行版上,我认为这可以在一定程度上弥补这种情况。 @SK-logic:当我说“更高级别”时,我的意思是比机器代码更高的级别。谢谢,我会澄清的。

以上是关于将“通用组成的语言 X”编译成可移植 C 的编译器的主要内容,如果未能解决你的问题,请参考以下文章

C代码通过编译器编译成可执行文件, 需经历 预处理编译汇编链接 四个阶段

c语言如何把c程序编译成可执行的exe文件

C代码编译成可执行程序的过程

如何最好地将 C++/Cython 项目编译成可执行文件?

C#.net写的winfrom程序怎么编译成可执行的exe文件

应该使用哪个编译器将 C 代码移植到 ARM?