了解编译器的工作原理
Understand how the compiler works
我正在学习C++编程语言,我对编译器如何创建可执行文件有疑问。我的书上说:
C++是一种编译语言,因此您需要翻译计算机可以执行的文件中的源代码。这个文件是由编译器生成的,它被称为目标代码(.obj),但像helloworld程序这样的程序是由我们编写的一部分和C++库的一部分组成的。
你好世界节目中的这一部分是什么?
然后我的书上写着:
必须编译并链接程序的两个部分才能生成可执行文件。
这是否意味着可执行文件是链接程序的两个部分的结果,并且目标代码无法执行?
这两部分是1)"调用print函数并传入字符串的代码",这是您编译的hello-world程序;2) 实现打印功能的代码(比如"std::cout<<")。我们称之为标准库。
显然,如果没有标准的库对象文件,您就无法获得完整的可执行文件,因为缺少std::cout的实现。
是标准库的原因之一是为了让用户代码(你好世界文件)在不同的操作系统之间更容易移植,因为在Unix系统中,你实际上必须使用"写"函数来打印字符串;但在其他系统中,您可以使用除"写入"之外的其他功能。标准库为您统一了它。
关于标准库对象文件的详细信息包括诸如模板实例化之类的技术,您现在可能对此不感兴趣。
必须编译C和C++。您将使用一个编译器,将您的代码转换为特定于平台的可执行文件。
编译器执行许多步骤:
- 代码首先经过预处理(用宏的值替换宏(#define),用宏的内容替换include文件(#include)
- 语法分析以检查C++语法是否有效
- 语义分析构建指令树
- 优化(如有要求)
- 代码生成:它编写特定于目标平台的汇编代码
- 链接:将所有代码放在一个可执行程序中
至少,这是我在学校学到的东西。。。。
没错:C和C++都有单独的编译和链接步骤。源代码被编译为该特定处理器的目标代码。对象文件和库链接在一起,然后执行。
Java和C#都使用由各自的虚拟机解释和执行的字节码。
相关文章:
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 编译"运算符删除"时C++编译器如何工作?
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- 检查工作正常的 CXX 编译器:/cygdrive/c/cygwin64/bin/clang++ -- 已损坏
- 交叉编译器树莓派不完整类型,而本机编译器工作
- C++编译器 g++.exe 无法编译简单的测试程序 - 确定 CXX 编译器是否工作失败
- 切换到新编译器后,SSCANF 的工作方式有所不同
- 编译器生成的默认构造函数工作 - C++
- boost binary_oarchive 对于不同的编译器,其工作方式不同
- C++ - 我使用哪个编译器来使自动 eq = [ ](..) 语法工作?
- 可视化C++工作区和编译器.你好世界测试初学者
- g++ 编译器的内部工作原理,用于傻瓜
- 编译器指令在C++中的工作
- 比较运算符重载,为什么编译器不做工作?
- MinGW编译器为pip "cannot find vcvarsall.bat"错误后,仍然无法正常工作
- 在正向声明的情况下,编译器是如何工作的,Makefile是如何发挥作用的
- g++编译器为表达式提供<<类型错误,但在Visual Studio中工作
- 编译器问题:iostream不工作
- 名称篡改如何与使用不同编译器编译的DLL和LIB一起工作
- Configure无法找到工作编译器