1.编程语言概述
编程语言有不同的分类方法:
- 面向过程、面向对象、面向函数
- 静态类型、动态类型
- 编译执行、解释执行
- 有虚拟机、无虚拟机
- 有GC、无GC
Java语言是一种面向对象、静态类型、编译执行,有虚拟机、有垃圾回收器和运行时的跨平台高级语言。
2.编程语言的跨平台性
C++要想跨平台,只能是在源代码级别的,编写跨平台的代码,然后再到不同的平台上编译编译后运行;Java则能达到字节码级别的跨平台,java代码编译后,生成class文件,在不同的平台均可运行。我的另一篇Java【中级01】文章里面有更为深入的探讨。
Java不仅跨平台,而且是向前兼容的。现在java最新版本已经到Java17了,但很多公司使用的还是java8,Java8版本的代码能正常运行在java17的环境下的。(其实这个兼容性到底是向前还是向后,要分不同的角度,我也没仔细研究,用到再查吧。无非就是一些特性能用不能用、或者功能有些许变化的问题,这里我就不求甚解了,阁下感兴趣的话详细可以参考此处)
注:
向前兼容对应的英文是 forward compatibility 或 upward compatibility。
向后兼容对应的英文是 backward compatibility 或 downward compatibility。
向前兼容表示旧版本的系统可以接受新版本的数据,是旧版本对新版本的兼容。
向后兼容表示新版本的系统可以接受旧版本的数据,是新版本对旧版本的兼容。
3.C++和Java内存管理的差别
C/C++完全相信而且惯着程序员,让大家自行管理内存,可以编写很自由的代码,但一不小心就会造成内存泄漏等问题,导致程序崩溃。
Java/Golang完全不相信程序员,但也惯着程序员。所有的内存生命周期都由JVM运行时统一管理。在绝大部分场景下,你可以非常自由的写代码,而且不用关心内存到底是什么情况。内存使用有问题的时候,我们可以通过JVM来进行信息相关的分析诊断和调整。
Rust语言选择既不相信程序员,也不惯着程序员。让你在写代码的时候,必须清楚明白的用Rust
的规则管理好你的变量,好让机器能明白高效地分析和管理内存。但是这样会导致代码不利于人的理解,写代码很不自由,学习成本也很高。
4.java程序运行过程
一段源码程序,比如打印“ILOVEU”这个单词的程序,通过javac命令编译后,生成了一个class文件,这个class文件就是字节码文件,使用java命令运行这个class文件时,java虚拟机就通过类加载器加载这个class然后将它运行起来
5.java字节码技术
Java bytecode由单字节(byte)的指令组成,理论上最多支持256个操作码(opcode)。
实际上Java只使用了200左右的操作码,还有一些操作码则保留给调试操作。根据指令的性质,主要分为四个大类:
1.栈操作指令,包括与局部变量交互的指令
2.程序流程控制指令
3.对象操作指令,包括方法调用指令
4.算术运算以及类型转换指令
package outputs;
public class HelloByteCode{
public static void main(String[] args){
HelloByteCode obj = new HelloByteCode();
}
}
编译:javac HelloByteCode.java
生成了HelloByteCode.class
查看字节码:javap -c HelloByteCode.class
显示的字节码是以助记符的方式给出的
Compiled from "HelloByteCode.java"
public class outputs.HelloByteCode {
public outputs.HelloByteCode();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>"