程序在计算机中是怎样运行的
大学,学了四年计算机. 但对于这个问题一直没有深入的了解;
只是大概知道程序需要编译成二进制的可执行文件计算机才可以执行;
最近,突然特别想知道具体是怎么样的?
所以,想着写篇文章记录一下;
这个问题,我想等再过几年肯定就会有更深层次的看法.
如果有理解不到位的地方,请指正.
程序是在计算机上运行的;
应用程序的运行离不开操作系统的调用和处理;
应用程序是由编程语言编写的;
第一次写于: 2020年2月23日
计算机
计算机作为现代社会早已离不开的生产工具,重要性不言而喻;
计算机的历史
计算机的历史很短,但是发展极其迅猛;
从占据一整层楼的大型机器到现在的手机平板.
功能愈发强大,用途也愈加广泛.
但是,想一想为啥要有计算机这个东西呢?
我们在没有计算机之前不也活的挺好吗?
计算机在开发出来之前,人们对于计算的处理只能靠人力或者简单的工具(例如:算盘)来处理;
满足不了人们的需求;
所以计算机就在前人的努力下研发出来了;
学习了很多的技术,都是以实际问题为出发点.
了解到为什么要有这个技术和这个技术的历史,对理解和使用是至关重要的;
计算机的组成
冯诺依曼体系的计算机有下面五个部分组成和对应现实中的硬件.
- 运算器 CPU
- 控制器 CPU
- 存储器 内存,硬盘
- 输入设备 键盘,鼠标等
- 输出设备组成 显示器等
其中 CPU 包含了 运算器和寄存器
我们要知道计算机它只能处理二进制的数据.
最开始人们确实也是二进制的方式交给计算机去计算的;
人们在纸上打孔,用于表示0 / 1 . 然后交给计算机去计算;
但这样太过于反人类,实在麻烦.
人们就发明了汇编语言;
汇编语言吧,算是人类可以读懂的;
大体是下面这样的:
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
movl $2, %esi
movl $1, %edi
call sum
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
这样代码虽然有了一定的可读性,但是写起来也是比较恶心的.
而且每一种 CPU 的机器指令都是不一样的,对应的汇编语言也不一样。
于是,人们就想着在发明一种语言.可以跨平台和更加方便地处理程序;
因此,C语言就被发明出来了;
C语言的出现极为重要,它是很多系统,编程语言的基础.
C语言的出现就体现了封装
与分层
两个重要的思想;
人们对二进制指令封装成汇编语言,将机器与人分开;
进而,人们对汇编再次进行封装,成为可以跨平台在不同硬件上运行的程序;
屏蔽了底层实现的细节.对用户透明;
C语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。
操作系统
操作系统是使用计算机过程中的产物.
最开始,计算机是没有操作系统的;
那时候计算机的能力很弱,计算机利用率还可以;
但是随着计算机硬件的不断发展;计算机的能力得到了巨大的提升;
这就造成大量计算资源的浪费;
为什么要有操作系统
如果没有操作系统的时候,人的工作效率和机器的使用效率比较低。
所以操作系统为用户提供一套简单的操作命令,并为设计语言处理程序、调试程序等系统软件提供方便。
提高了计算机资源的使用率,也屏蔽了一些实现细节;
裸机配备操作系统和其他系统软件后,便成为一台既懂命令,又懂各种高级语言,使用操作十分方便的计算机系统。
操作系统解决了什么问题
操作系统计算机配备的一种大型系统程序,用它来实现计算机系统自身的硬件和软件资源的管理。
- 提高计算机资源利用率,
- 提高计算机的系统响应速度,增强计算机系统性能
- 方便用户使用
Linux 操作系统
一般情况下,我们开发的程序运行在Linux操作系统
上;
所以,下面的例子都是基于Linux的;
Linux系统是由C语言
和汇编语言
编写的;
遵循POSIX
系统接口;保证了程序的可移植性;
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准。
C语言
C语言是编写Unix时的一个产物;
为什么要有C语言
计算机软件的发展历程就是一个持续优化,提升效率的过程。
Unics的发明是为了将复杂的任务简单化处理。
同时,为了将软件和硬件的关联处理实现简化而重新创建了一个新的语言(C语言),
从而实现软件和硬件的分离,为现代操作系统(Unix)的发展打下了坚实的基础。
C语言解决了什么问题
C语言解决了
- 程序的移植性问题;使得一份程序可以在不同类型的机器上运行.
- 具有更好的代码可读性
语言的自举性
C语言编写的程序,可以由编译器编译成可执行文件.
编译C语言
从下面简单的程序到
- 预处理: 展开头文件/宏替换/去掉注释/条件编译 生成 .i 的文件[预处理器cpp]
- 编译: 将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]
- 汇编: 有汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as]
- 链接: 连接目标代码, 生成可执行程序 [链接器ld]
预处理
这是一个很简单的C语言代码 文件名 hello.c