java Java源程序如何变成Java字节码?
Java源程序如何变成Java字节码?
编译器默认都会将java文件变成字节码,让电脑看的懂手动的话就用cmd javac xxxx.java 编译
Java能不能像C语言不通过JVM虚拟机直接编译成二进制机器码,让计算机直接运行?
从语言设计的角度看是可以的,重新设计一下编译器就能实现,但从工程实践的角度看是不可行的。
其一,Java语言最大的特点就是跨平台可移植,一次开发,一次编译,多平台执行,这一特性就是靠JVM(Java虚拟机)实现的,如果改写编译器像C语言一样直接编译成了可执行程序,就失去了跨平台特性。
其二,Java语言设计之初就设计成为了一款严重依赖JRE(Java运行时环境)的语言,有部分语言设计上的缺陷必须依赖JVM来解决,比如GC(垃圾回收),我们知道,Java语言是没有内存回收能力的,因此还得靠JVM,在工程实践中,如果软件不能进行内存回收,后果将是灾难性的。
其三,Java语言是面向对象的,区别于同是面向对象的C ,Java还有一个动态特性。
它允许程序动态地装入运行过程中所需要的类,这是C 语言进行面向对象程序设计所无法实现的。在C 程序设计过程中,每当在类中增加一个实例变量或一种成员函数后,引用该类的所有子类都必须重新编译,否则将导致程序崩溃。Java从如下几方面采取措来解决这个问题。Java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。这样,一个在存储器生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定的。这样,对类中的变量和方法进行更新时就不至于影响现存的代码。解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可以全速执行。在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。而这一切同样依赖JRE。
以上几点决定了Java不能像C语言一样直接编译成机器码,当然,还有一些其它因素,但我认为上面几点是最主要的。
java虚拟机是用什么语言编写的?它的原理谁能通俗的讲出来吗?
java虚拟机功能就是执行Java字节码,其编码实现就是一个死循环,每一次循环就是取字节码,执行字节码的过程,所以跟其它程序没有什么本质区别。主流的javaVM还是用C语言实现的居多,再以汇编为辅助,用java实现javaVM的情况有,但不多。
下面是一个在智能设备里用C语言实现虚拟机的片段。
这一段代码就是对short加法这个字节码的实现。
而这一段代码就是取字节码并执行,是不是觉得JavaVM也不过如此呢。
有不少人会为了优化虚拟机的效率,而选择用汇编把这些执行频度很高的代码重写一下。
总结就是C实现的多,会结合汇编作为辅助。其它语言也有,但不是主流。
哪些编程语言的设计中使用了虚拟机和指令集?
看你怎么定义虚拟机了,像java的叫jvm,也就是java虚拟机,但是.net的叫clr,称之为公共语言运行时,是跨语言的。这是目前常见的两个,其他的还有很多,golang也有运行时,但是很小,功能也不多,好像只提供了垃圾回收和反射。还有这里的虚拟机和指令集不在一个层面,虚拟机运行的是字节码或者中间代码,目标平台是虚拟机,而不是某个特定的处理器,所以谈指令集意义不大。
Java JVM怎么学习啊?从哪方面入手?
可以先从类加载开始,了解JVM的类加载原理,类加载过程,然后熟悉类加载器和类加载机制,其次可以去了解Java内存结构(运行时数据区),重点了解堆栈两块区域,了解堆的分代模型,GC的垃圾算法,垃圾收集器,以及常见的JVM参数设置,最后结合企业的业务场景来监测和调试JVM参数,做一次JVM实践调优,这样子的学习路线我认为是可以快速上手掌握JVM的
-------微信搜索:【猿灯塔】 微信公众号 干货技术文章 以及技术文档,大厂面试题 助你成就架构师之路
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。