导图社区 计算机语言(第一版)
这是一个关于计算机语言(第一版)的思维导图,涵盖了包含常识、分类、进程、内存、物理地址空间(物理内存)等详细知识点。
编辑于2025-03-14 13:31:18计算机语言
注:以后可购买《编译原理》一书,我很好奇编译器翻译后的机械语言程序要不要经过操作系统再翻译一遍?
我认为需要
常识
小型计算机(UNIX系统)
微型机(个人计算机)
大型机(超级计算机)
计算机系统
硬件系统
主机
中央处理器(CPU)
运算器
处理器
内存储器(内存)
RAM
ROM
外部设备
外部存储器
硬/软/光/U盘等
输入设备
键盘、鼠标、扫描仪等
输出设备
显示器、打印机、绘图仪等
其它设备
调制调解器等
软件系统
系统软件
应用软件
存储在计算机中的所有内容都是数字。计算机以数字形式存储数字和字符(如,在文本文档中使用的字母)。 每个字符都有一个数字码。计算机载入寄存器的指令也以数字形式存储,指令集中的每条指令都有一个数字码。
计算机程序最终必须以数字指令码(即机器语言)来表示。
编程历史
以前:用机器语言编程,直接操作计算机工作。
现在:用高级编程语言编程,程序经过编译器翻译成机器语言后,操作计算机工作。
机器语言:所谓机器语言,就是只用0和1两个二进制数书写的编程语言。 它有的时候也叫作原生代码(Native Code)。 这里需要注意,只要CPU种类不同,对机器语言的解释也就不同。
编译器:由于计算机只能读懂机器指令,所以就需要一个能够将汇编指令转换成机器指令的翻译程序,这样的程序我们称其为编译器。 程序员用汇编语言写出源程序,再用汇编编译器将其翻译为机器码。就像我们写的Java,OC,等等,都是由编译器最终转换成01代码,最后由计算机执行。
时钟信号的频率:由时钟发生器发送给CPU的电信号的频率,单位是MHZ(兆赫兹 = 100万回/秒)。 时钟信号是0和1两个数之间反复变换的电信号,类似于滴答滴答左右摆动的钟摆一样。通常我们把发出一次滴答的时间称作一个时钟周期。
计算机有源码、反码、补码三种码(十进制转二进制),在计算机里面保存的是一个数字的补码。
正数的补码=原码, 负数的补码=原码取反+1
计算机语言就是二进制语言
计算机能直接识别和接受的二进制代码称为机器指令,机器指令的集合就是该计算机的机器语言。
地址
计算机运行时,数据会存放在内存中,内存会以字节为单位划分为多个存储空间,并且为每个字节默认设置一个对应的编号,这个编号就是地址
地址只是计算机规定的一个值,所以不会占用内存的存储空间,地址显示的长度会根据系统及编译器的位数确定。 64位编译器显示的地址为16个16进制数,32位编译器显示的地址为8个16进制数。
注:如果存放的数据只占用了一个字节,那么该数据占用的字节地址就是该数据的地址。
如果存放数据占用多个字节,那么该数据的地址就是第一个字节的地址
注:在计算机运行时,内存会动态分配存放数据的位置,所以同样的数据在每次运算时存放的地址可能会产生变化。
在高级语言中,数据类型分为常量和变量。
有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这些称为常量(constant)。
其他数据类型在程序运行期间可能会改变或被赋值,这些称为变量(variable)。
注:无论是常量还是变量都可以再细分为三个部分
上
保存的值
中
程序员起的名字
注:个人感悟,不一定对
下
地址
在高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符(identifier)。
分类
低级语言
只适用于单个的计算机型号
机器语言
机器语言是一种指令集的体系,机器语言是机器能直接识别的程序语言或指令代码,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成, 或指不经翻译即可为机器直接理解和接受的程序语言或指令代码,机器语言是用来定义计算机程序的形式语言,用来向计算机发出指令。
汇编语言(符号语言)(符号汇编语言)
使用助记符的编程语言叫做“汇编语言“。
注:助记符:根据指令功能的单词起一个相似的昵称,并将这个昵称做一个1对1的映射,而与其对应的就是0和1的组合。
高级语言
适用于大部分的计算机型号
按发展历程分类
非结构化的语言
编程风格比较随意,只要符合语法规则即可, 没有严格的规范要求,程序中的流程可以随意跳转。
BASIC
FORTRAN
ALGOL
结构化(面向过程)语言
规定程序必须由具有良好特性的基本结构(顺序结构、选择结构、循环结构)构成, 程序中的流程不允许随意跳转,程序总是由上而下顺序执行各个基本结构。
QBASIC
FORTRAN 77
C语言
用C语言编写的程序是源程序。经过编译程序(也称编译器)把C源程序翻译成二进制形式的目标程序,然后再将该目标程序与系统的函数库以及其他目标程序连接起来,形成可执行的目标程序。
面向对象的语言
?????
C++
C#
Visual Basic
Java
按运行原理分类
编译性语言
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译, 所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。 编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题, 需要根据运行的操作系统环境编译不同的可执行文件。
汇编
C/C++
Delphi
解释性语言
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。 灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
Python
Java
PHP
Ruby
按检查数据类型的时机分类
动态类型语言
在运行期间才去做数据类型检查的语言,也就是说, 在用动态类型的语言编程时,永远也不用给任何变量指定数据类型, 该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。
Python
VBScript
Ruby
静态类型语言
静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的, 也就是说在写程序时要声明所有变量的数据类型。
C/C++
C#
JAVA
按数据类型的重要性分配
强类型定义语言
强制数据类型定义的语言。也就是说, 一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。 强类型定义语言是类型安全的语言。
弱类型定义语言
数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。
进程
程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位。
简单来说,进程就是程序的一次执行过程
注:进程不仅包含正在运行的程序实体,它还包括这个运行的程序中占据的所有系统资源。
注:时间片:规定CPU处理一个进程的时间段。
时间一到,无论进程是否运行结束,操作系统都会强制CPU去执行另一个进程。
注:进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容。 当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行。
特性
动态性:进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。
动态性是进程最基本的特征。❤️
并发性:指多个进程实体同时存于内存中,能在一段时间内同时运行。并发性是进程的重要特征,同时也是操作系统的重要特征。
独立性:指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单元。凡未建立PCB的程序都不能作为一个独立的单元参与运行。
异步性:由于进程的相互制约,使得进程具有执行的间断性, 即进程按各自独立的、不可预知的速度走走停停,具有何时开始何时暂停何时结束不可预知的性质, 就会导致执行结果的不可再现性,为此在操作系统中必须配置相应的进程同步机制。
结构性:每个进程都配置一个PCB对其进行描述。从结构上看,进程实体是由程序段、数据段和进程控制块三部分组成的。
结构
程序段
进程执行的机器代码,是代码文本的一个副本。
它是只读的,也是共享的,多个进程可以共享同一个程序段。
数据段
保存了进程执行过程中需要操作的数据,所有进程变量都保存在数据段中。
数据段属于进程的私有部分,每个进程都有属于自己的数据段,其中所保存的数据只能被本进程访问,不同进程的数据段是隔离的。
分为
初始化数据段:保存了程序中已经初始化过的数据,包括全局变量和静态变量。
未初始化数据段:保存程序中没有初始化的数据,包括全局变量和静态变量。
注:数据段随着进程的运行而改变,执行结束后也会被操作系统回收。
进程控制块(进程描述符)(PCB)
每个进程有且仅有一个进程控制块,它是进程存在的唯一标识,是操作系统用来记录和刻画进程状态及环境信息的数据结构,也是操作系统掌握进程的唯一资料结构和管理进程的主要依据。 所以 PCB 是提供给操作系统使用的,操作系统需要对各个进程进行管理,所有管理时所需要的信息,都会被放在 PCB 中。 创建进程和撤销进程等都是指对 PCB 的操作,当进程被创建时,操作系统为其创建 PCB,当进程结束时,会回收其 PCB。
包含
进程描述信息:用来让操作系统区分各个进程,当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的 “身份证号”— PID(ProcessID,进程 ID)。
注:进程描述信息还包含进程所属的用户 ID(UID)
进程控制和管理信息:记录进程的运行情况。比如 CPU 的使用时间、磁盘使用情况、网络流量使用情况等。
资源分配清单:记录给进程分配了哪些资源。比如分配了多少内存、正在使用哪些 I/O 设备、正在使用哪些文件等。
CPU 相关信息:进程在让出 CPU 时,必须保存该进程在 CPU 中的各种信息,比如各种寄存器的值。用于实现进程切换,确保这个进程再次运行的时候恢复 CPU 现场,从断点处继续执行。这就是所谓的保存现场信息。
注:操作系统根据PCB创建和切换进程
根据程序段提供的代码执行逻辑运算
数据段用来保存过程中的中间变量
状态
新建状态:进程正在被创建,创建好后会转到就绪状态。
创建进程通常需要先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息,然后由系统为该进程分配运行时所必须的资源,最后把该进程转入就绪状态。
就绪状态:进程获得了除处理机外的一切所需资源,一旦得到处理机,便可立即运行。
系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列,成为就绪队列。
运行状态:进程占有CUP,正在处理机上运行。
在单核处理机环境下,每个时刻最多只有一个进程处于运行状态。
阻塞状态:又称等待状态。进程正在等待某一事件而暂定运行,如等待某资源为可用或等待输入/输出完成。
即使处理机空闲,该进程也不能运行。
终止状态:进程正从系统中消失,可能是进程正常结束或其他原因中断退出运行。
进程需要结束运行时,系统首先必须置该进程为结束状态,然后再进一步处理资源释放和回收等工作。
通信
共享存储:在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。
在对共享空间进行写/读操作时,需要使用同步互斥工具,对共享空间的写/读进行控制。
消息传递:进程通过系统提供的发送消息和接收消息两个原语进行数据交换。
直接通信方式:发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓存队列上,接收进程从消息缓冲队列中取得消息。
间接通信方式:发送进程把消息发送到某个中间实体,接收进程从中间实体取得消息。
这种中间实体一般称为信箱,这种通信方式又称信箱通信方式。该通信方式广泛运用于计算机网络中,相应的通信系统称为电子邮件系统。
管道通信:向管道提供输入的发送进程,以字符流形式将大量的数据送入管道;而接收管道输出的接收进程则从管道中接收数据。
注:“管道”是指用于连接一个读进程和一个写进程以实现他们之间的通信的一个共享文件,又称pipe文件。
注:管道机制必须提供以下三方面的协调能力:互斥、同步和确定对方的存在。
线程
线程被设计成进程的一个执行路径,是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
注:线程是处理器任务调度和执行的基本单位。
注:同一个进程内的线程共享进程的地址空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。
注:进程的并行性指的是多个进程在同一时间段内同时执行的能力。
注:进程的并发性指的是多个进程在同一时间段内交替执行的能力。
注:操作系统→进程→线程
物理地址空间(物理内存)
内核
最高地址,用户无法访问和修改
栈空间
特点:先进后出,系统管理
包含:局部变量,含数形参,自动变量
堆空间
特点:先进先出,用户管理
包含:malloc,ralloc,calloc分配的空间
数据段
包含
bss:未初始化的全局变量
or:常量
静态数据区:static修饰静态变量、初始化的全局变量
代码段
?????
内存
堆区(heap)——由程序员分配和释放, 若程序员不释放,程序结束时一般由操作系统回收。
栈区(stack)——由编译器自动分配释放 ,存放函数的参数值,局部变量等。
静态全局区
未初始化静态全局区 —— 静态变量,全局变量,没有初始化的存在此区
初始化的静态全局区 —— 静态变量、全局变量,赋过初值的存放在此区
文字常量区——常量、字符串就是放在这里的。 程序结束后由系统释放
(程序)代码区——用于存放程序编译后形成的可执行代码(执行时装入)。