我正在努力学习C++,并试图了解关于不同编译器及其技术的基础知识。我搜索了很多,但每次我走过时,碰巧遇到需要更多解释的新术语。那么,这个术语中的静态编译,动态链接等术语意味着什么呢?静态编译器和运行时编译器这些术语实际上意味着什么?
回答
一些像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()
的动态版本实际上没有经过应用程序的测试,并且做了一些细微不同的操作来破坏应用程序)。
关于静态或动态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在调试程序时进行优化)。请参阅this和that提示。
另外,了解C++11并使用最新的GCC 4.8.2编译器(GCC 4.9在几周内可能会被释放,例如在三月或四月2014)。
- 1. 预编译在编译器中究竟意味着什么
- 2. 链接在编译器环境中意味着什么?
- 3. 这是什么MSVC++编译错误意味着
- 4. sret实际上意味着什么?
- 5. 这些术语在CQ5/AEM环境中意味着什么?
- 6. 编译此程序时,此构建错误意味着什么?
- 7. 这些使消息意味着什么,而编译理智的后端?
- 8. SmartGit冲突解决器实际上意味着什么?
- 9. 当我们声明变量时,实际上编译器会做些什么?
- 10. Mongodb复制集服务器状态:FATAL状态实际上意味着什么?
- 11. Const编译器/运行时
- 12. 什么$,这实际上意味着>笨
- 13. 什么onEndReachedThreshold实际上意味着在反应母语
- 14. 什么是“\”实际上是在PHP语法意味着
- 15. 这个编译器构建语句是什么意思?
- 16. 编译时编译器跳过语句?
- 17. 什么是在Java编译的方法意味着
- 18. “重新编译源代码”意味着什么?在Java中
- 19. 什么是一个“合格”的大会意味着编译
- 20. 编译置换在GWT中意味着什么?
- 21. Rust完全没有增量编译意味着什么?
- 22. 这些Scripts.Render语句之间的编译器有什么区别?
- 23. Django dev服务器中的破管 - 这实际上意味着什么?
- 24. 从XNA中的文件动态编译和运行着色器
- 25. 这些词在编程环境中意味着什么
- 26. 什么是X:静态意味着
- 27. 静态在VB中意味着什么?
- 28. 为什么这个C++代码会与某些编译器一起编译而不是其他编译器?
- 29. “何时加载类”实际上意味着什么?
- 30. 这些字段意味着什么?
我不确切地知道你在问什么,但我很确定它与[tag:static-analysis]没有任何关系。 –
我读了关于静态分析的地方,正好在LLVM的子集工具的关于部分。我提到过,因为我认为它可能与问题有关。 – atoipowered