1 电脑知识
1.1
2 编译型语言和解释型语言
编程语言分为编译型语言和解释型语言
2.1 编译型语言
C
和C++
这两种语言是编译型语言,编译型语言的特点是执行速度快,缺点是什么呢?编译型语言需要编译器处理,主要工作流程如下:
源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)
编译器调用预处理器进行相关处理,将源代码进行优化转换(包括清除注释、宏定义、包含文件和条件编译),然后,通过将经过预处理的源代码编译成目标代码(二进制机器语言),再通过调用链接器外加库文件(例如操作系统提供的API),从而形成可执行程序,让机器能够执行。
在这个工作流程中,目标代码要和机器的CPU架构相匹配,库文件要和操作系统相匹配。如果想在不同CPU的机器或者系统上运行C语言的源代码,就需要针对不同的CPU架构和操作系统进行编译,这样才能够在机器上运行程序。
所以,编译型语言的缺点我们就看到了,它不适合跨平台。
而且,到这里大家应该能知道,为什么CPU一样,但是exe程序只能Windows中运行,而不能在Mac中运行了。
2.2 解释型语言
源代码无需预先编译成可执行程序,在程序执行时,解释器读取一句源代码之后,先进行词法分析和语法分析,再将源代码转换为解释器能够执行的中间代码(字节码),最后,由解释器将中间代码解释为可执行的机器指令。
所以,编译型语言的可执行程序产生的是直接执行机器指令,而解释型语言的每一句源代码都要经过解释器解释为可以执行的机器指令,相比之下解释型语言的执行效率会低一些。
例如:Python程序运行时,先将源代码完整的进行转换,编译成更有效率的字节码,保存成后缀为“.pyc”的字节码文件,然后,翻译器再通过这个文件一句一句的翻译为机器语言去执行。
- 补充:JIT即时编译器(Just-In-Time Compiler)
无论是使用解释器进行解释执行,还是使用编译器进行编译后执行,最终源代码都需要被转换为对应平台的本地机器指令。那么,一些重复出现的代码,就可以将其编译为本地机器指令,重复使用,从而提高效率。这些重复出现的代码包括多次调用的方法和多次执行的循环体。
JIT即时编译器比较典型的例子是在JVM(Java虚拟机)中。
Java程序最初是通过解释器进行解释执行的,当Java虚拟机发现某个方法或代码块运行特别频繁的时候,就会认为这是“热点代码”(Hot Spot Code)。JIT即时编译器会将这些“热点代码”编译成与本地机器相关的机器指令,进行各个层次的优化。
3 操作系统、环境变量
3.1 为什么你需要操作系统?
假设你是一个程序员, 你写了一个C程序,如下所示:
int main() {
int a = 1;
int b = 2;
int c = a + b;
printf(%d, c);
return 0;
}
你的程序经过编译大概变成了这样的CPU指令
# 初始化a和b, mov指令把前一个操作数的值赋值给后一个操作数
Mov 1, a
Mov 2, b
# %开头的是CPU寄存器, 你可能还记得它是最快最小的存储设备, 我们要把a和b从内存里拿出来, 放进寄存器里
# 接下来Add指令才能工作
Mov a, %eax
Mov b, %ecx
# 加两个寄存器的值, 和写入后一个寄存器中, 在这里是写入eax寄存器
Add %ecx, %eax
# 把这个值写回内存
Mov %eax, c
#打印, 即把内存里的值送到显示器, 这里涉及一系列系统调用, 现在先不管
}
指令送进内存,CPU从内存里读取指令(读取指令和执行指令是CPU硬件实现的),执行访问内存,执行计算。 一起看起来都很美好,看起来我们不需要一个操作系统。
没错!恭喜你发现一个惊天大秘密!我们就是不需要操作系统!
如果我们的程序就一直这么简单的运行,那可能的却不需要。可这不符合我们对现代计算机的认知。浏览器和音乐播放器是两个不同的程序,为什么你能一边刷网页一边听歌?一定是这两个程序一起运行了,可是按说你只有一个CPU, 一套内存,只能跑一个程序,为什么你能同时运行好几个程序呢?
是的, 这就是操作系统最基本的功能,操作系统负责管理CPU和内存,让每一个程序都觉得自己是独立运行的。
3.2 环境变量
环境变量的作用就是指明操作系统的重要具录在哪里
参考链接:『教程』什么是环境变量_哔哩哔哩_bilibili
标签:操作系统,编程,CPU,基础知识,编译,编译器,杂记,源代码,2609360 From: https://www.cnblogs.com/junhengwang/p/17065645.html