2009-02-18 42 views
2

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

注意:我不确定哪些标签会在这种情况下随意重新标记。

编辑︰只是为了澄清我是问反编译器作为最后的手段,说你不能得到源代码出于某种原因。对不起,我应该在原始问题中提供这个。

回答

5

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

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

大多数情况下,使用反编译器输出的原因是为了更好地优化代码。有时候,在优化设置很高的情况下,编译器会错误的。在某些情况下,如果不在不同的优化级别比较编译器的输出,这几乎是不可能的。其他时候,当试图从非常热门的代码路径中挤出最高性能时,开发人员可以尝试以几种不同方式安排其代码,并比较编译结果。作为最后的手段,通过复制编译器的输出,这可能是以汇编语言实现代码块时最简单的方法。

4

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

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

反编译很难做到正确,输出通常很难遵循。

+0

当然,如果你编写库代码,那么狗食*就是*使用你自己的API。 – 2009-02-19 06:26:25

+0

没错,但是你不需要反编译它。 – 2009-02-20 06:01:36

1

如果它是完成工作所需的工具,则应该使用反编译器。但是,我不认为这是正确使用反编译器来了解被编译的代码编写得如何。根据您使用的语言,反编译的代码可能与实际编写的代码有很大不同。如果你想看到一些真实的代码,看看开源代码。如果您想查看某个特定产品的代码,最好尝试通过某种合法手段访问实际代码。

1

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

1

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

使用合适的工具进行正确的工作。反编译器通常不会产生易于理解的结果,但有时它们是需要的。

应该程序员使用反编译器来 看到程序员的代码是如何实现的 和作品,以确保它 不会破坏你的代码。

不,除非你找到一个问题,需要支持。一般来说,如果你不信任它,就不会使用它,如果你不得不使用它,即使你不信任它,你也会开发测试来证明这些功能,并验证以后的升级是否仍然按预期工作。

不要使用你不测试的功能,除非你有非常好的支持或信任关系。

- 亚当

1

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

这根本不是真的。你会使用一个反编译器,并不是因为你想绕过任何抽象,封装或打败面向对象的原则,而是因为你想要了解为什么代码行为更好。

有时你需要使用反编译器(或在Java世界中,字节码查看器),当你正在解决一个恼人的错误与第三方库,其中没有有用的错误消息,没有记录等引发的异常

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

1

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

反编译不是帮助您正确编程的工具,尽管它可能会在一个指尖中帮助您理解与其他源代码无关的问题。

另外,请注意反汇编可能带来的法律风险;许多软件公司都没有反编译条款,可能会让您和您的雇主承担法律后果。

相关问题