程序是如何被计算机所执行的?

2023-10-12 16:20
文章标签 程序 执行 计算机所

本文主要是介绍程序是如何被计算机所执行的?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、计算机程序
要明白程序是如何被计算机所执行的,首先要明白什么是程序?先看看一下几个问题:
这里写图片描述

  • 程序的概念?
    程序(program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。为实现预期目的而进行操作的一系列语句和指令。一般分为系统程序和应用程序两大类。

  • 程序由什么组成?
    程序由数据和指令组成。

  • 什么是机器语言?
    机器语言是直接用二进制代码指令表达的计算机语言,指令是用0和1组成的一串代码,它们有一定的位数,并分成若干段,各段的编码表示不同的含义。

  • 运行中的程序存储在什么位置?
    程序加载时首先到寄存器中,寄存器会将程序复制到内存中从而进行存储,,当程序运行时,CPU会把主从的程序的数据和指令调用到寄存器特定的位置,从而执行。

  • 什么是内存地址?
    内存地址指系统 RAM 中的特定位置,通常以十六进制的数字表示,如同计算机内部特定位置的编号。

  • 程序的解释和运行的计算机部件叫什么?
    CPU的控制器是计算机的指挥中心,负责决定执行程序的顺序,给出执行指令时机器各部件需要的操作控制命令.,程序的解释和运行也是由CPU的控制器来完成。

    程序=指令+数据
    

二、程序的执行过程
当我们输入以下程序,编译运行,计算机从屏幕输出hello, world!。整个过程计算机都怎么运作的呢?

#include <stdio.h>void main()
{
printf("hellow,world!\n");
}

计算机内部存储的是0和1,计算机通过位信息以及上下文来解读这些0、1信息的。
hellow,world是由0和1组成的序列,将这些程序代码转换成相应的文本字符,每8位表示一个字节,用来存储一个字符。

hellow,world的ASCII码表示

因为我们输入的hellow,world是人可以阅读和编写的,但是机器并不能直接识别他们,我们需要把这些文字翻译成机器可执行的二进制文件,这一部分的工作是由编译系统完成的。编译系统由预处理器、编译器、汇编器、连接器四部分组成。以hello, world程序为例,各部分共同完成将源文件编译成二进制可执行文件。各个部分完成的具体工作如下:
这里写图片描述

  • 预处理器:根据以#开头的命令,将包含的头文件加载进入源程序源程序。预处理器读取系统头文件stdio.h中的内容,代替此行内容。源程序经过预处理后,得到另一个c程序,此程序通常以.i为后缀保存。

  • 编译器:将预处理后的.i文件转换成汇编程序。编译器将不同的高级语言(如c语言,C++语言)转换成严格一致的汇编语言格式进行输出。汇编语言以标准的文本格式确切的描述每机器语言指令。编译器得到的文件通常以.s为后缀保存。

  • 汇编器:将汇编语言(.s文件)翻译成机器语言指令,并将这些指令打包成一种可定位目标程序格式。汇编后得到的文件即为二进制文件,通常以.o为后缀。

  • 链接器:hello, world程序中调用过printf函数,它是一个c标准库里的函数。Printf函数存放在一个名为printf.o的单独预编译的文件中。而这个文件必须以适当的方式并入到我们的程序中,这个工作由链接器完成。将外部的.o文件并入后,得到一个完整的hello, world可执行文件。可执行文件加载到存储器后,由系统复制执行。

    程序加载进入CPU的过程
    这里写图片描述

  • Shell:命令行解释器,当用户输入一行命令后,shell先判断它是不是一个shell内置命令,如果不是,shell会假定用户输入为一个可执行文件的名字,从而去加载并执行该文件。因此,当我们通过编译系统将源文件编译成可执行二进制文件后,在shell中输入我们得到的可执行二进制文件名,shell将其从磁盘中加载到主存当中,通过CPU进行解释运行,最终通过终端设备(屏幕)将他显示出来,程序运行结束。

  • 主存储器:简称主存,是处理器执行程序时用于临时存放程序及其数据。主存由一组动态随机存储器芯片组成。

  • 运算器:计算机中执行各种算术和逻辑运算操作的部件。

  • 控制器: 计算机中执行各种算术和逻辑运算操作的部件。

三、CPU的组成
CPU是由四大部分所构成的:寄存器、控制器、运算器、时钟。

  • 寄存器
    • CPU内部的内存,程序加载进CPU内部的寄存器中从而被用来解释和运行。
  • 控制器
    • 计算机的指挥中心,负责决定执行程序的顺序,给出执行指令时机器各部件需要的操作控制命令。
  • 运算器
    • 计算机中执行各种算术和逻辑运算操作的部件。
  • 时钟
    • 它是处理操作的最基本的单位,影响着指令的取出和执行时间。

CPU中的主要寄存器
这里写图片描述

累加寄存器(AC) :主要进行加法运算。
标志寄存器(PSW) :记录状态,做逻辑运算。
程序计数器(PC) :是用于存放下一条指令所在单元的地址的地方。
基质寄存器(BX) :储存当前数据内存开始的位置。
变址寄存器 :储存基质寄存器的相对位置。
通用寄存器(GPRs) :支持有所的用法。
指令寄存器(IR) :CPU专用,储存指令。
堆栈寄存器(SP) :记录堆栈的起始位置。

  寄存器寄存器是中央处理器内主要组成结构成分,它是CPU当中有限存贮容量的高速存贮部件,它在工作时能将计算机指令数据进行暂时的存储。内存地址=基质+变址

处理器读取并解释存储在存储器中的指令
这里写图片描述

处理器的操作主要是围绕程序计数器、算术/逻辑运算单元、主存来进行运作的。处理器首先从PC所指向的主存存储单元读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC寄存器,使其指向下一条要执行的指令。CPU会执行的操作有:

  • 加载:把一个字节或一个字从主存复制到寄存器,覆盖掉寄存器中原来的值。

  • 存储:把一个字节或一个从寄存器复制到主存,并覆盖主存中原来的值。

  • 操作:把两个寄存器的内容复制到ALU,ALU对两个字做算术运算后存回其中的一个寄存器,该寄存器中原来的值会被覆盖。

  • 跳转:从cpu执行的指令抽取一个字的内容存入PC,覆盖掉原来的值,从而改变下一条要执行的指令,达到跳转的目的。

这里写图片描述

hellow,world程序首先被加载,从磁盘中复制到寄存器中,寄存器将hwllow,world程序复制到主存中进行存储。程序运行过程中,CPU执行hellow,world机器指令,指令的结果是将”hellow,world”字符由内存复制到寄存器,寄存器再将结果复制到显示设备上显示出来。

这篇关于程序是如何被计算机所执行的?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/197022

相关文章

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线