首页 > 编程语言 >编程软件基础知识(杂记)

编程软件基础知识(杂记)

时间:2023-01-23 22:44:20浏览次数:72  
标签:操作系统 编程 CPU 基础知识 编译 编译器 杂记 源代码 2609360

1 电脑知识

1.1

2 编译型语言和解释型语言

编程语言分为编译型语言和解释型语言

2.1 编译型语言

CC++这两种语言是编译型语言,编译型语言的特点是执行速度快,缺点是什么呢?编译型语言需要编译器处理,主要工作流程如下:

源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器 (Linker) → 可执行程序 (executables)

编译器调用预处理器进行相关处理,将源代码进行优化转换(包括清除注释、宏定义、包含文件和条件编译),然后,通过将经过预处理的源代码编译成目标代码(二进制机器语言),再通过调用链接器外加库文件(例如操作系统提供的API),从而形成可执行程序,让机器能够执行。

在这个工作流程中,目标代码要和机器的CPU架构相匹配,库文件要和操作系统相匹配。如果想在不同CPU的机器或者系统上运行C语言的源代码,就需要针对不同的CPU架构和操作系统进行编译,这样才能够在机器上运行程序。
所以,编译型语言的缺点我们就看到了,它不适合跨平台。

而且,到这里大家应该能知道,为什么CPU一样,但是exe程序只能Windows中运行,而不能在Mac中运行了。

![](/i/l/?n=23&i=blog/2609360/202301/2609360-20230123222935250-1782037980.png)

2.2 解释型语言

源代码无需预先编译成可执行程序,在程序执行时,解释器读取一句源代码之后,先进行词法分析和语法分析,再将源代码转换为解释器能够执行的中间代码(字节码),最后,由解释器将中间代码解释为可执行的机器指令。
所以,编译型语言的可执行程序产生的是直接执行机器指令,而解释型语言的每一句源代码都要经过解释器解释为可以执行的机器指令,相比之下解释型语言的执行效率会低一些。

![](/i/l/?n=23&i=blog/2609360/202301/2609360-20230123223026029-1008845175.png)

例如:Python程序运行时,先将源代码完整的进行转换,编译成更有效率的字节码,保存成后缀为“.pyc”的字节码文件,然后,翻译器再通过这个文件一句一句的翻译为机器语言去执行。

![](/i/l/?n=23&i=blog/2609360/202301/2609360-20230123223108704-459629278.png)

  • 补充:JIT即时编译器(Just-In-Time Compiler)

无论是使用解释器进行解释执行,还是使用编译器进行编译后执行,最终源代码都需要被转换为对应平台的本地机器指令。那么,一些重复出现的代码,就可以将其编译为本地机器指令,重复使用,从而提高效率。这些重复出现的代码包括多次调用的方法和多次执行的循环体。

JIT即时编译器比较典型的例子是在JVM(Java虚拟机)中。
Java程序最初是通过解释器进行解释执行的,当Java虚拟机发现某个方法或代码块运行特别频繁的时候,就会认为这是“热点代码”(Hot Spot Code)。JIT即时编译器会将这些“热点代码”编译成与本地机器相关的机器指令,进行各个层次的优化。

![](/i/l/?n=23&i=blog/2609360/202301/2609360-20230123223236696-148582095.png)

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和内存,让每一个程序都觉得自己是独立运行的。

![](/i/l/?n=23&i=blog/2609360/202301/2609360-20230123223634432-1736375585.png)

3.2 环境变量

环境变量的作用就是指明操作系统的重要具录在哪里

参考链接:『教程』什么是环境变量_哔哩哔哩_bilibili

标签:操作系统,编程,CPU,基础知识,编译,编译器,杂记,源代码,2609360
From: https://www.cnblogs.com/junhengwang/p/17065645.html

相关文章

  • (八)Java网络编程
    Java网络编程1、tcp和udp的区别TCP,TransmissionControlProtocol的缩写,即传输控制协议。1)面向连接,即必须在双方建立可靠连接之后,才会收发数据2)信息包头20个字节3)......
  • 新人入门编程如何选择编程语言
    新人入门编程选择编程语言时,应该考虑以下几点:易学性:选择易于学习和理解的编程语言,可以让新人更快地入门。应用领域:根据自己的兴趣和未来发展规划来选择适合自己的编程语言......
  • Python的UDP网络编程
    UDP编程通信协议有,UDP和TCP模式:1、TCP适用于效率较低,精度较高的场景(文件传输、电子邮件)2、UDP适用于效率较高(视频在线点播,网络语音通话等)接下来的代码介绍的是UDP协议......
  • 网络编程
    目录网络编程一、OSI七层协议1.OSI七层协议之物理链接层2.OSI七层协议之数据链路层3.OSI七层协议之网络层4.OSI七层协议之传输层5.OSI七层协议之会话层6.OSI七层协议之表示......
  • Linux系统编程—进程(作业+答案)
    文章目录​​程序和进程​​​​并发​​​​单道程序设计​​​​多道程序设计​​​​CPU和MMU​​​​进程控制块PCB​​​​环境变量:​​​​常见环境变量​​​​PATH......
  • 读函数式编程思维笔记04_语言与范式_模式与重用
    1. 语言的分类1.1. 静态类型1.1.1. 要求我们事先指定变量和函数的类型1.2. 动态类型1.2.1. 允许推迟指定类型1.3. 强类型1.3.1. 变量“知道”自己的类型1.3......
  • javaweb基础知识梳理
    1、javaweb模型 java的代码是在内存里的,比如Array、LIst、Map这就意味着在这些容器中存储的数据都是临时的,重启java程序之后数据进入新的生命周期。这种程序也有,比如计......
  • 侯捷 STL标准库和泛型编程 视频全集下载
    关注公众号:红宸笑。回复:视频即可 ......
  • 17种编程语言实现排序算法-希尔排序
    开源地址https://gitee.com/lblbc/simple-works/tree/master/sort/覆盖语言:C、C++、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。......
  • 17种编程语言实现排序算法-选择排序
    开源地址https://gitee.com/lblbc/simple-works/tree/master/sort/覆盖语言:C、C++、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。......