静态编译器和运行时编译器这些术语实际上是什么意思?

3

我正在努力学习C++,并试图了解不同编译器及其技术的基础知识。我通过谷歌搜索了很多内容,但每次遇到新的术语都需要更多的解释。那么,在这个主题中,静态编译、动态链接等术语在实际操作中意味着什么呢?


2
我不确定你具体在问什么,但我很肯定它与[标签:静态分析]无关。 - πάντα ῥεῖ
我在某处读到了关于静态分析的内容,确切地说是在LLVM子集工具的关于部分。我提到这个因为我认为它可能与问题有关。 - atoipowered
2个回答

4
关于静态或动态链接(linking),还可以阅读Levine的Linker&Loader
关于共享或静态库,请阅读Program Library HowTo
关于Linux上的共享对象(或库),请阅读Drupper的How To Write Shared Libraries论文
您可以使用dlopen(3)加载插件,但是请阅读C++ dlopen mini-howto

编译通常是静态的,因为它是预先编译的(例如,使用GCC进行编译时)。有时会执行即时编译(例如,由大多数JVM执行)。

如果在Linux上以C++编码,则需要使用g++ -Wall -g进行编译(稍后使用-O2在程序调试时请求GCC进行优化)。请参阅此处那里的提示。

此外,学习C++11并使用最新的GCC 4.8.2编译器(例如在2014年3月或4月可能会发布GCC 4.9)。

4
一些语言,比如C++,在程序开始运行之前将整个程序编译成CPU可理解的“本机机器码”。这是“静态编译”。
其他语言(例如Java)使用“即时编译器”将程序从某些其他“字节码”表示转换为CPU本机代码,但只有在启动后才执行。这是“运行时”编译。
许多其他语言(例如常见的Python、Perl、Ruby和Java实现)使用“解释器”,这意味着它们具有原生代码,可以持续查询某种“字节码”以确定接下来该做什么。(一些非常基础的公司内部或专门解释器甚至会持续查询源代码,而不生成更紧凑的字节码表示,但没有流行的语言这样做-这太慢且笨拙了)。
单个语言可能潜在地使用这些方法的任何组合,但通常要么是静态编译,要么是解释器,可能添加即时编译器以加速执行。
有时,一种语言可以有不同的实现方法,比如:有一些有限的 C++ 解释器(例如 http://root.cern.ch/drupal/content/cint,但我从未听说过它被“动怒”使用过),还有将 Python 编译成本地代码的系统。
对于“动态链接”:假设你有一个函数“void f();”,它可以完成一些奇妙的事情。如果将该函数放入库中供多个应用程序使用,则可以将该函数“静态链接”到特定应用程序中,以在创建程序可执行文件的特定时间点“快照”f()的功能。然后,如果f()稍后更改,则必须重新链接和重新分发应用程序以合并对f()的更改。或者,您可以将f()放入动态链接库中,这意味着包含f()的单独库文件与您的程序一起或独立分发。每次您的程序开始运行时,它都会查找动态库文件以获取用于f()的代码。因此,如果您分发更新的动态库,则可以更新f()而无需重新分发调用f()的所有应用程序。有时,这只是向用户分发更新软件的更好模型,并避免让每个单独的应用程序参与到f()的更新分发中。(偶尔这是一场灾难,因为动态版本的f()实际上还没有与应用程序进行过测试,并且会以微妙不同的方式执行某些操作,从而导致应用程序出错)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接