代码之家  ›  专栏  ›  技术社区  ›  Ali

学习装配的实际优势是什么?

  •  6
  • Ali  · 技术社区  · 16 年前

    大多数人认为学习装配是必要的,了解计算机的底层工作是很重要的,等等。但我正在寻找一些实用的建议,这些建议将使学习装配的努力变得值得。

    你有什么建议?不学习汇编和指针/内存管理,我遗漏了什么?

    14 回复  |  直到 11 年前
        1
  •  7
  •   C. Dragon 76    16 年前

    我认为学习低级语言(如汇编语言、指针和内存管理)的主要实践优势在于,当您编写或审阅高级代码时,您能够更好地本能地或下意识地发现性能问题或其他缺陷。

    一个普通的开发人员可能会编写一个简单的循环,并认为,“这段代码迭代一组整数,并将每个整数写入控制台。”

    专家开发人员可能会编写相同的循环并认为,“这段代码迭代一组整数,并且必须将每个元素框起来以调用ToString方法,ToString必须将字符串的格式设置为以10为基的格式,这有点不寻常,然后框起来的整数和格式化的字符串都将很快符合垃圾收集的条件,因为没有引用NCES将保留,第一次运行此方法时,需要对其进行JIT'ED…“等操作。

    10次中有9次可能无关紧要。但是,每10个开发者中就有1个会注意到代码中的一个问题,这是普通开发者永远不会想到的。

        2
  •  5
  •   Loren Pechtel    16 年前

    你需要学习阅读汇编,这样你就可以知道当一个复杂的语句爆炸时出了什么问题。CPU调试窗口不应该是一个神秘的地方。

        3
  •  4
  •   Martin v. Löwis    16 年前

    指针/内存管理比汇编语言更通用。你需要理解C和C++,如果你必须用C来维护代码,你可能需要它们。

    对于汇编语言,有时读取C编译器生成的汇编程序代码,以查明它是否生成正确和有效的代码是有用的。

        4
  •  3
  •   PEZ    16 年前

    我认为学习新语言很好。它打开了我的心扉。有些语言比其他语言更开放思想。我想说装配工就是其中之一。它强制您考虑诸如调用堆栈和指令指针之类的东西。它会让你更加欣赏更高级的语言。另一种有趣的学习语言是附言。

        5
  •  3
  •   Mark Brittingham    16 年前

    我不认为你 需要 为了任何事情学习装配 实用。 但是,它将确保您了解作为开发人员所做工作的真正根源。从本质上讲,汇编编程是学习芯片逻辑和体系结构的一门学科。我已经有二十多年没有编程汇编了,但是它仍然告诉我在编程C时所做的选择。

        6
  •  2
  •   BobbyShaftoe    16 年前

    这是一个总是会被问到的问题:“为什么我应该知道任何事情。”等等。好吧,也许你可以得到一份除了构建下一个通用CRUD应用程序或类似的工作。如果您想进行任何类型的系统开发,掌握汇编的工作知识是非常有帮助的,即使不是至关重要的。至于你“错过”了什么,也许你错过了真正了解计算机是如何工作的。有些人认为这是可取的。有些人不这样,有些人制造处理器。有些人挖沟。这完全是个人喜好的问题:)

        7
  •  1
  •   ChrisW    16 年前

    但我正在寻找一些实用的建议,这些建议将使学习装配的努力变得值得。

    学习什么是装配。 真正学习如何阅读(和理解)它的小片段:如何在你的头脑中行走/跨过它。 也许也可以,用一个调试器来逐步完成其中的一些操作(包括看到内存和寄存器被更改)。 理想情况下,找到一些带注释的部件。

    但是,不要费心去学习如何编写汇编:相反,学习写C或C++可能是“低”的,这是最实用的。

        8
  •  1
  •   comingstorm    16 年前

    指针和内存管理实际上与程序集是不同的问题。如果你想做C/C++,那么你需要学习指针和内存管理,因为它们是语言的一部分。但是,即使你计划在一生中只使用Java(Java),你也应该学习一些内存管理,以避免写GC时内存泄漏,指针只是原子类型和对象引用之间的区别。你需要这些概念,否则你会写不起作用的程序!

    学习装配的实际原因:调试和优化。即使你不编写任何程序集,但在某一天,你可能需要优化C/C++代码来实现性能。在这种情况下,你需要能够 阅读 为您的内部循环装配,即使您不需要编写它的另一行。

    最后,我认为你对“了解你计算机的底层工作”和“能使学习汇编工作值得的实用建议”的区分是错误的。无知无益。学习计算机的工作原理 一个值得努力的实用建议!

    我有一个预言:不久的某一天,你的程序将运行得太慢而无法实际运行,并且会因内存不足而间歇性崩溃。在那一天,完全尖叫的焦虑不知道到底发生了什么,或从哪里开始寻找,以解决它将偿还你的业力债务,连同利息…

        9
  •  0
  •   frankodwyer    16 年前

    如今,许多汇编语言实际上都是相当高的级别。

    如果你学习“C”,它就足够接近于组装,从而获得大部分的学习收益,这是事实。

    编辑:再想一想,在克努斯的书中,他描述了一种理想化的汇编语言。你学着读那些书不会大错特错的。

        10
  •  0
  •   Epitaph    16 年前

    我能想到的另一个实际原因是反向工程应用程序代码,仅为教育目的而修改它,因为破解程序广泛使用这种代码来绕过共享软件应用程序保护,如时间限制或序列号。

    像win32dasm这样的应用程序可以将可执行文件转换成汇编代码,以后可以用hiew这样的十六进制编辑器修改汇编代码。你可以学到很多关于程序流程的知识。

        11
  •  0
  •   Cruachan    16 年前

    嗯,在实践层面上,当我第一次学习80年代早期的代码时,我在6502汇编程序上上了一节课,我还做了一些8088汇编程序。从那以后,它一直是偶尔使用的,但我不能说它是永远的。 真的? 在25年的时间里,我不止一次或两次走出困境。在一个相当基本的层次上摸索C更有用。YMMV作为背景当然有帮助,但作为直接的实际利益?真是边缘化。

    然而,有一件事被证明是有用的,那就是在更低的层次上。我上了一堂关于芯片设计的课(与非门等等),作为课程的一部分,我在一些深度上学习了形式布尔逻辑。从那以后,这就非常有用了——令人惊讶的是,有那么多的编码人员并不真正知道他们在处理and s、ors和nots时在做什么——)

        12
  •  0
  •   Calyth    16 年前

    我认为学习计算机体系结构,结合装配,会让你的思想开阔一点。

    这将有助于解释许多性能问题,例如解析器速度慢,因为有很多分支,管道很容易被刷新,分支预测器无法补偿所有问题。

    此外,不同的架构也有其独特之处。有人谈到了一个汇编技巧来交换2个寄存器,涉及XOR。它可以工作,并且对于顺序执行核心(最近的例子是Intel Atom和Netbooks中的VIA C7)运行得很好,但对于顺序不正确的核心则不是很好。

    了解这一点可能有助于通过在程序集中检查编译不良的代码,并且可能能够用更高级的语言编写代码,以避免编译器优化器的缺陷。我不是想拆散他们,但他们只是不能完美地调音。

        13
  •  0
  •   Tushar S    15 年前

    学习装配的最大实际优势是性能。您可以在需要时优化到近乎完美。

        14
  •  0
  •   mohit    11 年前

    我有一些实际的例子来说明为什么你需要知道什么是在遮光罩下。在此上下文中,您可能会发现一些有用的链接是-

    Assembly And The Art Of Debugging

    Debugging – Modifying Code At Runtime