2012-08-01 40 views
4

這簡直讓我感到困惑。我剛剛下載了Chrome源代碼的1.5GB tarball。相同的代碼編譯壓縮到大約50MB。Chrome:如何將1.5GB的源代碼壓縮成50MB的可執行文件

爲什麼在源代碼的大小和可執行文件的大小之間存在這樣的差異?

+1

也許有一個可怕的很多評論!在我的公司中,我們記錄了每個源文件中的所有源控制提交消息。這可能會做到這一點。 – paddy 2012-08-01 21:52:03

回答

9

可能導致此問題的列表。

  1. 該可執行文件不需要空白,評論或任何漂亮的格式化的東西。爲了使代碼可讀,源代碼可能有文檔和空白的TONS,所有這些都佔用了空間。

  2. 源代碼可能會帶來很多其他代碼來測試應用程序。但是這個測試代碼並沒有使它成爲最終的應用程序。

  3. 代碼中包含的文檔。根據格式,.doc或.docx文件,文檔可能很大。

  4. 其他人提到源代碼管理註釋也可能在代碼中。在源代碼中包含提交消息也可以使文件變大。

  5. 我不知道如何/何時進行文件比較,但如果在編譯時間後執行了,那麼您可能在編譯時也包含了編譯工件(* .o文件)。所以當你真的只有750 MB(粗略地說)時,你可能會認爲源代碼是1.5GB。

  6. 根據編譯器和它有多好,它可能會生成較少的彙編代碼,從而創建較小的文件。雖然我認爲今天大多數編譯器都是合理的,但這不應該解釋太多的大小差異。 (但我可能是錯的,我不是編譯器的人)

  7. 如果應用程序正在靜態編譯所有的庫,它會更大,因爲現在它必須包含它的依賴關係。但是,如果庫是動態鏈接/加載的,則可執行文件本身可能會大大縮小,因爲它只會在運行時鏈接到庫並僅在需要時加載它們。

tarball是1.5GB還是1.5GB的擴展tarball?

無論如何,很多因素都可以在這裏玩。

+0

@KenWhite你是對的! :-) – 2012-08-01 22:41:35

+0

+1。做得很好。 – 2012-08-01 22:43:44

3

好吧,就這樣說:當你編寫程序集時,你可能會拼寫出MOV 0,eax(或者其他的,我實際上不知道程序集),它會被編譯成幾個字節。

高級語言通常比編譯好的機器代碼佔用更多的空間,因爲它們需要變得人性化。另一個例子:2147483647在源代碼中拼寫時需要10個字節,但編譯時只需要4個字節。

2

答案的至少一部分是源代碼中的許多單詞和符號僅對編譯器而言,而非可執行文件。例如,關鍵字「public」和「private」告訴編譯器很多關於允許哪些代碼訪問哪些變量或其他代碼的信息,但是在CPU上運行的二進制可執行文件的級別上,沒有這樣的事情。 CPU只是訪問它被告知訪問的任何內存。

6

所有源代碼文件頂部的版權/許可平均有1621字節。鉻(沒有任何SVN/GIT中/對象/圖像文件)具有73510的源文件(爲此目的,我保持它在.CC, .H,的.cpp,的.idl,.M,的.js, .c,.py)。

這就是119159710字節的版權聲明。

或者116366千字節

或133兆字節。只是。在..版權聲明..

更糟糕的是有鉻開放的錯誤指示,他們甚至可能違反了自己的牌照,因爲它們混雜了不少不同的口味和開放的版本(和一些不那麼開放)許可證。 [1]

來源:

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

[2]我與鉻源代碼的工作:

Trevors的Mac:SRC特雷弗$找到。 -name「* .cc」|廁所-l

Trevors的Mac:SRC特雷弗$找到。 -name「* .h」|廁所-l

Trevors的Mac:SRC特雷弗$找到。 -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」|廁所-l

Trevors的Mac:SRC特雷弗$找到。 -name「* .c」| wc -l

7856 

Trevors-Mac:src trevor $ find。 -name「* .py」|廁所-l

3988 

Trevors的Mac:SRC特雷弗$

相關問題