学习大会有哪些实际优势?

时间:2009-01-07 23:28:07

标签: pointers assembly

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

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

14 个答案:

答案 0 :(得分:7)

我认为学习汇编语言,指针和内存管理等低级内容的主要实际优势在于,当您编写或查看高级代码时,您可以更好地本能地或潜意识地发现性能问题或其他陷阱。

一个普通的开发人员,可能会编写一个简单的循环并思考,“此代码遍历一组整数并将每个整数写入控制台。”

专家开发人员可能编写相同的循环并认为,“此代码迭代一组整数,并且必须将每个元素设置为调用ToString方法,并且ToString必须格式化基数10中的字符串,这有点非平凡的,然后盒装的整数和格式化的字符串很快就有资格进行垃圾收集,因为没有引用将保留,并且第一次运行此方法时,它将需要JIT'ed ......“等等。< / p> 10次​​中有9次,这可能无关紧要。但是,在10次中有1次,专家开发人员可能会发现代码中存在一个普通开发人员永远不会考虑考虑的问题。

答案 1 :(得分:5)

你需要学习阅读程序集,以便在复杂语句爆炸时弄清楚出了什么问题。 CPU调试窗口不应该是一个神秘的地方。

答案 2 :(得分:4)

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

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

答案 3 :(得分:3)

我认为学习新语言很棒。它打开了我的脑海。有些语言比其他语言更开放。我说汇编程序就是其中之一。它迫使你去思考调用堆栈和指令指针之类的东西。它会让你更欣赏更高级别的语言。另一种有趣的语言是PostScript。

答案 4 :(得分:3)

我不认为你需要来学习任何实用的汇编。然而,它将确保你理解你作为开发人员所做的事情的真正根源。从本质上讲,汇编编程是学习芯片逻辑和架构的一门学科。我已经二十多年没有对汇编进行编程了,但它仍然可以告诉我在编写C#时所做的各种选择。

答案 5 :(得分:2)

这是一直要问的问题之一:“我为什么要知道任何事情。”嗯,也许除了构建下一个通用的CRUD应用程序之外,你还可以做一些工作。如果你想进行任何类型的系统开发,拥有组装的工作知识是非常有用的,如果不是至关重要的话。至于你“错过了什么”,也许你错过了实际知道计算机是如何工作的。有些人认为这是可取的。有些人没有。有些人建立了处理器。有些人挖沟。这完全取决于个人偏好:)

答案 6 :(得分:1)

  

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

了解装配是什么。 真正学会如何阅读(并理解)它的小碎片:如何在脑海中走路/走过它。 也许也是,用调试器(包括看到内存和寄存器被更改)逐步完成其中一些操作。 理想情况下,找一些带注释的程序集。

但是,不要费心学习如何编写程序集:相反,学习编写C或C ++可能对于大多数实际目的来说都是“低”的。

答案 7 :(得分:1)

指针和内存管理实际上是一个与汇编不同的问题。如果你想做C / C ++,那么你需要学习指针和内存管理,因为它们是语言的一部分。但是,即使你计划在你的生命中只使用(比如说)Java,你应该学习一些关于内存管理的东西,以防止写入内存泄漏,尽管GC,指针只是原子类型和对象引用之间的区别。您需要这些概念,否则您将编写无效的程序!

学习装配的实际原因:调试和优化。即使您没有编写任何程序集,但有一天您可能需要优化C / C ++代码以提高性能。在这种情况下,您需要能够读取内部循环的程序集,即使您永远不需要编写另一行。

最终,我认为你对“了解你的计算机的基本工作方式”和“使学习装配的努力值得的实用建议”之间的区别是错误的。无知不付出代价。了解您的计算机如何工作值得付出努力的实用建议!

我有一个预言:有一天很快,你的程序运行得太慢而不实用,并且会因为内存不足异常而间歇性崩溃。在那一天,不知道到底发生了什么或者从哪里开始寻找以解决它的纯粹尖叫的焦虑将退还你的业力债务,有兴趣......

答案 8 :(得分:0)

目前,许多汇编语言实际上都是相当高的水平。

总而言之,如果你学习'C',那就足够接近装配,以获得大部分学习上的好处。

编辑:想到这一点,在Knuth的书中他描述了一种理想化的汇编语言。学习它并阅读这些书不会有太大的错误。

答案 9 :(得分:0)

我能想到的另一个实际原因是逆向工程应用程序代码,仅用于教育目的,因为它被广泛用于破解共享软件应用程序保护,如时间限制或序列号。

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

答案 10 :(得分:0)

好吧,在实际的水平上,当我第一次学习80年代早期的代码时,我在6502汇编程序中做了一个课程。我也做了一些8088汇编程序。这是多年来偶尔使用的,但我不能说它曾经真的在25年内让我出了一两次以上的洞。 Groking C在相当基础的水平上使用得更多。 YMMV和它作为背景当然有用,但作为直接的实际利益?边缘真的。

不幸的是,有一件事证明是有用的,甚至更低。我做了一个关于芯片设计的课程(与非门等),并且作为其中的一部分,在某种程度上教授了正式的布尔逻辑。从那时起,这一直非常有用 - 令人惊讶的是那些并不真正知道他们正在做什么的编码人员,以及那些人: - )

答案 11 :(得分:0)

我认为学习计算机体系结构,结合汇编,会让你大开眼界。

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

此外,不同的架构也有它们的怪癖。有人谈到了一个汇编技巧来交换2个寄存器,包括xor。它可以工作,对于有序执行核心(最近的例子是Intel Atom和上网本中的Via C7)非常有用,但在无序内核中并不是那么好。

知道这可以帮助您通过在程序集中检查它来检测编译不良的代码,并且可能能够以更高级语言编写代码以避免编译器优化器的不完美。我不是试图解散它们,但它们无法完美地调整。

答案 12 :(得分:0)

我有一些实际的例子说明为什么你需要知道什么是幕后的。您可能会在此上下文中找到一些有用的链接 -

Assembly And The Art Of Debugging

Debugging – Modifying Code At Runtime

答案 13 :(得分:0)

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