某一天,程序员使用Java语言实现累加求和的方法,将文件命名为Sample.java。

public class Sample {public static void main(String[] args) {System.out.println(sum(10));}private static int sum(int n) {int res = 0;for (int i = 1; i < n; i++) {res += i;}return res;}
}

程序员不想直接点击运行,使用javap编译了Sample.java文件,可以看到Sample.java所在的目录下,生成了Sample.class文件。

那要是汇编语言,具体步骤应该是怎样的啊?

不过,什么是汇编语言?汇编语言其实和硬件息息相关,也就是脱离不了实际的硬件环境,无法跨平台运行,因为汇编语言是人们用助记符表述CPU的动作。CPU结构不一样,汇编语言调用的可能也不一样。

那助记符是什么意思呢?汇编语言的每一行,表示对CPU的一个指令,其语法结构是操作码 + 操作数。当然也存在只有操作码,例如ret,表示将处理返回到函数的调用源。

操作码是对CPU的指令,是动词,那操作码是数据,是存储在CPU的寄存器,是宾语。如mov a b; 表示将b的值赋值给a;add a b; 表示a同b的值相加,并将结果赋值给a。

那CPU是不是直接能懂这些助记符吗?当然不能。

我们知道计算上所有的地址和数据都是由0和1组成的,将汇编语言的那些助记符写在文本文件上,进行编译的时候会调用本地计算机上的应用,名为masm.exe,是一个编译器。

将文本文件编译成目标文件,此时的目标文件成了机器语言,可以直接被本地的CPU所理解的,如果将这个目标文件由别的计算机的不同系列CPU理解,那可能是读不懂,就好比如我们看不懂火星文。

那这个目标文件可以被本地CPU可以直接解析运行了吗?可以是可以,但是会直接被报错。

因为我们仅有这一个目标文件,还不知道这个目标文件和系统的库文件哪些有关。所以,需要一个链接器,把相关的目标文件组合成一个可以在特定平台运行的可执行文件,如下图:

汇编语言

库文件名的后缀也是*.O或 *.OBJ。其中, *.ASM *.OBJ和 *.EXE是在dos或windows系统下的文件, *.S和 *.O是在以Linux内核的系统下的文件后缀名,不过Linux内核不靠文件后缀名来判断这是什么文件,一般靠文件属性来判断,可执行文件在Linux内核中没有后缀名,用ls命令显示这个文件是绿色就是可执行文件。

好了,如果是C/C++语言,它的编译过程应该是怎么样子的呢?

C语言编译器过程

预处理 是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理;

转换 是把C/C++代码(比如上面的".i"文件)“翻译”成汇编代码;

编译 是将用助记符表示的汇编语言翻译成符合一定格式的机器语言;

链接 是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。

好了,写着写着忘记Java程序的正事了。

大家所说的Java,有两个层面意思,一个是作为编程语言的Java,另一个是作为程序运行环境的Java。这就是Java的特殊所在,特殊就特殊在Java有Java虚拟机。

Java程序也需要编译,但是没有编译成机器语言,而是编译成字节码文件,然后在Java虚拟机用解释的方式执行字节码。

Java虚拟机

编译 是将Java源代码“翻译”为Java虚拟机可执行的字节码文件,保存到硬盘上;

加载 是将生成在内存上的字节码文件的副本,加载到Java虚拟机上;

Java虚拟机 加载后字节码后,执行方式有两种,一种是即时编译器,另一种是字节码解释器,如下图:

Java虚拟机执行引擎

即时编译和解释执行的区别如下:

解释执行:将编译好的字节码一行一行地翻译为机器码执行。编译执行:以方法为单位,将字节码一次性翻译为机器码后执行。

软件 是指Java虚拟机对于系统来说,是一个应用,是用某个高级语言编写的应用。

当然,Java虚拟机对Java程序来说,是一个运行的环境。我们可以对比分析一下,把Java源代码想象成汇编语言源代码,字节码想象成本地CPU可执行的机器语言,Java虚拟机想象成本地CPU

所以这就是为什么说Java是跨平台的,因为Java虚拟机是一个应用嘛。不过,不同的系统,应用也是不同的,所以系统不同,Java虚拟机也是不同的,但是字节码文件可以不变的,可以直接到其它不同系统上的虚拟机解析执行的。

Java虚拟机运行的是字节码,字节码对Java来说是十六进制;本地CPU执行的是机器码(机器语言),机器码对系统来说是二进制。不过,字节码文件放在本地是0和1组成的,只是不能被本地系统解析执行,需要Java虚拟机即时编译或解释执行。

“百闻不如一见”,我们看看*.class用记事本打开会是怎么样的。

记事本

这打开是乱码的啊?这是因为以class为后缀名的字节码文件在Java中保存的是十六进制,那我们要看十六进制如何看呢?

我们可以用Sublime Text 3打开字节码文件,但打开之前Sublime Text 3需要安装HexViewer插件,才可以看十六进制的,具体安装过程可以到网上搜索。打开之后,如下图所示:

Sublime Text 3

可以看到所有的数字都是十六进制的,接下来下一步就加载到Java虚拟机上去了,具体用即时编译的还是解释执行的,或者一起打配合。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

程序员想知道代码是怎样跑起来的相关推荐

  1. 你以为程序员就是敲代码吗?

    前言 前段时间看了淘宝技术十年,看过的人都知道,淘宝走到今天真的很不容易,确切的说一个网站越发的成熟,很不容易.没有看到这本书之前,我以为程序员就只能敲程序,软件开发真的没有那么复杂,真的就是前期需求 ...

  2. 程序员想干一辈子行不行?

    关注我们丨文末赠书 " 程序员这个职业能干一辈子吗? " 知乎上关于这个问题的讨论,答案似乎不容乐观.要么是过了35岁不转型不行:要么年纪越大越学不动:还有公司上升空间有限,不进则 ...

  3. 程序员想干一辈子行不行?只要学会这些软技能就够了|文末送书

    " 程序员这个职业能干一辈子吗? " 知乎上关于这个问题的讨论,答案似乎不容乐观.要么是过了35岁不转型不行:要么年纪越大越学不动:还有公司上升空间有限,不进则退. 总之,程序员想 ...

  4. Stack Overflow : 55.9%的Java程序员想“抛弃”Java

    著名网站StackOverflow每年都会搞一个开发人员的调查,今年有65000名全世界的程序员参与,他们来自于这些地方: 美国和印度的圈圈都很大,加拿大,西欧等国,巴西的圈圈也不小, 中国的圆圈就有 ...

  5. 当程序员说“这代码写的可真烂”,他们的意思是“这烂代码不是我写的”。而当他们说这段代码有些“小问题”时,很可能这代码是他们自己写的...

    英文原文:What Programmers Say vs. What They Mean 你是否听到过同事说"这段代码不言自明"?你的同事的这句话的实际意思是这段代码不需要写注释. ...

  6. 卖掉 3000 平房子,50 岁程序员回国写代码,三个月内融资 2000 万美元

    2019年7月12日,10多万行C代码的中国物联网大数据平台 TDengine 在 GitHub开源,立即冲上 GitHub 榜首,整整五天霸榜 GitHub.目前该项目在 GitHub 上 Star ...

  7. 程序员除了编代码,还能做哪些职业规划?

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 不思进取的程序员不是好的程序员.无数的开发者都梦想着可以加入 Google.Facebook ...

  8. 程序员python代码打招呼方式_某编程少年说他是Python大神,神级程序员不用一行代码教他做人!...

    听君一席话,胜读十年书. 1.扎实的python基础 个人的技术基础知识是否扎实,决定了个人是否能够做的工作层次. 比如某些Python半吊子,只能够纸上谈兵,和Python小白谈谈人生理想,而只要涉 ...

  9. 程序员过失泄露代码违法吗_软件过失的23种模式

    程序员过失泄露代码违法吗 Ever since the Gang of Four came down from the mountaintop with their stone tablets, li ...

最新文章

  1. web3.js(三)查询智能合约币数量(erc20)
  2. listen()与accept()函数的区别
  3. Lua脚本语言应用场景
  4. 静默安装oracle11.2.0.4
  5. dnn神经网络_机器学习-浅谈神经网络和Keras的应用
  6. linux一键安装python_Linux下,一键安装python3;适用于Centos、Debian、Ubuntu等
  7. 简述使jdbc连接mysql数据库,关于JDBC的六个步骤
  8. 图书室用计算机,电子阅览室使用
  9. 七个你一定会犯的云安全错误
  10. C# asp.net常见编译|运行错误
  11. PowerDesigner 表格导出为excel
  12. 基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-汉字手写轨迹输入
  13. JAVA中rpm什么意思,RPM常用命令介绍
  14. 协程与kotlin协程挂起
  15. ZZULIOJ:1148: 组合三位数之一
  16. 年仅41岁!国家杰青蒋伟教授因病逝世
  17. java log 2 n_log2n
  18. Android gradle统一依赖版本:Composing builds
  19. 2022-2027年中国农村网络零售行业市场深度分析及投资战略规划报告
  20. three.js加载obj模型和材质

热门文章

  1. php上传大文件500错误,PHP fastcgi模式大文件上传500错误
  2. python做插件应用_Python插件机制实现详解
  3. 苹果如何分屏_刚刚,苹果证实,iPhone12 刘海没了!
  4. 如果你需要在 XHTML 中声明 DOCTYPE,必须使用到jsp:text动作元素
  5. (软件工程复习核心重点)第二章可行性研究-第一节:可行性研究基本介绍
  6. 6-6-3:STL之map和set——multiset和multimap及set和map在oj题中的用处
  7. Dedecms 最新版漏洞收集并复现学习
  8. C/C++静态库编译报错(/usr/bin/ld:cannot find -lpthread,/usr/bin/ld:cannot find -lc)
  9. Makefile 打印变量的值
  10. python:第一个简单爬虫程序