我最近使用提供的
build
文件从源代码构建了 Zig 编译器:
./build x86_64-linux-gnu broadwell
并且想知道在构建可执行文件后,源代码目录中文件总大小的极端膨胀。 大小增加 30 倍意味着源文件中提供的每条信息在此过程中被“翻译”为其他形式 29 次。
让我们分析一下从源代码构建可执行文件的过程。在构建大量重复输入的哪一步中,能够解释构建后包含源代码和所有其他文件(包括生成的可执行文件)的目录增大了 30 倍?
我所知道的是:我们有一个源代码文件......它被预处理并保存。这使得源中提供的数据量增加了一倍。现在是两倍了。作为源和预处理文件。好的,下一步是标记化:文件被转换为索引和标记的标记。这会在原始内容中添加一些内容,因为添加标记会赋予标记上下文和含义。现在我们达到了源代码文件大小的 3.5 倍。然后,令牌被转换为 CPU 指令 - 这给出了不同形式(即“语言”)的原始代码大小的 4.5 倍。但这还不足以解释 30 次……所以源代码文件仍然有超过 20 种其他形式/语言被翻译/复制……是哪些?
让我们将这个过程视为从一种语言到另一种语言的一系列翻译:机器可理解的格式是机器“语言”……机器/CPU 所说的语言。源代码文件经过预处理并翻译为分词器可以理解的语言...分词器将其翻译为由标记生成 CPU 指令的部分可以理解的语言...它是一条链后续工具可以理解的下一种语言的翻译...这就像用日语陈述一些东西,并且由于缺乏从日语到俄语的翻译器,需要首先翻译成英语,然后从那里翻译成俄语,从而增加了三倍大小而不是两倍。
换句话说,无法将源代码直接翻译成机器代码的聪明天才......但是可以使用一些专门的中间翻译器,因此它们被链接起来以得出结果,并将其输出的痕迹输入到下一个步骤作为文件保存在驱动器上。通过 30 次代码重复,肯定至少有超过 20 个我不知道的中间步骤......哪些是???
这里有一些数字:
换句话说,原始 45 MB 的信息通过将此信息复制为另一种形式/语言而变成 10.7 GB。是不是很极端?怎么来的?
~ $ pwd
/home/o/oOo/@@/zigPrgLang/zig-bootstrap-0.12.0
~ $ du --max-depth=7 --bytes | sort -n --reverse | head -n 21
11534816050 .
9798353789 ./out
3641046291 ./out/build-llvm-host
2396029965 ./out/host
1946493794 ./out/build-llvm-x86_64-linux-gnu-broadwell
1845856812 ./out/build-llvm-host/bin
1707984748 ./out/host/bin
1518799725 ./zig
1413107665 ./out/build-llvm-host/lib
1378744641 ./out/build-llvm-x86_64-linux-gnu-broadwell/lib
1330181057 ./zig/zig-cache
1193590140 ./zig/zig-cache/o
1020543936 ./out/build-zig-host
654602936 ./out/build-llvm-x86_64-linux-gnu-broadwell/lib/Target
647543403 ./out/build-llvm-host/lib/Target
642163088 ./out/host/lib
481527064 ./out/x86_64-linux-gnu-broadwell
435528487 ./out/x86_64-linux-gnu-broadwell/lib
353705094 ./out/build-llvm-host/tools
333373368 ./out/build-zig-host/stage3
311775221 ./out/zig-x86_64-linux-gnu-broadwell
当然,我可以查看在此过程中创建的每个文件......但这并不能帮助我理解为什么该文件在那里以及它有什么用......
我已经问过全知AI,也上网查过了。 AI 确认这种尺寸增加是正常的,但未能提供细节。我的互联网搜索未能找到解释,无法列出步骤以及它们以文件形式保存到驱动器的信息的估计重复大小。
是的……我知道 Rust 也会发生同样的情况。顺便说一句,我避免使用 KDE 桌面,因为它们的“哲学”导致在开发系统上花费大量千兆字节,并且达到必要的下载量(这使得凯特编辑器对于小的调整毫无用处,因为为了从源代码编译它,您只需要花费千兆字节的网络流量来进行所需的下载)。
您不知道的原因之一是根据项目的先前配置生成编译器调用命令行。以清晰的文本形式,每个源代码文件都会分配一个编译器命令行及其完整路径文件名。下面是两个带有编译命令的文件:
/home/o/oOo/@@/zigPrgLang/zig-bootstrap-0.12.0/out/build-llvm-host/compile_commands.json
/home/o/oOo/@@/zigPrgLang/zig-bootstrap-0.12.0/out/build-llvm-x86_64-linux-gnu-broadwell/compile_commands.json
分别为 5.5 和 6.5 MByte,xz 压缩后大小为 87 KByte。他们将每个源代码文件的完整路径名重复两次,并将带有所有选项的编译器调用添加到编译器可执行文件中。这意味着 12 MB 的大小是“凭空”创建的,并不根源于源代码文件的内容。