gpt4 book ai didi

c++ - 静态编译器和运行时编译器等术语的实际含义是什么?

转载 作者:行者123 更新时间:2023-12-02 02:17:04 26 4
gpt4 key购买 nike

我正在努力学习更多 C++,并尝试了解有关不同编译器及其技术的基础知识。我用谷歌搜索了很多次,但每次我都碰巧遇到需要更多解释的新术语。那么,本主题中的静态编译、动态链接等术语实际意味着什么?

最佳答案

某些语言(例如 C++)在开始运行(即实际使用)之前将所有程序编译为 CPU 可以理解的“ native 机器代码”。这就是“静态编译”。

其他语言(例如 Java)使用“即时”编译器从程序的其他“字节码”表示形式生成 CPU native 代码,但只有在它们开始运行时才会这样做。这就是“运行时”编译。

许多其他语言(例如常见的 python、perl、ruby、Java 实现)都使用“解释器”,这意味着它们的 native 代码会不断查阅某种“字节码”方式来确定下一步要做什么。 (一些非常基本的公司间或专门的解释器甚至不断查阅源代码,而不生成更紧凑的字节码表示,但没有流行的语言这样做 - 它非常慢且笨拙)。

单一语言可能会使用这些方法的任意组合,但一般来说,它要么是静态编译,要么是可能添加即时编译器以加速执行的解释器。

有时,单一语言具有使用不同方法的实现,例如:有限的 C++ 解释器(如 http://root.cern.ch/drupal/content/cint ,但我从未听说过它被“愤怒地”使用),以及编译 python 的系统到 native 代码。

对于“动态链接”:假设您有一个函数“void f();”这确实是一件很棒的事情。如果您将该函数放入库中以供许多应用程序使用,则可以将该函数“静态链接”到特定应用程序中,以在特定点拍摄 f() 功能的“快照”及时创建程序的可执行文件。然后,如果 f() 稍后发生更改,您必须重新链接并重新分发您的应用程序以将更改合并到 f()。或者,您可以将 f() 放入动态链接库中,这意味着包含 f() 的单独库文件与您的程序一起分发或独立于您的程序。每次程序开始运行时,都会查找动态库文件以查找用于 f() 的代码。因此,如果您分发更新的动态库,则可以更新 f(),而无需重新分发所有调用 f() 的应用程序。有时,这只是一个更好的模型,用于向用户分发更新的软件,并避免让每个单独的应用程序参与 f() 更新的分发。 (有时这是一场灾难,因为 f() 的动态版本实际上尚未在应用程序中进行过测试,并且执行了一些微妙的不同操作,从而破坏了应用程序。

关于c++ - 静态编译器和运行时编译器等术语的实际含义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21900766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com