读这三本书是因为自己对知识逐渐有了一个一点点的了解之后决定的。最先想学习pring的相关框架,在看了两本相关的书籍之后发现自己并不能独立的查看Spring框架的源码,因为自己没有弄清楚javase的基础模块,比如securityManager,Class,properties等,发现自己应在先了解jvm,但是在准备看jvm的时候又发现自己对基础的计算机基础也不太清楚,这就引出了矢泽久雄的三本书。
这确实是三本非常棒的书,《计算机是怎样跑起来的》,《程序是怎样跑起来的》以及《网络是怎样连接的》。三本书基本可以看作现代计算机的通识,对我的启发非常重要。
下面根据这三本书描绘一下自己构建的框架:
部分高级语言的作用流程(例如C):
应用程序 –>解释–>汇编 –>CPU
java语言作用流程:
应用程序 –>编译 –>虚拟机 –>解释+编译 –>winAPI+汇编 –>CPU
服务器的作用流程(省略协议栈部分内容表示):
socket –> accept –> 如果没有可连接套接字,启动监听直到接收可连接套接字 –>收发数据 –>删除套接字
其中不管我们使用的是那种高级语言,最终起作用的始终是作用到CPU上。其中CPU便是各语言的基础,也是共同的部分。在此需要中间插一句,window,linux系统的公共API接口,在各种语言的开发上起到了非常重要的作用。
这里主要介绍一下java的作用流程。开发出来的源程序经过编译生成.class文件,编译是一门比较庞大的知识体系,其复杂程度以至于专门设立一门学科,大概也就窥见一般了,当然这是逐渐演化的结果,最初也是较为简单。我们不对每一步做过多的探究,它主要的过程就像我们看英语一样。主要了解其中几大步骤 :
词法分析 –>词义分析 –> 语法分析 –> 语义分析 –> 优化语言 –>生成目标语言
经过编译成的二进制文件作用在虚拟机上,这个虚拟机有一点需要提及一下。网上有一些容易引起误导的说法。虚拟机就像字面的含义,虚拟的机器,它模仿计算机划分内存区域,生成虚拟机栈。很多说法就是在这个概念上容易误导人。虚拟机也可以看作一个程序,经过解释+编译最终作用在CPU上。一个完整的工业虚拟机并不是用一种语言完成的,大部分C,C++也还有其他语言。它的具体的设计框架我下一阶段需要学习的。这个虚拟机很多都是调用winAPI(window)。
CPU是由控制器和运算器构成,其中有大量的寄存器在协调运行,从单片机,plc开始CPU的流程就大体确定,这几十年也还遵循着这个规律,但是功能可能会发生巨大变化,其中大体流程:
取寄存器 中存储 地址 –>获得 指令 + 数据 分别存放在寄存器中–>cpu的控制器读取指令 –>运算器执行数据
————————————————————————————————————————————————————————————————————————————————————————————
从冯诺依曼计算机开始到现在已经发生了巨大的变化,但是其运行的核心并没有变化,都是以控制器和运行器为核心,辅以内存和输入输出。现代window计算机应该也是在其基础上开发出来图形界面,将展示信息存入内存,通过GPU渲染。
系统最开始是由监听的需求引出的,发展到今天已经是一个庞然大物。
之前我以为算法和数据结构是运算器和虚拟机的定义的,这是一个大坑,它们都是由语言写的。甚至a++这种语句,也都也已说是一种算法,只不过这种算法实在是非常简单的一种,像二叉树,红黑树,Btree,B+tree等都是算法。数据结构也没有那么高深,它的概念也是较为宽泛一点,就像我们java中定义的domain类也是一种数据结构,但是像stack,queue等常听到的它们都是在数组的基础上,通过逻辑演化而来的,更像是在数组之上的概念。
xml,html都是文本标记语言,它们的解析方式也都是需要事先定义好模板,按照模板来解析,xml的模板主要有两种xsd,dtd。在spring框架中之所以能成bean对象就是事先定义好xsd的文件了。html有一个预编译的名词来形容,但是不管怎样,都是有事先定义好的模板。它们的解析方式和普通的文件的解析方式很象,就那么几种SAX,DOM,JAXP等,我看spring就是sax的方式。
计算机中虽然都是二进制数据,但运算并不是完全按照二进制做加减乘除操作的,最重要的原因是负的小数的除,导致并不能简单的使用位左移和右移。java中double类型做分母并不会报错,都可以正常运行的原因就是它采用的双精度和补码运算。
最新评论