【1.1】系统漫游——信息就是位+上下文

来源:互联网 发布:网络招聘的劣势是 编辑:程序博客网 时间:2024/06/04 01:34

        计算机系统发展这么多年,虽然具体的实现方式一直在变,但底层的原理一直都不曾变化。为了更好的理解我们的程序是如何被执行如何被底层影响的,有必要开展一次全新的计算机系统之旅了。

        我们学习C语言几乎都是从“helloword”开始的,这么一个简单的程序也需要计算机系统各个部件之间紧密配合、协同工作,才能使程序正确的执行。当程序执行时,我们希望知道内部到底发生了什么,只有真正了解本质,对问题的分析才能准确透彻!这次学习之旅会非常漫长,下面就以对“hello”程序的整个生命周期跟踪,大概了解一下关键概念和具体路径,后续章节会进行详细分析。

hello.c :

#include <stdio.h> int main(){    printf("hello world\n");}

通过WinHex查看hello.c文件,可以看到:


        左边是文件对应的16进制代码,右边是我们的源程序,也就是说源程序在计算机中是以ascii码值来保存的,例如:“#”的ascii值是0x23。需要特别注意一下:第2行中有2个连续的0x0D 0x0A ,这是windows中特有的“换行符\r\n” ,在linux中的是“换行符\n”。可以看到,源程序文件是程序员通过编辑器建立的一个“文本文件”,test.c文件就是由一系列的字节(ascii)组成,每个byte都代表某一个“文本字符”。就像hello.c文件这样只由ascii码组成的文件叫做个“文本文件”,其他所有文件都叫“二进制文件”。

        该文件说明一个基本原则:所有的信息,无论是保存在磁盘还是内存中,或者传输在网络中,都是由一系列的bits组成,区分这些不同数据对象的的唯一方法是我们观察的视角。例如:对于0x69,我们可以认为是字符“i”,或者是数值,或者是图像中某一个像素点等等。不管他们是什么,在计算机中都是用二进制表示的,因为计算机只有“开关”两种状态。

       关于“文本文件”和“二进制文件”:

      前面讲到,计算机中的信息都是用二进制位来表示的,就上图中左边的数据内容(计算机物理级别上存储的内容),如果把它看做是文本文件,那么编译器就会把这些数值以8bits为单位,转化成ascii码展现出来,就变成了右边的代码;如果看做是二进制文件,就不会做任何转化,直接呈现出来。应该都有过打开一个未知扩展名文件的经历,这些扩展名就是告诉计算机用什么方式来解析文件,是用“文本文件”还是“二进制文件”,如果用二进制文件,还要看如何解析二进制文件(不同的文件解析规则不同)。如果把.jpg文件扩展名改为.txt,则系统会认为是“文本文件”,解析出来多半是密密麻麻的乱码,这就是把“二进制文件”故意解析成“文本文件”的后果。总的来说,物理层上讲数据都是二进制存储的,逻辑层上讲就会出现“文本文件”和“二进制文件”的不同解析方式。这些就是他们最本质的区别,至于其他的可以自行搜索相关介绍。


原创粉丝点击