今天有可能击败Assembler吗?

时间:2013-05-21 19:49:06

标签: optimization assembly gpu

根据terrific account by Ed Nather,显然它曾经是。今天怎么样?也就是说,有可能,有足够的CPU / FPU / GPU /等知识。在任何情况下,编写比主流汇编程序(nasm,GAS等)生成的机器代码更高效的机器代码? GPU内核怎么样?

编辑:“没有建设性”?请。这个问题产生了@Pointy的答案,这对那些不熟悉汇编程序工作的人来说非常有启发性。有人赞成它。事实上,Pointy是一位亲密的选民之一,这是一个不错的选择,但如果这是最佳答案,那么它就会被接受。

4 个答案:

答案 0 :(得分:1)

两件事:

  1. 没有一种叫做“汇编语言”的东西。汇编程序是将特定体系结构的指令的文本编码转换为适合执行的形式的程序。确切地说,特定装配商所面临的设施取决于其设计师。许多CPU架构都有几个可用的汇编程序。

  2. 因为汇编程序的工作是为一个人提供一种“友好”的方式来请求精确的机器指令序列(以及程序的其他方面,例如初始化的存储器位置,保留的存储块,指令运行时执行程序等),如果有可能手工生成某个特定汇编程序无法生成的程序,那么这实际上只意味着你的汇编程序不够。英特尔为iAPX 86系列开发的汇编程序(不是微软的 masm ,它是一个弱模仿者)有一个相当典型的宏设施,它还有一种“微宏”设施,允许操作码助记词典(如MOVADDBNE等)可任意扩展。使用这样的汇编程序,显然可以创建您想要的任何代码段。

  3. 编程中关注的真正话题是,程序员是否有责任选择一个非常详细的计算机完成工作的策略,这对于提高性能是否值得。当然,问题没有一个答案,因为有许多可能的情况,许多不同的计算设备,并且主要是因为事情一直在变化。例如,在1959年,将诸如FORTRAN之类的高级语言翻译成机器代码的计算任务是本身是计算机的重要工作量。了解编程语言应该如何运作还处于起步阶段。

    今天,了解“机器语言”(并注意“语言”这个词并不真正准确)的唯一原因是当没有可用(或方便)的汇编程序时创建一个指令序列。这是假设显式创建特定指令序列比出于某种原因使用更高级别的语言更好。即使这样,通常情况下,如果你现在这样做,你将用一些高级语言编写软件来发出所选择的指令序列;也就是说,您可以为某些任务有效地创建“特定于域的汇编程序”。一个很好的例子就是像虚拟机解释器这样的代码,它可以动态地构建机器语言块,就像Java或JavaScript VM一样。

答案 1 :(得分:1)

汇编程序采用汇编语言并将其转换为机器代码。理想情况下,但并非总是如此,汇编语言与机器代码指令具有一对一的关系。 MOST 从汇编语言语法转换为指令和机器代码将是相同的,无论汇编程序是否完成,或者是否手动完成。自然有一些不经常关心的位,汇编器和人可能会选择不同的关注位,所以结果不一定要有点匹配,但纵向和速度它们将是相同的,没有任何区别。

人和汇编软件之间的差异,如果有的话,汇编语言与机器代码不是一对一的关系,和/或由于各种原因,程序员希望汇编程序处理某些事情。这可能是伪指令,宏,或与外部定义的变量有关的事情。

汇编语言是一个加载的术语,因为它是由特定的汇编程序定义的,您可以为同一个处理器提供许多不同的和不兼容的汇编语言。并且您可以使用汇编语言,其中存在语言无法完全描述选择特定指令所需的所有信息的实例,例如对于具有某些汇编程序的某些指令集的远程跳转。

因此,如果你想比较苹果和苹果,手工组装代码和软件组装代码之间没有区别。苹果到苹果意味着有问题的代码被正确写成不模糊,因此软件和人工装配工可以组装它。如果你发现除了不关心位之外的其他差异,那么它可能与优化有关,这与人类汇编程序更改代码有关,以使匹配汇编语言可以/应该公平改为匹配。这种差异与人类与汇编语言汇编程序无关,但与其他人相比,一个程序员编程。基本上,您可以/将使用软件汇编程序在汇编语言中获得相同的结果。

答案 2 :(得分:0)

瞄准非常特定的运行时环境的熟练的汇编语言程序员 可能会生成比编译器生成的代码更好的代码。根据代码的性质,相对于所需的工作量,性能改进可能相同或不重要。

另一方面,Java或.NET等框架允许程序员将软件编译为“中间”形式,可以根据需要将其转换为机器代码,其中包括对其实际运行环境的特定优化。编译为在“任何平台”上运行的代码,当由运行的平台进行手动调整的框架引擎运行时,可能无法像为该平台手动调整的汇编代码一样运行,但优于代码这是经过手工调整以优化其他平台的性能。

答案 3 :(得分:0)

"显然它曾经是,根据Ed Nather的这个了不起的帐户。 "

我记得几十年前读过这样的故事。 它已经做了很长时间的轮次。

二十一点是一个点缀,但代码在正确的点上退出,并且花了几周时间试图找出它在便士终于放弃之前是如何工作的,这肯定会敲响一个很老的钟声