当我编译我的 C++ 程序时,生成的二进制文件为什么会这么大(通常比源代码文件大10倍以上)?相对于不需要编译即可运行的解释性语言,这有什么优势呢?
当我编译我的 C++ 程序时,生成的二进制文件为什么会这么大(通常比源代码文件大10倍以上)?相对于不需要编译即可运行的解释性语言,这有什么优势呢?
现代解释性语言通常将代码编译为某种形式的表示以实现更快的执行,虽然可能不会写入磁盘,但无法保证程序以更紧凑的形式呈现。一些解释器会进行完整的机器代码生成(例如Java JIT)。此外,存放在内存中的解释器本身可能很大。
几点说明:
printf()
语句或类似语句,而对于输出格式化,C++具有ostream
-一种更复杂、可扩展且类型安全的系统,具有(好或坏)函数调用间持久状态、查询和设置该状态的例程、额外的可定制缓冲区、可定制的字符类型和本地化等额外层级,以及通常会导致更小或更大程序的许多小内联函数。最佳选择取决于您的应用程序和内存与性能目标。switch
,并在1到1000之间随机分布100个case标签:一些编译器/语言可能会决定"压缩"这100个case,并进行二分查找匹配,而另一些则会使用稀疏数组来直接索引1000个元素(这会在可执行文件中浪费空间,但通常使代码更快)。因此,很难根据可执行文件的大小得出结论。通常,在程序变得越来越大和复杂时,内存使用和执行速度变得越来越重要。你不会看到像操作系统、企业级Web服务器或全功能商业文字处理器这样的系统使用解释性语言编写,因为它们没有可扩展性。
解释型语言假定有一个解释器可用,而编译程序在大多数情况下是独立的。
举个简单的例子:假设你有一个只有一行的程序
print("hello world")
那个“print”是做什么用的?毫无疑问,你正在请求其他代码执行一些工作。而且那些代码并不是免费的,需要运行的总和远远超过你编写的代码行数。在更现实的程序中,你会利用许多复杂的库来管理窗口和其他UI特性、网络、数据库等等。现在,无论这些代码是捆绑在你的应用程序中还是从DLL中加载或者存在于解释器中,它们都必须存在于某个地方。
编译和解释之间有很多权衡,以及像Java的编译/字节码解释方法这样的中间解决方案。例如,你可以考虑以下问题: