有时候 ,做软件时间长了,总是有点困扰。由于做的是java, 处于高级语言的范围,自然会对计算机语言这个东西在社会发展的过程中处于什么样的地位而思考,能不能每写一句代码的时候,从最上层的抽象到最底层CPU硬件的运行有一个清晰
的思维,为什么会出现 计算机这个东西,计算机的出现对于社会的发展有什么用,或者说体现了什么样的社会地位。等等。
有时候想这种问题的时候总是要花费大量的时间来网上搜索,思考。总是想建立起一个自己对于软件,计算机这种事物的一种总体性的理解,总体性发展的了解以及总体性运行的清晰的思绪。
下面是各种各样的问题。
1》计算机为什么会出现这个问题?
看一下人类发展的历史,总是一个以方便人类生活为目的的一种轨迹。从原始社会到制度社会,到最初的工业时代。每一次重大的变革总是在偶然之间的。可以说,在计算机没有出现之前,人类总是会自己来计算一些问题,或者一些重复性的计算任务总是很繁琐。
特别是数学家,总是会有大量的计算存在,人力总是难以胜任。这时候,突然有人提出了一种计算模型,也就是图灵机或者冯诺依曼机,为的是将大量计算,重复性计算的很多计算任务交给这种机器来完成。
2》计算机出现。
人们根据之前的图灵机和冯诺依曼机的设计思想来实现它,当然也是伴随着硬件的发展,这时候计算机雏形出现,也就被造出来了。大概主要包括:cpu 内存 磁盘。
单台的计算机主要是以一个输入为开始,进行一系列的计算动作,从而产生具体的输出。各种各样的单台计算机出现,这时候突然有一个念头,如何将这些计算机连接起来,能够进行资源的共享,也就是这个计算机上面的资源能够发送到亮一台计算机,这是一个很伟大的想法,于是各种大牛搞来搞去出现了计算机网络这个东西实现了所有。在之后的讨论中先不涉及计算机网络的东西,为了减轻思绪压力与其他影响,主要探讨单台计算机上面的运作。
3》关于计算机的运行。
毕竟不是搞底层的,但是整体的运作流程要搞清楚。对于计算机来说,只认识0和1这两个字符,分别代码低电平和高电平。计算机中所有存储的东西(磁盘)都是最终以10序列的方式来存储的(文本,音频,视频等)。
cpu的工作主要是执行1和0的序列,具体的执行方式,猜想是高电平,低电平依靠许多逻辑门来进行实现。
4》汇编语言的出现。
根据3中说法,如果要让计算机进行运作。我们必须给计算机输入相应的01序列。计算机来执行完成输出。(符合上述所说的计算机出现的原因,根据输入进行一系列的运作,产生输出)。这种难度太大。毕竟所有的东西都要统一
转化为10序列,后来为了让机器更好的面向人类,让大部分人都能操作计算机,首先发明了汇编语言。汇编语言就是根据语法写好之后,有一份汇编和机器码的对照表,根据对照表来人工翻译或者自动翻译(编译器的出现)成01序列,
输入cpu,完成相应的操作。
5》操作系统的出现。
为了能够维护大量的软件在计算机上面有条不紊的运行以及屏蔽一切的底层硬件差异,出现了操作系统这种软件。操作系统的设计以及运行机制思想是一个很庞大的内容。在这里,我们设想操作系统其实就是用汇编语言来编写实现的软件
,也就是对汇编语言进行各种各样的封装,向下就是各种汇编的代码集合,向上暴露出操作系统的api.例如windows api等。
6》c语言的出现以及运行机制。
操作系统的出现是大量的计算机编程语言出现的基础。C语言诞生。c语言本质是提供了大量的标准函数库,而大量的标准函数库的内部实现是调用各种windows api来进行实现,一般一种编程语言的出现都是人们为了更加方便的来和计算机打交道。所以基于这种思想,c语言诞生,语言也就是一些规范,程序员按照规范来写代码,调用大量的标准函数库。最后对于生成的.c文件进行统一的编译,编译过程猜想是分级编译,首先统一编译成汇编语言,最后编译成对应平台的10序列,让cpu执行.
7>c++语言
根据6中所说,c++诞生,思想是面向对象。c++也提供了大量的标准类库,标准类库的实现是从c语言来书写的,这种就叫做,c++是基于c来实现的。程序员根据c++的语法,调用c++标准库来书写自己的程序,最后向下统一编程成c文件,汇编语言,最后是10序列,让cpu执行。
8>java语言
java语言的出现是一种设计思想的体现(这种设计思想在c++中已经有所体现),也就是典型的面向对象。并且提供了大量的标准类库,标准类库的实现有用c语言来实现的,有用java来实现的,说到底,最终还是由c语言来实现的。为了让一种语言出现,设计,运用,必须有各种语言规范。java程序员根据java提供的语言规范,调用大量的标准类库来书写自己的代码,为了实现各种功能。首先是大量的java文件,经过简单编译器编译之后生成class文件。class文件是一种文件规范。class文件是不能被操作系统认识的,也就不能直接运行。所以必须有一个东西能够将class文件翻译成10序列来让cpu运行。在这一步先暂停。
9》计算机上面基于操作系统的各种各样的软件(可以直接运行,不需要第三方软件协助运行的)。实际是代码编译到最终的汇编语言,比如那些可执行文件,就是一种汇编,可以直接被操作系统接收,转化为10序列,让cpu运行。
也就是说,程序员想让计算机干些什么事情,通过代码来体现,代码是一种指令,然后让cpu去执行指令。
10》说说java虚拟机这个东西。
java程序员写好代码之后,统一简单编译成class文件,class文件是一种文件规范。class文件怎么来运行呢,通过java虚拟机。在这里,要说明,各种操作系统都实现了各自的java虚拟机的前提下,java虚拟机是一个用c语言来书写的软件,来模拟真实的计算机的行为。各种操作系统怎么来实现各自的虚拟机呢,猜想是各个操作系统向下都是封装汇编语言的,向上都是暴露api的,不同的java虚拟机实现语言c的标准类库实现不同,有的调用windows api 有的调用linux api,也就实现了各个平台的虚拟机。也就说 到现在为止,各个平台都可以运行各自的java虚拟机。
虚拟机说到底是一个软件,就跟c语言实现的其他软件一样。而虚拟机的功能就是输入class文件,将class文件里面的一行一行的java指令翻译成对应平台的10序列,实现一次编写,到处运行的机制。
在这里我们说的是虚拟机的功能,因为就相当于用c语言写的其他程序一样,java虚拟机本质是c程序,里面有三个重要的系统,类加载系统,执行引擎系统,垃圾收集系统,我们可以想象当初实现虚拟机的时候是怎样的,这三个子系统就相当于c代码中的三个函数,第一个函数的功能是将class资源文件加载至内存中,第二个函数的功能是将class文件里面的指令翻译出对应机器的10序列,第三个函数的功能是回收堆没有被引用的对象,在这里我们忽略掉内存模型,数据肯定要存储至一个地方,才能进行运算。
在这里我想将java虚拟机分成两部分来说明:第一部分,就是java虚拟机自身的运行,包括上面三个函数的具体实现,都是采用c,而c调用各个平台操作系统api,最终让cpu来运行,实现上面三个函数的功能。第二部分也就是第二个函数中的功能,这里面是将class文件里面指令翻译成对应机器的10序列,翻译这个动作其实是虚拟机的一个功能而已,运行是在外部cpu上面,会用到解释器。也就是说 外部cpu执行第二个函数的输出结果 是10序列,而输出结果的10序列会让虚拟机内部模拟的计算机来执行,(其实还是外部cpu,只不过虚拟机申请了一部分cpu),宏观体现是两部分内容。
10.1》外部cpu来执行虚拟机的具体逻辑,也就是c语言最终编译成的汇编集合指令,也就是上面三个函数,外部cpu执行的目的就是让虚拟机运行起来,完成自身逻辑。
10.2>class文件应该作为虚拟机的一个资源文件,被虚拟机各种各样的处理,只不过第二个函数的处理结果是10序列,就是说class文件里面每一行指令都要被翻译出对应平台的10序列。这些10序列被内部cpu执行,完成java程序员的一些目的。
再次说一下:虚拟机也就是一个用c语言书写的软件。这个搞好之后在计算机上以汇编指令集合存在,这个汇编指令集合里面实现的功能是class加载,解释,回收等,class文件作为一个外部资源文件被虚拟机汇编 指令一一处理。只不过在第二部分经过cpu处理之后生成10序列,10序列就是我们java程序员写的指令,让cpu再次处理完成虚拟机的整体运作以及java程序的整体运作.
下一步可以深入java虚拟机了。。