Compiler construction 自举的缺点?

Compiler construction 自举的缺点?,compiler-construction,programming-languages,Compiler Construction,Programming Languages,我看到了很多关于引导的链接,我想知道为一种语言(比如X语言)引导编译器的主要缺点是什么,使用C编程而不是使用汇编语言?我想知道使用C是否会将我所做的一切限制在类似“C”的汇编语言创建上(即C的编译器是如何做到的) 例如,无论我用Python编写什么,最终都将由CPython负责,使其最终在硬件中以类似C的方式进行—这可能不是最佳的 当然,C语言可能是非常好的语言,但对于其他一些通用语言来说可能不是这样。引导最终会不会有一些瓶颈,一些特定于我用来制作引导编译器的语言的限制?就像机器代码生成一样,C

我看到了很多关于引导的链接,我想知道为一种语言(比如X语言)引导编译器的主要缺点是什么,使用C编程而不是使用汇编语言?我想知道使用C是否会将我所做的一切限制在类似“C”的汇编语言创建上(即C的编译器是如何做到的)

例如,无论我用Python编写什么,最终都将由CPython负责,使其最终在硬件中以类似C的方式进行—这可能不是最佳的

当然,C语言可能是非常好的语言,但对于其他一些通用语言来说可能不是这样。引导最终会不会有一些瓶颈,一些特定于我用来制作引导编译器的语言的限制?就像机器代码生成一样,C如何生成代码,而不是以某种随机方式


使用C的主要原因是,它在将代码映射到机器语言方面做得很好,但不如汇编语言好,对吗?所以C有一些性能问题,现在我用C为另一种语言创建一个编译器,所以我必须传递这些性能问题,对吗?毕竟C没有1-1映射到程序集-希望你能回答我的问题。

我们以前也遇到过一个非常类似的问题,就是问一个问题。所有这些都同样适用于编译器:这是一项难以置信的工作(如此之大以至于几乎不可能完成如此规模的任何事情),它使维护成本激增,如果它有帮助的话,它给你带来的好处微乎其微——至少在所有情况中的2/3,它将是有害的,因为我们中没有人能打败现代C编译器

然后,您的推理还有另一个问题:虽然我们确实希望我们的编译器能够快速完成,以使写编译调试周期的中间部分不那么烦人和浪费时间,但编译器的性能不会影响已编译程序的性能——以及后者的性能(特别是,实际可能的最佳运行时性能)通常更为重要。为此,您需要许多非常复杂的算法进行非常巧妙的优化。如前所述,在汇编语言中,大型解释器已经非常困难,甚至不可能。进行所有这些优化更为困难


哦,当我们在做这件事的时候:引导实际上可以带来更好的性能。这个项目用Python(Python的子集)实现Python。你说肯定非常慢吧?错了!它几乎可以比用C编写的CPython(它尽可能映射到汇编)更快地运行所有程序在多年的过程中,由非常聪明的人进行了优化。通常,它只需要所需时间的一小部分。当然,他们通过使用即时编译器获胜,即时编译器本质上非常适合优化各种动态语言。但即使是非JIT版本(常规解释器)的速度也通常不到2倍比CPython更复杂。请参阅。

是的。在某些情况下,将您的语言功能映射到C语言的类似功能将花费您的成本。两个示例:

如果您将YourLang函数调用实现为C函数调用——也就是说,您天真地使用了C/本机堆栈——那么您就失去了支持深度递归、适当的尾部递归、延续以及可能的堆栈检查的能力(或者至少,您必须更仔细地考虑它们)

如果将单个YourLang线程映射到单个POSIX/Windows/任何线程,就无法支持像Erlang这样的大规模并发


但这并不意味着你不能用C语言编写解释器、编译器和运行时。

关于“高级语言不如汇编语言”的神话已经彻底揭穿了至少20年,也许30年。此外,性能问题可能来自您的算法和实现,而不是特定语言的限制(您是否有“C有性能问题”的特定案例,或者您只是想知道如果有呢?)。我不是专家,所以我属于“假设”类别。但我怀疑编译器是否只是使用C的字符串解析功能,并为新的编程语言创建类似于汇编的映射。因此,甚至没有涉及C的其他内置功能。这取决于您在编程语言中实际做了什么;但这是完全可能的是的,这正是我所想的。似乎使用C作为编译器的主要目的是它有一套非常好的汇编宏,并且只需要语言的基础知识。