C++自学第二天----C++编译原理(和java对比)

1、C++编辑器和编译器

通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。
写在源文件中的源代码是人类可读的源。它需要"编译",转为机器语言,这样 CPU 可以按给定指令执行程序。
C++ 编译器用于把源代码编译成最终的可执行程序。大多数的 C++ 编译器并不在乎源文件的扩展名,但是如果您未指定扩展名,则默认使用 .cpp。

2、C++编译过程

C++编译和链接过程
整个代码的编译过程分为编译和链接两个过程,编译对应图中的大括号括起的部分,其余则为链接过程。
编译过程LmNzZG4ubmV0L3dlaXhpbl80MzEyNDI3OQ==,size_16,color_FFFFFF,t_70)
2.1、编译过程
编译过程又可以分成两个阶段:编译和汇编。
2.1.1、编译
编译是读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,源文件的编译过程包含两个主要阶段:
2.1.1.1、编译预处理阶段
2.1.1.2 、编译、优化阶段
2.1.2、汇编
汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。对于被翻译系统处理的每一个C语言源程序,都将最终经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。

2.2、链接过程
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。
例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:
2.2.1、 静态链接
静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。
静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。
2.2.2 动态链接
相对于静态链接而言,要等到程序运行时再将组成程序的目标文件进行链接的过程。
动态链接详细解释
动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过程的一部分。在这些系统上,可执行文件包含一个叫做import directory的表,该表的每一项包含一个库的名字。根据表中记录的名字,装载程序在硬盘上搜索需要的库,然后将其加载到内存中预先不确定的位置,之后根据加载库后确定的库的地址更新可执行程序。可执行程序根据更新后的库信息调用库中的函数或引用库中的数据。这种类型的动态加载成为装载时加载 ,被包括Windows和Linux的大多数系统采用。
操作系统在加载应用软件时要完成的最复杂的工作之一就是加载时链接。
其他操作系统可能在运行时解析引用。在这些系统上,可执行程序调用操作系统API,将库的名字,函数在库中的编号和函数参数一同传递。操作系统负责立即解析然后代表应用调用合适的函数。这种动态链接叫做运行时链接 。因为每个调用都会有系统开销,运行时链接要慢得多,对应用的性能有负面影响。现代操作系统已经很少使用运行时链接。
可以动态链接的库,在Windows上是dynamic link library (DLL),在UNIX或Linux上是Shared Library。库文件是预先编译链接好的可执行文件,存储在计算机的硬盘上。大多数情况下,同一时间多个应用可以使用一个库的同一份拷贝,操作系统不需要加载这个库的多个实例。(这是动态链接的一个优点:(1)当系统多次使用同一个目标文件时,只需要加载一次即可,节省内存空间)

3、java编译和运行过程

Java程序从源文件创建到程序运行要经过两大步骤:
1、源文件由编译器编译成字节码(ByteCode)
2、字节码由java虚拟机解释运行。因为java程序既要编译同时也要经过JVM的解释运行
cmd
执行步骤:
1、在桌面上新建文本文档,写下以下代码,并将文件夹命名为HelloWorld.java

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

2、打开cmd 先通过命令cd "C:\Users\张志浩\Desktop\",进入桌面目录
3、javac HelloWorld.java javac 后面跟着的是java文件的文件名,例如 HelloWorld.java。该命令用于将 java 源文件编译为 class 字节码(ByteCode)文件(也就是HelloWorld.java ----> HelloWorld.class)运行javac命令后,如果成功编译没有错误的话,会出现一个 HelloWorld.class 的文件。

生成class文件
4、java HelloWorld java 后面跟着的是java文件中的类名,例如 HelloWorld 就是类名(注意:文件名需与类名一致,java命令后面不要加拓展名.class
命令和显示结果:
显示结果

4、参考

菜鸟教程网站作为主要学习网站,百度百科作为专业名词解释网站
菜鸟教程
百度百科
博客园 邱明成 Java程序编译和运行的过程
CSDN 壮二宝 C/C++程序编译过程详解
博客园 self-imporvement C++ 动态链接 静态链接
博客园 吴秦 沉溺 C++静态库与动态库

posted @ 2019-05-21 10:21  爱做梦的子浩  阅读(213)  评论(0编辑  收藏  举报