2014-02-20 27 views
2

我正在努力学习C++,并试图了解关于不同编译器及其技术的基础知识。我搜索了很多,但每次我走过时,碰巧遇到需要更多解释的新术语。那么,这个术语中的静态编译,动态链接等术语意味着什么呢?静态编译器和运行时编译器这些术语实际上意味着什么?

+2

我不确切地知道你在问什么,但我很确定它与[tag:static-analysis]没有任何关系。 –

+0

我读了关于静态分析的地方,正好在LLVM的子集工具的关于部分。我提到过,因为我认为它可能与问题有关。 – atoipowered

回答

4

一些像C++这样的语言在开始运行(即实际使用)之前将CPU的所有程序都编译为“CPU本机机器码”。这是“静态编译”。

其他语言(例如Java)使用“Just In Time”编译器从程序的某些其他“字节码”表示中生成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()的动态版本实际上没有经过应用程序的测试,并且做了一些细微不同的操作来破坏应用程序)。

4

关于静态或动态linking,也读Levine's Linker & Loader book

关于共享或静态库,在Linux上阅读Program Library HowTo

共享对象(或库),阅读Drupper's How To Write Shared Libraries paper

你可以加载插件与dlopen(3)但后来读C++ dlopen mini-howto

Compilation通常是静态的,因为它是ahead of time(例如,当编译GCC时)。有时,just in time compilation完成(例如,通过大多数JVM s)。

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

另外,了解C++11并使用最新的GCC 4.8.2编译器(GCC 4.9在几周内可能会被释放,例如在三月或四月2014)。

相关问题