これは単に私を困惑させます。Chromeソースコードの1.5GBtarballをダウンロードしました。コンパイルされた同じコードは約50MBに圧縮されます。
ソースコードのサイズと実行可能ファイルのサイズの間にこのような不一致があるのはなぜですか?
これは単に私を困惑させます。Chromeソースコードの1.5GBtarballをダウンロードしました。コンパイルされた同じコードは約50MBに圧縮されます。
ソースコードのサイズと実行可能ファイルのサイズの間にこのような不一致があるのはなぜですか?
これを引き起こす可能性のあるもののリスト。
実行可能ファイルには、空白、コメント、またはその他の優れたフォーマット機能は必要ありません。ソースコードには、コードを読みやすくするためだけに大量のドキュメントと空白が含まれている可能性があり、これらすべてがスペースを占有します。
ソースコードには、アプリケーションをテストするための他のコードがたくさん含まれている場合があります。しかし、このテストコードが最終的なアプリケーションに到達することはありません。
コードに含まれているドキュメント。形式、.docまたは.docxファイルによっては、ドキュメントが膨大になる場合があります。
他の誰かが、ソース管理コメントもコードに含まれている可能性があると述べました。ソースコードにコミットメッセージを含めると、ファイルも大きくなる可能性があります。
ファイル比較をいつどのように行ったかはわかりませんが、コンパイル後に行った場合は、コンパイルアーティファクト(* .oファイル)も計算に含めている可能性があります。したがって、実際には750 MB(大まかに言えば)であるのに、ソースコードが1.5GBであると認識している可能性があります。
コンパイラとその性能によっては、生成されるアセンブリコードが少なくなり、作成されるファイルが小さくなる場合があります。今日のほとんどのコンパイラは妥当だと思いますが、これはサイズのばらつきが大きすぎることを考慮してはいけません。(しかし、私は間違っている可能性があります、私はコンパイラーの人ではありません)
アプリケーションがすべてのライブラリを使用して静的にコンパイルされている場合は、アプリケーション内に依存関係を含める必要があるため、アプリケーションは大きくなります。ただし、ライブラリが動的にリンク/ロードされる場合、実行可能ファイル自体は、実行時にライブラリにリンクし、必要な場合にのみロードするため、大幅に小さくなる可能性があります。
tarballは1.5GBでしたか、それとも拡張tarballは1.5GBでしたか?
とにかく、ここでは多くの要因が関係している可能性があります。
すべてのソースコードファイルの先頭にある著作権/ライセンスの平均は1621バイトです。Chromium(svn / git / object / imageファイルなし)には73,510のソースファイルがあります(この目的のために、.cc 、 .h、.cpp、 .idl、.m、 .js、.c、 .pyに保持しました) 。
これは、著作権表示の119159710バイトです。
または116366キロバイト
または133メガバイト。ただ。in..著作権表示..
さらに悪いことに、Chromiumには未解決のバグがあり、オープン(およびそれほどオープンではない)ライセンスのかなりの数の異なるフレーバーとバージョンが混在しているため、独自のライセンスに違反している可能性があることを示しています。[1]
出典:
[1] https://code.google.com/p/chromium/issues/detail?id=28291
[2]私はクロムのソースコードを使用しています。
Trevors-Mac:src trevor$find。-名前"*.cc" | wc -l
15941
Trevors-Mac:src trevor$find。-名前"*.h" | wc -l
26125
Trevors-Mac:src trevor$find。-名前"*.cpp" | wc -l
5191
Trevors-Mac:src trevor$find。-名前"*.idl" | wc -l
881
Trevors-Mac:src trevor$find。-名前"*.m" | wc -l
258
Trevors-Mac:src trevor$find。-名前"*.js" | wc -l
13528
Trevors-Mac:src trevor$find。-名前"*.c" | wc -l
7856
Trevors-Mac:src trevor$find。-名前"*.py" | wc -l
3988
Trevors-Mac:src trevor $
さて、それをこのように言います:あなたがアセンブリを書くとき、あなたは綴るかもしれませんMOV 0,eax
(または何でも、私は実際にアセンブリを知りません)そしてそれはほんの数バイトにコンパイルされます。
高水準言語は、人間が読める形式にする必要があるため、通常、コンパイルされたマシンコードよりも多くのスペースを占有します。別の例:2147483647は、ソースコードで綴られている場合は10バイトかかりますが、コンパイルされている場合は4バイトしかかかりません。
答えの少なくとも一部は、ソースコード内の単語や記号の多くは、実行可能ファイルではなく、コンパイラにのみ関係するということです。たとえば、キーワード「public」と「private」は、どのコードがどの変数や他のコードにアクセスできるかについてコンパイラに多くのことを伝えますが、CPUで実行されるバイナリ実行可能ファイルのレベルでは、そのようなことはありません。CPUは、アクセスするように指示されたメモリにアクセスするだけです。