2024年5月1日

科普 我玩个Minecraft还要安装Java,这是个什么理?

作者 TheWhiteDog9487

又是想不到开头的一天…
所以我们直接进入主题吧。

0001 这到底是咋回事

要解释标题里的问题,我们需要首先了解一下开发者制作程序的一些相关内容。

众所周知一般来说,现在已经是2024年了,绝大多数的开发者在制作一个计算机程序时已经不会考虑使用机器指令或者汇编语言。因为现代的高级语言相比前面那两位拥有着全方位的巨大改进。包括易用性、易学性等等。
如果你不能理解的话,我可以给你演示一下。

这是一段使用x86汇编语言编写的HelloWorld:
( 我不会汇编语言,所以我是在网上找的,这是原文章

;数据段
data segment
	;定义字节大小(8位)的字符串,变量名为string
	;db表示字节
	;0dh,0ah表示回车换行
	;$表示字符串终止符
	string db 'Hello World!',0dh,0ah,'$' 
data ends

;代码段
code segment
assume cs:code,ds:data 
start:
	;push ds
	;mov ax,0
	;push ax
	mov ax,data
	mov ds,ax
	;------
	lea dx,string
	mov ah,09h ;ah是ax的高8位,功能号09h表示输出dx指向的字符串string
	int 21h ;中断指令,调用用户程序,执行ah中设置的09h号功能
	;------
	mov ah,4ch ;功能号4ch表示从用户程序返回操作系统,结束程序
	int 21h
code ends
	end start

而这是一段使用C++编写的Hello World:

#include <iostream>
using namespace std;
int main(){
    cout << "HelloWorld!" << endl;}

这是编译和运行的效果:

而这是用Python写的HelloWorld:

print("HelloWorld")

这是运行效果:

很容易看出来,比汇编简单多了,对吧?

0010 编译型和解释型

不知道各位在看刚才我用几个编程语言写HelloWorld的时候,有没有发现一个问题。

为什么C++写的程序,需要使用 cl .\C++.cpp 这条命令把代码转换成exe格式的程序,再去运行。
而Python那边却可以直接使用 python .\Python .py 来运行代码文件?
这是为什么?

这就涉及到这篇文章的一个重点概念:
编程语言可以被区分为 编译型 和 解释型

举个例子:
假设有两个人是好朋友,他们分别叫做A和B。
A是中国人,母语是汉语普通话,不会英语。
B是英国人,母语是英语,不会汉语。
现在有一篇中文文章,A想给B看。考虑到B不会中文,A需要把文章翻译给B。
不难想到有两种方案:

1:找个人拿张纸进行全文翻译,把翻译完的那张给B看
2:找个同声传译,A照着文章念,同传听一句翻译一句给B听

编译型语言就是方案1,解释型语言是方案2。

计算机听不懂人类使用的语言,它只能按照由一大堆0和1组成的机器指令给出的命令做事。
编译型语言是先把人类写的源代码使用一种叫做编译器的程序转换为机器指令,你再去运行机器指令从而完成任务。
解释型语言是直接把源代码打开,按照这个语言指定的符号(你可以理解为回车)作为每一条指令的分隔。读取一条指令,翻译成机器语言,执行。再读取一条,翻译,执行。直到整个代码文件没有下一条代码。

0011 那…Minecraft呢?

众所周知,Minecraft Java Edition是一个使用Java语言制作的游戏。
( 你猜猜它为什么叫Java Edition

而Java这个语言的情况比我们上面讲的都要复杂,
因为这小子是编译型和解释型组合起来的缝合怪。

下面这个是Java的HelloWorld:

class Program{
    public static void main(String[] args){
        System.out.println("Hello, World!");}}

为了运行这个HelloWorld,我需要先编译再解释,像这样:

发现没?javac编译生成的文件并不是exe,而是一个.class的不知道什么东西。
这个就是Java虚拟机运行时加载的字节码。
我用一个VSCode插件处理一下把字节码弄出来,它长这样:

0100 重回主题

现在已经可以解释标题里的问题了。

你在玩游戏之前需要安装一个Java,是因为Java源代码编译生成的字节码(.class文件,以及更加常见的.jar文件)并不是可以直接被计算机理解并执行的二进制机器指令,需要有一个翻译器把字节码逐行翻译成二进制指令。
你安装的Java,就是干这个活的。

0101 诶,JDK和JRE你还没说呢!还有JVM,那是啥!

不多说,请直接看维基百科的介绍:

Java虚拟机 – 维基百科,自由的百科全书
Java平台 – 维基百科,自由的百科全书
JDK – 维基百科,自由的百科全书

总结来说,Java虚拟机Java Virtual Machine简称JVM ⫋ Java运行时环境Java Runtime Environment简称JRE ⫋ Java开发套件Java Development Kit简称JDK
( 注:A⫋B的意思是 A是B的一部分,并且A和B不一样
JVM只是一个孤零零的运行Java字节码的虚拟机,
JRE包含了JVM和其他运行Java程序必须的文件,
JDK包含了JRE,另外附赠了一大堆普通用户根本就不会用到的开发工具(所以你猜猜它为什么叫做开发套件。

而你玩游戏之前安装的Java,指的其实是JRE。
而我们这些做模组的,就需要安装JDK了,因为我们真的需要那些工具。

TheWhiteDog9487
2024 05 01
祝各位劳动节快乐