高水平的开发人员花时间研究组装是否明智?[关闭]


33

显然,对低水平知识的了解在我们的工作中非常重要。

但是,如果您已经在高水平上开发商业软件,并且已经选择了方向但没有任何汇编技能,那么专注于研究与您的方向相关的内容是否更合理?还是有理由要花一些时间来学习低级基础知识?

什么时候为时已晚,什么时候不为时?而如果它是不是太晚了,那么如何将一个去学习最佳(在不花费过多的时间来得到一些深入和理解的意义上)?


一篇文章中有很多问题:)
Shamim Hafiz 2010年

我一步一步喜欢汇编语言。起初有很多编程技巧,但是作者非常有趣。我发现有一个总体思路会有所帮助,并且我主要是写JavaScript。
埃里克·雷彭

我的第一门语言是汇编方言。我可以看到它是有用的(以其他人指出的多种方式),它可以帮助您为团队的其他成员提供不同的输入。
杰米·泰勒

Answers:


43

不敢相信没有人提到调试 ...

我已经很多年没有写过汇编代码了。但是我经常阅读。当您拥有源代码和符号信息时,高级调试非常有用,但是当您的高级库在客户计算机上引发未处理的异常时,要求将该许可证包含在许可中为时已晚...

但是我仍然可以打开反汇编程序,看看您的高级逻辑最终会做什么,将不良数据追溯到其起源,找出是谁更改了FPU控制寄存器...

这比我想的要多得多,节省了我的培根。而且它从来没有到老学到老-有很多伟大的参考和教程出来的“净,只是你的机器上运行任何程序都可以提供一个动手的环境。


10
+1,如果可以的话,我会进一步投票。如果没有其他原因,每个认真的开发人员都需要能够读取ASM。
梅森惠勒2010年

3
结果是优化。知道编译器如何将您的代码转换为程序集可以帮助您更快地提高代码速度!
lambacck

3
+1汇编是迫使您了解处理器实际工作方式的仅有的几种语言之一。它通过高级语言帮助您进行开发。必须阅读:blogs.msdn.com/b/ericlippert/archive/2010/09/30/...

无论是调试,优化还是出于好奇,了解底层计算机都非常有帮助。认真地,学会阅读至少一种或两种汇编语言。即使您从未阅读过它,也从未在学习后写过它,它都会影响您以后理解事物的方式。现在,如果您不想用其他语言写信,那可能会有点...
Michael Trausch 2010年

1
@梅森:我不知道“每个认真的开发人员”是否需要能够阅读ASM。如果您正在编写JavaScript或使用在厚框架(例如.NET或Java)之上构建的编程语言,那么我不会认为能够阅读ASM对于成为一名认真的开发人员来说至关重要。话虽如此,即使在更高阶的编程语言和环境中,了解计算机如何以非常低的水平执行指令也可能会很有帮助。
斯科特·米切尔

15

您不需要学习汇编语言,只需要了解它的工作原理即可。您需要知道XOR是什么,并在睡眠中以二进制形式计数,等等。但是我从来没有在我的工作中使用汇编代码。

因此,正如您所说,低级知识很重要,但是汇编方面的实践知识并不重要。


1
我第二。你可以赚一个良好的生活编程和从未读/写ASM。有一些职位需要它。在代码中出现争用条件后读取转储将使该过程失败。或者,如果您编写非常耗时的程序(例如GPU并行化/ OpenCL)。需要执行这些任务的开发人员工作的百分比很小。
yzorg 2010年

11

如果您确实不具备底层编程技能,则强烈建议您在业余时间学习一些。您无需成为专家;只是达到一定水平。您必须自己做很多数学工作,而不是依靠编译器或库来完成。因为大多数汇编指令对应一个处理器指令,所以它将帮助您了解编程的可读性。您必须自己管理稍大的程序中的复杂性,而不能享受诸如之类的好处if...else。这将帮助您编写更简单的高级程序,因为汇编经验会教您如何轻松阅读。

另外,请记住汇编不是一种语言!它是一个通用术语,基本上意味着已经抽象为符号语言的处理器的指令集。不同的处理器具有不同的指令集,因此具有不同的汇编语言。当您学习“汇编”时,您将学习一种过程,而不是一种语言。


8

您将永远受益于深入了解幕后知识,并进一步了解您站在抽象之上的含义。正如我的一位大学教授曾经说过的那样:“所有优秀的程序员都了解硬件”-您不必能够创建和操纵电路,但是您应该对那里发生的事情有所了解-这只会使你更好。

尝试计算机组织和设计


1

是的 -持续的终身学习是软件开发事业的重要组成部分。如果您有兴趣继续学习编程以及如何提高技巧,那么可以,在某些时候您应该学习汇编,因为它将使您接触到全新的语言和编写代码的方式。基于相同的原因,我建议尝试多种语言/编程风格,包括Ruby / Python(动态语言),Haskell / F#(纯功能语言),Lisp / Scheme(功能语言)等。

我想说,如果您不再对学习编程技巧感兴趣,为时已晚。例如,如果您的职业生涯已经到了某个阶段,您可能很快就会从编程转移到另一个领域,例如管理,系统工程,销售/市场营销等。如果您认为自己想搬到一个新的领域,在接下来的几年中,我将专注于在该领域开发所需的技能,而不是编程技巧。


1

您应该知道它是什么以及计算机在做什么。学习诸如Knuth的MIX之类的内容将对您有所帮助。通常能够判断代码的效率。去阅读《计算机编程艺术》并阅读它。这将使您成为一个更聪明的程序员。


1

专注于研究与您的方向相关的东西是否更合理?还是有理由要花一些时间来学习低级基础知识?

回答:

  1. 如果您不打算改变编程嵌入式系统的方向,则没有理由学习拼写检查。甚至认为汇编依赖于CPU,您可能会学习一些基础知识,但是您的知识将基于该CPU的体系结构和指令集。
  2. 假设您为Windows编写代码。如果想学习比高级语言更高级的语言,可能对您有所帮助,我建议您学习Windows I,Windows API,Windows内存管理等。只需学习您正在编码的OS /平台。
  3. 提高您当前高级语言的技能,例如内存管理,垃圾回收等。如果您想进入低级语言。

0

我认为随着职业的发展,您的回报率逐渐下降。也就是说,您应该及早学习汇编语言,因为它可以使您对以后的所有内容有更好的基本了解。但是,如果您已经在工作,并且已经有几年的经验,那么您已经对事情的运作方式有了了解,因此了解实际的细节可能无法为您提供足够的洞察力。


0

我不知道学习组装有多大用处。但是至少,用C之类的语言进行一些编程将是有益的。我最近不得不用C进行一些编程,并且发现它很有启发性。C消除了高级语言中存在的许多抽象。这些抽象并非没有代价。您必须在C中管理更多的低层详细信息,而在高级语言中,这些详细信息正在为您管理。通过用C进行一些编程,您将必须了解这些细节。因此,当您重新使用日常语言时,您仍然会拥有这种意识,并将更好地欣赏实际发生的事情。那应该有助于使您成为更好的程序员。


0

在教学界,至少在英国,教师的资格必须远远超过他们的教学水平。期望一名中学(高中)教师具有他们所教课程的学位,而小学(小学)教师也具有学位,并且必须精通所有主要科目,并且达到GCSE的良好等级(高中退出考试?,没有与美国实际相当的水平)。

为什么?因为要教好一些东西,或者确实要好用一些东西,您必须理解它。这需要了解底层结构,以及与之相关的决策链。为了正确理解高级代码,您必须了解构建它的层次,其运行方式,优缺点所在。这是递归的,要了解下面的层,您还必须了解下面的层。

最后,这就是为什么计算机方面的体面的大学/学院课程要求比其他任何事物都要好的数学能力的原因,因为那实际上是最底层的。

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

如果您在这些方面缺乏知识,那么您的理解就会受到影响。您越接近操作另一层的水平,则在其中接地就越重要。

那么:您是否需要将汇编程序理解为高级编码器?  我会帮你的。


0

在我作为超级计算机专家的前世中,这非常重要。那时,我觉得您直到至少写了几百行汇编器并进行修补以降低性能才了解一台机器。由于很少有程序员想深入研究,这使我真的不可或缺。与硬件设计师类型交流时,我仍然有共同语言。

但是,实际上,这的需要/益处大部分已经过去了几十年。在高级编译器和无序执行硬件之间,通过再编写汇编器可以发挥英雄的作用几乎没有余地。虽然我认为这对了解事物的工作方式很有用。我计划教我的孩子(法语专业的CS专业)在一个简单的虚拟机上以非常简化的汇编器进行编程,以使他们对正在发生的事情有所了解。希望我们可以处理诸如展开,软件流水线,缓存和预取,底部加载等工作。因此,至少他们会知道这种工作正在某种程度上进行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.