Chrome:如何将1.5GB的源代码压缩为50MB的可执行文件



这让我很困惑。我刚刚下载了一个1.5GB的Chrome源代码tarball。编译的相同代码压缩到大约50MB。

为什么源代码的大小和可执行文件的大小之间存在这样的差异?

可能导致这种情况的原因列表。

  1. 可执行文件不需要空白、注释或任何漂亮的格式化内容。源代码可能有大量的文档和空白,只是为了使代码可读,而所有这些都会占用空间。

  2. 源代码可能会带来许多其他代码来测试应用程序。但是这个测试代码从来没有进入最终的应用程序。

  3. 代码中包含的文档。根据.doc或.docx文件的格式,文档可能很大。

  4. 还有人提到源代码管理注释可能也在代码中。在源代码中冻结提交消息也会使文件变大。

  5. 我不知道你是如何/何时进行文件比较的,但如果你在编译后进行比较,那么你可能也在计算中包含了编译工件(*.o文件)。因此,您可能会认为源代码是1.5GB,而实际上只有750MB(粗略地说)。

  6. 根据编译器及其性能的不同,它可能会生成更少的汇编代码,从而创建更小的文件。尽管我认为现在大多数编译器都是合理的,这不应该考虑太多的大小差异。(但我可能错了,我不是一个编译人员)

  7. 如果应用程序是用所有库静态编译的,那么它会更大,因为现在它必须在其中包含它的依赖项。然而,如果库是动态链接/加载的,那么可执行文件本身可能会更小,因为它只会在运行时链接到库,并且只在需要时加载它们。

防水球是1.5GB还是膨胀防水球1.5GB?

无论如何,这里可能有很多因素在起作用。

在所有源代码文件的顶部,版权/许可证平均有1621个字节。Chromium(没有任何svn/git/object/image文件)有73510个源文件(为此,我将其保存在.cc、.h、.cpp、.idl、.m、>.js、>.c、1.py)。

仅版权声明就有119159710字节。

或116366 KB

或133兆字节。只是在..版权声明

更糟糕的是,Chromium上存在开放漏洞,这表明它们甚至可能违反了自己的许可证,因为它们混合了许多不同风格和版本的开放(以及一些不那么开放)许可证。[1]

来源:

[1]https://code.google.com/p/chromium/issues/detail?id=28291

[2] 我使用铬源代码:

Trevors Mac:src trevor$find-name"*.cc"|wc-l

15941

Trevors Mac:src trevor$find-name"*.h"|wc-l

26125

Trevors Mac:src trevor$find-name"*.cpp"|wc-l

5191

Trevors Mac:src trevor$find-name"*.idl"|wc-l

 881

Trevors Mac:src trevor$find-name"*.m"|wc-l

 258

Trevors Mac:src trevor$find-name"*.js"|wc-l

13528

Trevors Mac:src trevor$find-name"*.c"|wc-l

7856

Trevors Mac:src trevor$find-name"*.py"|wc-l

3988

Trevors Mac:src trevor$

好吧,这样说吧:当你编写汇编时,你可能会拼写出MOV 0,eax(或者其他什么,我实际上不知道汇编),它会被编译到只有几个字节。

高级语言通常比编译下来的机器代码占用更多的空间,因为它们需要让人可读。另一个例子:2147483647在源代码中拼写时占用10个字节,但在编译时仅占用4个字节。

至少部分答案是源代码中的许多单词和符号只对编译器重要,而对可执行文件不重要。例如,关键字"public"one_answers"private"告诉编译器很多关于允许哪些代码访问哪些变量或其他代码的信息,但在CPU上运行的二进制可执行文件级别上,没有这样的信息。CPU只访问它被要求访问的任何内存。

最新更新