程序员应该使用反编译器吗?

时间:2009-02-18 02:31:45

标签: decompiling

最近听到我一直在听Jeff Atwood和Joel Spolsky的电台节目,他们一直在谈论狗食(重复使用自己的代码的过程,请参阅Jeff Atwood的博客post)。所以我的问题是程序员应该使用反编译器来查看程序员代码是如何实现和工作的,以确保它不会破坏你的代码。或者你应该相信程序员编码并适应它,因为使用反编译器会违背程序员学习隐藏数据的所有内容(至少是OO程序员)?

注意:我不确定会发生哪些标签,所以请随意重拍。

编辑:只是为了澄清我问的反编译器是最后的手段,说你出于某些原因无法获得源代码。对不起,我应该在原来的问题中提供这个。

7 个答案:

答案 0 :(得分:5)

是的,使用反编译器的输出会很有用,但不能用于你的建议。编译器的输出看起来并不像人类会写的那样(除非是它。)它无法告诉你代码为什么会这样做,或者特定变量应该是什么意思。除非你已经有了消息来源,否则这样做是不值得的。

如果您确实拥有源代码,那么在开发过程中使用反编译器有很多充分的理由。

大多数情况下,使用反编译器输出的原因是为了更好地优化代码。有时,使用高优化设置,编译器只会弄错。在某些情况下,如果不在不同的优化级别上比较编译器的输出,这几乎是不可能的。

其他时候,当尝试从非常热的代码路径中挤出最高性能时,开发人员可以尝试以几种不同的方式安排他们的代码并比较编译结果。作为最后的手段,通过复制编译器的输出,这可能是在汇编语言中实现代码块时最简单的方法。

答案 1 :(得分:4)

Dogfooding是使用您编写的代码的过程,不一定是重用代码。

但是,代码重用通常意味着您拥有源代码,因此“代码重用”,否则它只使用其他人提供的库。

反编译很难做到,输出通常很难理解。

答案 2 :(得分:1)

如果是完成工作所需的工具,则应使用反编译器。但是,我认为正确使用反编译器来了解反编译代码的写入程度。根据您使用的语言,反编译代码可能与实际编写的代码非常不同。如果您想查看一些真实的代码,请查看开源代码。如果您想查看某个特定产品的代码,最好尝试通过一些合法手段访问实际代码。

答案 3 :(得分:1)

我不确定你究竟是在问什么,你期望“反编译器”向你展示什么,或者这与Atwood和Spolsky有什么关系,或者问题究竟是什么。如果您正在编程到公共接口,那么为什么需要查看第三方代码的原始来源以查看它是否会“破坏”您的代码?您可以更有效地构建测试以确定这一点。同样,“反编译器”告诉你的内容在很大程度上取决于编写软件的语言/平台,无论是Java,.NET,C等等。即使在.NET程序集的情况下,它与原始源的读取也不同。无论如何,如果你担心第三方代码不适合你,那么你应该真正对代码进行典型的单元测试,而不是试图“反编译”它。至于你是否“应该”,如果你的意思是“你应该”以某种其他方式“应该”而不是最好地利用你的时间,那么我不确定你的意思。

答案 4 :(得分:1)

  

程序员应该使用反编译器吗?

使用正确的工具来完成正确的工作。反编译器通常不会产生易于理解的结果,但有时它们就是所需要的。

  

程序员应该使用反编译器吗?   看看程序员的代码是怎样的   实施和工作,以确保它   不会破坏你的代码。

不,除非您发现问题并需要支持。一般情况下,如果您不信任它就不使用它,如果您不得不使用它,即使您不信任它,您也会开发测试来证明功能并验证以后的升级是否仍能按预期工作。 / p>

除非您有非常好的支持或信任关系,否则请勿使用您未测试的功能。

- 亚当

答案 5 :(得分:1)

  

或者你应该相信程序员编码并适应它,因为使用反编译器会违背我们程序员学习隐藏数据的所有内容(至少是OO程序员)?

这根本不是真的。你会使用反编译器,不是因为你想要绕过任何抽象,封装或失败OO原则,而是因为你想理解为什么代码表现得更好。

有时你需要使用反编译器(或者在Java世界中,一个字节码查看器)来解决第三方库的烦人错误,其中抛出异常,没有有用的错误消息,没有记录等。< / p>

使用反编译器与OO原则无关。

答案 6 :(得分:1)

对此的简短回答......对公众和文档规范进行编程,而不是实现。依靠实施细节和副作用会烧伤你。

反编译不是帮助您正确编程的工具,尽管它可能会帮助您了解其他人没有源代码的问题。

另外,请注意反编译可能存在的法律风险;许多软件公司都有无反编译条款,可能会使您和您的雇主面临法律后果。