java - 语言规范是如何创建的

标签 java c compiler-construction

我想问,java是用什么写的,但是我在stackexchange上找到了这个问题的答案,上面说,你不能用语言来写语言,它是一个规范,但是JDK是用什么写的C

现在,我的问题是,如果 JDK 是用 C 编写的,Java 基本上是 C 语言的一种不同形式,例如扩展或其他东西,并添加了更多功能吗?这个规范是如何创建的,这三者之间的关系是什么:

  • 解释规范的工具(如 JDK)
  • 规范本身
  • 创建该工具所使用的语言。

最佳答案

我认为您误解了一些事情,所以让我们先了解基础知识:

计算机程序只不过是一组由处理器读取然后执行的指令。一项一项执行的任务列表。

Java 使用称为 Java 运行时环境 (JRE) 的东西。 JRE 有点(不完全是)虚拟处理器,有自己的指令集,称为 java 字节码。这个“虚拟处理器”在您的操作系统内部运行。

Java 运行时环境是用某种语言编写的。 Sun JRE 是用 C 语言编写的。C 代码又被编译成真实处理器的机器代码(因此您的处理器可以理解代码)。

Java被编译成java字节码。

所以回答你的问题:规范只不过是对 java 编程语言应该如何表现以及它是什么样子的描述。基本上是一个常规的文本文档,你可以用word之类的东西编写。

利用这个规范,程序员可以构建一个编译器。编译器是一个像这样改变java代码的程序:

for (int i = 2; i < 1000; i++) {
    for (int j = 2; j < i; j++) {
        if (i % j == 0)
            continue outer;
    }
    System.out.println (i);
}

转换为如下所示的字节码

0:   iconst_2
1:   istore_1
2:   iload_1
3:   sipush  1000
6:   if_icmpge       44
9:   iconst_2
10:  istore_2
11:  iload_2
12:  iload_1
13:  if_icmpge       31
16:  iload_1
17:  iload_2
18:  irem
19:  ifne    25
22:  goto    38
25:  iinc    2, 1
28:  goto    11
31:  getstatic       #84; // Field java/lang/System.out:Ljava/io/PrintStream;
34:  iload_1
35:  invokevirtual   #85; // Method java/io/PrintStream.println:(I)V
38:  iinc    1, 1
41:  goto    2
44:  return

执行此操作的编译器程序可以用任何语言编写,但建议将其编写为 C++ 等低级语言,以使编译过程更快。

关于java - 语言规范是如何创建的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56773620/

相关文章:

java - Kryonet RMI,无法等待连接更新线程的响应

java - 如何在 Java 中实现包装装饰器?

c - 这个功能是如何工作的?

delphi - Coco/R 可以将解析后的文件转换为字节码吗?

c - Lex 和 yacc - 无法编译 y.tab.c 文件

java - Apache Spark 中 Select DATE_FORMAT(date, format) 的替代方案

c - 声明并定义函数 distance() 以查找 c 中两点 (x[0], y[0]) 和 (x[1], y[1]) 之间的欧氏距离

c - 判断无向图是否是树

java - String类以及Java对其的依赖

java - 是什么导致线程 "pool-1-thread-2"中出现异常(NullPointerException)