现实中,我都知道不管做什么事情都要有先后次序,要按一定的规则来办事,也即是说我们要遵守办事的“程序”,比如乘坐飞机去另外一个城市,那我们遵守的程序就是:买票-去机场-安检-登机-离机-出机场。
那“程序员”里面的“程序”又是啥子意思呢?
其实没有什么区别。
上一篇文章中我们提到计算机本质就是一个计算器,靠着CPU不停的执行一条一条的指令,指令之间是按照逻辑顺序一条一条的送到CPU的,计算机看上去就好像是在执行一个个的“程序”一样,比如如下代码,表示先给x赋值1,然后再将x*2的结果赋值给y
int x=1;int y=x*2
上面就是一块代码,也就是一块程序,书写这块代码的人就是程序员。
所以简单总结一下程序员的工作就是根据现实需求书写一个执行“程序”给计算,利用计算机的快速计算能力得到计算结果。我们所说的java程序员,就是利用java语言来书写“程序”的人。
接下来我们跟大家一起看看如果从40年代计算机诞生开始到现在,一个java程序员都在书写怎么样的程序(当然最开始他书写的并不是java代码)。
一、创世
现在的计算机其实也叫冯诺依曼机,意思是由计算机先驱冯诺依曼先生构建起来的计算机体系结构,在这个结构里面,计算机只能处理0和1组成的指令集合。
所以最开始的程序员书写的代码是什么呢?没错,就是一堆的01,牛逼不牛逼?为什么说它牛逼呢,因为这可不是一般人干的活,完全看不懂在说啥,例如下面这个例子,简直就是天书啊!
最开始的时候,执行这个代码需要有人不停的操纵计算的各种门电路,用于执行各种指令,后来为了加快速度人们就把这些01戳到了纸带上,将纸袋传入计算机从而加快了这个速度,但还是没有解决代码可读性问题。
二,人性化
看到上面那一坨代码,估计是个人都得疯掉,然鹅我们伟大的计算机先驱们在这个基础上发明了汇编语言(Assembly Language),由一些可读的指令和操作数来表达程序,例如下面这块:
特别注明,上述代码来自1994年的雷布斯。
每个指令都可以通过Assembler翻译为01代码,这样总算是解决了程序可读性问题,让编写程序变得简单,也让计算机、程序更容易普及。
三、高级语言
上述汇编语言也有一个问题,就是每种计算机都有各自独立的指令体系,从而导致了要在不同的计算机上做同一件事,就需要给每种计算机编写汇编代码。高级语言由此诞生。
比如很多本科教授的第一门编程语言C。在大学的时候C语言是需要有编程考试的,老师布置了作业之后,我们就在自己的电脑上哗哗哗的写出来,调试,测试,没问题,就把代码发给老师(当然如有需要还奥发给其他同学作为“参考”),老师或者其他同学在各自的电脑上运行,检查。
这个流程也说明了C语言编写的程序可以运行在不同的计算机上面(当然这里说的是源代码)。
C语言带来的好处还不止这个,相对于汇编语言,其对可读性又有了更大的提高,很接近英语的表达了。
四、java登场
C有好处,当然也有不好的地方。假如上述作业中,我们发给老师的不是源代码,而是在我们本地“编译”好的可执行文件,那这个文件可不见到在老师的电脑上就能正常运行,因为C语言的编译过程,直接将代码编译成了机器码,这个过程中我们的代码可能会牵扯到其他的代码,其他代码在不同的电脑上可能版本不同,甚至名字都不一样,所以C系列代码经常见的一个错误就是“符号XXX找不到了”。
那这里终于到了java了,java有一句响亮的口号“编译一次,处处运行”,也就是说它避免了C编译好了之后再其他平台可能运行不起来的问题。那它是怎么解决的呢?
世界还是那个世界,机器还是那个机器,不能说我们用了java,那世界的机器就变得一样了,先驱们采用的策略是“屏蔽”,通过在操作系统和不同硬件之上加入一层“JVM”java虚拟机,从而让我们的代码“运行在虚拟机”上,从而使程序员感知不到不同平台的差异。
要执行一个java程序,我们有三个步骤需要做:写代码、编译代码、解释运行代码。
1,写代码:
public class HelloWorld {public void say()www.7h520.cc { System.out.println("Hello World"); } public static void main(String[] args) { HelloWorld hw = new HelloWorld(); hw.say(); }}
2,编译代码:这一步是将人类可读的java代码编译成JVM识别的字节码
javac HelloWorld.java
之后我们会得到一个HelloWorld.class文件,这个文件里面的就是字节码,用哪个vim打开,输入命令:%!xxd,看到如下结构(后面再来分析这个文件的内容,这里知道它是JVM能够识别的文本即可)
3,解释执行:通过解释器将class文件中的内容翻译成一条条的机器码,让计算机执行(类似于汇编语言的Assembler),就可看到计算机输出了。
java your.package.name.HelloWorld
所以这里总结一下,java程序员用java这种高级语言书写程序,将程序交给JVM,JVM将原代码通过编译成字节码,再由解释器翻译成机器码,让计算机执行,从而得到我们想要的结果。(其实现代JVM并不一定是按照上述流程执行程序,对于热点代码还有JIT技术直接将代码翻译成机器码,省却了中间的解释过程从而加快执行速度)
五、结语
从上面的历史回顾中,我们大致了解了一个java程序员从原始代码开始到目前高级语言所要面临的问题和解决办法。在讲述java的过程中,我们看到了java源代码与机器码中间的代码形式:字节码,了解字节码对我们了解一些java特性很有帮助,后续我们会专门讲解。
今天我们就以一段高级编程语言应该有的样子来结束:
public class 人类 {public void 说话(){ System.out.println("你好"); } public static void main(String[] args){ 人类 我 = new 人类(); 我.说话(); }}
|
|