java代码是干嘛的_程序员究竟是干嘛的呢?

43e1feb25e3e70d6371b1c23388ae763.png

现实中,我都知道不管做什么事情都要有先后次序,要按一定的规则来办事,也即是说我们要遵守办事的“程序”,比如乘坐飞机去另外一个城市,那我们遵守的程序就是:买票-去机场-安检-登机-离机-出机场。

那“程序员”里面的“程序”又是啥子意思呢?

其实没有什么区别。

上一篇文章中我们提到计算机本质就是一个计算器,靠着CPU不停的执行一条一条的指令,指令之间是按照逻辑顺序一条一条的送到CPU的,计算机看上去就好像是在执行一个个的“程序”一样,比如如下代码,表示先给x赋值1,然后再将x*2的结果赋值给y

int x=1;int y=x*2

上面就是一块代码,也就是一块程序,书写这块代码的人就是程序员。

所以简单总结一下程序员的工作就是根据现实需求书写一个执行“程序”给计算,利用计算机的快速计算能力得到计算结果。我们所说的java程序员,就是利用java语言来书写“程序”的人。

接下来我们跟大家一起看看如果从40年代计算机诞生开始到现在,一个java程序员都在书写怎么样的程序(当然最开始他书写的并不是java代码)。

一、创世

现在的计算机其实也叫冯诺依曼机,意思是由计算机先驱冯诺依曼先生构建起来的计算机体系结构,在这个结构里面,计算机只能处理0和1组成的指令集合。

所以最开始的程序员书写的代码是什么呢?没错,就是一堆的01,牛逼不牛逼?为什么说它牛逼呢,因为这可不是一般人干的活,完全看不懂在说啥,例如下面这个例子,简直就是天书啊!

575c8cf0ebc5307d13f0090ca5bb1200.png

最开始的时候,执行这个代码需要有人不停的操纵计算的各种门电路,用于执行各种指令,后来为了加快速度人们就把这些01戳到了纸带上,将纸袋传入计算机从而加快了这个速度,但还是没有解决代码可读性问题。

二,人性化

看到上面那一坨代码,估计是个人都得疯掉,然鹅我们伟大的计算机先驱们在这个基础上发明了汇编语言(Assembly Language),由一些可读的指令和操作数来表达程序,例如下面这块:

68bb198b815e6e3e8b81755c8dcc472c.png

特别注明,上述代码来自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() {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能够识别的文本即可)

bb7d2981306d40c5eee300af6337b875.png

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 人类();我.说话();}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值