编译器是否比人类产生更好的汇编代码?

时间:2017-02-12 23:31:09

标签: assembly compilation

自从我开始学习计算机科学和编程以来,我的印象是,为了获得更高的性能,可以使用C语言甚至MIPS等低级语言进行编码,并获得更高的可移植性,更高级的语言,像Java或Perl。

然而,在70年代,编译器产生了天真的装配,这是真的,因此专业的人类编码器可以做到最好。那么今天,现代编译器生成类似于主汇编编码器的代码呢?

当编译器更好的时候,像MIPS一样学习汇编是否值得?为什么冒险花费很长时间用一种挑剔且容易出错的汇编语言写作?

1 个答案:

答案 0 :(得分:2)

编译器是由人类制造的,根据定义并不比制造它们的人类好。一般来说编译器不能胜过某些人类。它们可以胜过许多人类,但是有些人没有,我们中的许多人可以检查编译器的输出并至少改进其中的一部分,具体取决于项目的大小。

大多数编译器都不了解系统,它们一般都是教授的,也许你可以调整一个,但他们不会自动知道你的系统知道使用内存与否之间的选择,或调整特定系统的特定缓存等等。

编译器可以做的是不会感到疲倦,并且可以保持一致,并且相对于人类来说非常快。因此,对于任何大小的项目,特别是大型项目,编译器就足够了。

请注意,关于C没有任何低级别,JAVA和Perl都没有与性能这个词有关。如果甚至存在性能问题,它们永远不会被选择使用,不是因为它们的高或低,而是因为它们设计缓慢,它们的目标不同,特别是可移植性。比C更重要,尽管早期是C目标。 JAVA有点自豪地说​​它没有优化,然后它是基于此的虚拟机堆栈上的虚拟指令集。所以这一切都很慢。 Pascal可能是另一种选择,在此性能环境中,或ADA。后两者有点僵硬,比C更容易编译和产生更严格的代码,如果你愿意,那么C的代码更低。

例如,学习汇编语言MIPS或ARM绝对符合您的最佳利益。例如,您可以知道自己问题的答案。

正如评论中所提到的那样,并且每次都被问到这个问题(为什么你没有读过这个问题的最后几十个问题和答案)让编译器做了繁重的工作,如果你有一个很好的理由那么就拿编译器输出效果不佳的部分并对其进行改进或必要时替换它。是的,你可以只使用砂纸“雕刻”木头雕塑,但是当你可以使用凿子和锤子进行80-90%的工作然后从那里打沙时,是否值得呢?在编程的情况下,你很少需要打磨,除非你不知道如何使用编译器,如果你不知道如何阅读它的输出(汇编语言),你就不会知道。

除了在SO上询问这个问题的次数之外,还有很多人问过“为什么编译器会这样做”指出可能是也可能不是最佳解决方案的地方。很多,肯定是为什么这么多堆栈在main(),而不是性能问题。

这里的另一个问题是性能的定义。对于x86目标,有太多不同的处理器和主板。如果您要针对具有特定外设的特定主机的特定主板上的一个特定芯片进行调谐,这可能对该系统很有用,但会使许多其他类似的x86系统运行得更慢。 ARM同样的问题,但不同。基准测试是假的,因为它们很容易操作,所以在你走这条路之前,你需要自己定义性能意味着什么。然后尝试让编译器执行此操作,然后检查输出,然后确定是否可以或甚至想要改进它。

不,编译器是由人类制造的,并不比人类更聪明也更好。它们至多更加一致,当然也更快,同时保持更加一致。