Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么生成的二进制文件如此之大? 为什么当我编译我的C++程序这么大(就像在10倍的源代码文件中一样)时生成的二进制文件?与不需要编译的解释语言相比(因此程序大小只是代码文件的大小),它有什么优势?_C++_Size_Binaries - Fatal编程技术网

为什么生成的二进制文件如此之大? 为什么当我编译我的C++程序这么大(就像在10倍的源代码文件中一样)时生成的二进制文件?与不需要编译的解释语言相比(因此程序大小只是代码文件的大小),它有什么优势?

为什么生成的二进制文件如此之大? 为什么当我编译我的C++程序这么大(就像在10倍的源代码文件中一样)时生成的二进制文件?与不需要编译的解释语言相比(因此程序大小只是代码文件的大小),它有什么优势?,c++,size,binaries,C++,Size,Binaries,解释语言假定解释器可用,而编译程序在大多数情况下是独立的。举一个简单的例子:假设您有一个单行程序 print("hello world") 那个“印刷品”是干什么的?很明显,您要求其他代码来做一些工作?而且代码不是免费的,需要运行的代码的总和远远超过您编写的代码行数。在更现实的程序中,您可以利用许多复杂的库来管理windows和其他UI功能、网络、数据库等。现在,无论代码是捆绑到应用程序中,还是从DLL加载,还是存在于解释器中,它都必须在某个地方 编译和解释以及中间解决方案(如Java的编译/

解释语言假定解释器可用,而编译程序在大多数情况下是独立的。

举一个简单的例子:假设您有一个单行程序

print("hello world")
那个“印刷品”是干什么的?很明显,您要求其他代码来做一些工作?而且代码不是免费的,需要运行的代码的总和远远超过您编写的代码行数。在更现实的程序中,您可以利用许多复杂的库来管理windows和其他UI功能、网络、数据库等。现在,无论代码是捆绑到应用程序中,还是从DLL加载,还是存在于解释器中,它都必须在某个地方

编译和解释以及中间解决方案(如Java的编译/字节码解释方法)之间有很多权衡。例如,您可以考虑

  • 每次运行时解释源代码与运行编译代码的运行时成本
  • 口译员的可移植性优势——你需要为不同的平台编译不同版本的应用程序

    • 现代解释语言通常会将代码编译为某种表示方式,以加快执行速度。。。它可能不会写入磁盘,但肯定不能保证程序以更紧凑的形式表示。有些解释器会全力以赴地生成机器代码(例如Java JIT)。然后,解释器本身就存在于内存中,内存可能很大

      有几点:

      • 源代码中的命令越复杂,执行它们可能需要的机器代码操作就越多。因此,更高级的语言特性往往具有更高的编译代码与源代码的比率。这不一定是一件坏事:把它想象成“我只需要说一点我想做的事情,它就可以推断出所有必要的步骤”。编程的挑战是确保它们是必需的——这需要良好的库和程序设计
      • 编译器经常故意决定用一些可执行文件的大小来换取更快的预期执行速度:内联代码与外联代码是这种折衷的一部分,尽管对于小函数来说,两者都不可能始终更紧凑
      • <> LI>更复杂的运行时环境(例如,添加对C++异常的支持)可以涉及当程序首先开始为该语言特性构建必要的环境时运行的额外代码。
      • 库功能可能无法进行比较。除了您很可能需要自己跟踪并非常清楚地使用的那种附加库(例如XML、PDF解析、OpenGL),语言通常会悄悄地使用支持库来实现类似于语言特性和函数的功能。其中任何一个都可能大得惊人。
          例如,许多解释器只公开C库的“代码> Prtff())/>代码语句或类似的内容,而对于输出格式C++有 oStase——一个更复杂、可扩展和类型安全的系统,它(在不同的情况下)在函数调用、例程查询和设置状态的过程中具有持久性,附加的一层可自定义缓冲、可自定义字符类型和本地化,以及通常大量的小型内联函数,这些函数可以根据具体使用和编译器设置生成更小或更大的程序。什么是最好的取决于您的应用程序和内存与性能目标
      • 内置语言语句的编译方式可能不同:一个整数表达式上的
        开关
        ,100个大小写标签在1到1000之间随机分布:一个编译器/语言可能决定“打包”100个大小写,并对匹配项进行二进制搜索,另一个编译器/语言可能决定使用1000个元素的稀疏数组并进行直接索引(这会浪费可执行文件中的空间,但通常会产生更快的代码)。因此,很难根据可执行文件的大小得出结论

      通常,随着程序越来越大、越来越复杂,内存使用和执行速度变得越来越重要。你看不到像操作系统、企业web服务器或全功能商用字处理器这样的系统是用解释语言编写的,因为它们没有可伸缩性。

      通常,程序是用解释语言编写的高级语言,对于这些由CPU执行的程序,必须将程序转换为机器代码。此转换由编译器解释器完成

      编译器只进行一次转换,而解释器通常在每次执行程序时进行转换

      解释程序的运行速度比编译程序慢得多,因为每次执行程序中的每条语句时,解释器都必须分析语句,然后执行所需的操作,而编译代码只在编译确定的固定上下文中执行操作(这就是存在大型二进制文件的原因)


      解释器的另一个缺点是,它们必须作为附加软件出现在环境中,才能运行源代码。

      要扩展,这意味着解释的“程序”要求系统上已经存在所有库等,因此您的“程序”只会有你的代码。像C++这样的语言将存储你在二进制中引用的代码,因此它是一个自包含的单元。@威廉:编译代码在运行时经常依赖于共享库/DLL,所以它不是很清楚。@托尼