@Chiang
2020-05-16T18:48:30.000000Z
字数 2635
阅读 531
C语言
2020-05
- 写在前面,我觉得视野很重要,有一个全局的世界观,这样才不会迷茫,才能体会到当下做的事情具有的意义
hello.c
# include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
首先不同的上下文是如何规范的可以参考下面链接,这里我就不整理了:
字符编码笔记:ASCII,Unicode 和 UTF-8
Unicode字符平面映射
- hello 程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创建并保存的文本文件, 文件名是
hello.c
.- 源程序实际上就是一个由值
0
和1
组成的位
(又称为比特
)序列,8个位被组织成一组,称为字节
.每个字节
表示程序中的某些文本字符.- 大部分的现代计算机系统都使用
ASCII
标准来表示文本字符.这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符.- 像
hello.c
这样只由ASCII
字符构成的文件称为文本文件
,所有其他文件都称为二进制文件
.
基本思想:
系统中所有的信息--包括磁盘文件、内存中程序、内存中存放的用户数据以及网络上传输的数据,都是由一串比特表示的.区分不同数据对象的唯一方法是我们读到这些数据对象是的上下文.
- 要在系统上运行
hello.c
程序,每条C语句都必须被其他程序转化为一系列的低级机器语言
指令.- 然后这些指令按照一种称为
可执行目标程序
的格式打好包,并以二进制磁盘文件的形式存放起来.目标程序也称为可执行目标文件
.
在 Unix 系统上,从源文件到目标文件的转化是由
编译器驱动程序
完成的:
linux > gcc -o hello hello.c
GCC 编译器驱动程序读取源程序文件
hello.c
,并把它翻译成一个可执行目标文件hello
.这个翻译过程可分为四个阶段完成.
执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统
.
- 预处理阶段: 引入头文件内容
- 编译阶段: 转成汇编语言
- 汇编阶段: 转成二进制文件
- 链接阶段: 调用C库函数
# shell 命令行执行
./hello
- 总线
- I/O设备
- 主存
- 处理器
操作系统有两个基本功能:
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备.
操作系统通过几个基本的抽象概念(进程,虚拟内存和文件)来实现这两个功能.
- 文件是对I/O设备的抽象表示
- 虚拟内存是对主存和磁盘I/O设备的抽象表示
- 进程则是对处理器、主存和I/O设备的抽象表示.
我们一直把系统视为一个孤立的硬件和软件的集合体.实际上,现代系统经常通过网络和其他系统连接到一起.从一个单独的系统来看,网络可视为一个I/O设备.
有趣的短视频:
网络的诞生就是一场战争
跟着网络勇士们学习网络数据传输
- 文件是对I/O设备的抽象
- 虚拟内存是对程序存储器的抽象
- 进程是对一个正在运行的程序的抽象
- 虚拟机是对整个计算机的抽象,包括操作系统、处理器和程序.
参考资料:
深入理解计算机原理
字符编码笔记:ASCII,Unicode 和 UTF-8
Unicode字符平面映射
基本步骤与编程机制
网络的诞生就是一场战争
跟着网络勇士们学习网络数据传输