A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

傲视星空

初级黑马

  • 黑马币:11

  • 帖子:2

  • 精华:0

© 傲视星空 初级黑马   /  2020-9-8 17:59  /  5420 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  现实中,我都知道不管做什么事情都要有先后次序,要按一定的规则来办事,也即是说我们要遵守办事的“程序”,比如乘坐飞机去另外一个城市,那我们遵守的程序就是:买票-去机场-安检-登机-离机-出机场。
  那“程序员”里面的“程序”又是啥子意思呢?
  其实没有什么区别。
  上一篇文章中我们提到计算机本质就是一个计算器,靠着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 人类(); 我.说话(); }}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马