语言规范是如何创建的
How is language specification created
我想问一下,java是用什么写的,但是我在stackexchange上找到了一个答案,里面说,你不是用一种语言来写语言,它是一种规范,但 JDK 是用 C.
编写的
现在,我的问题是,如果 JDK 是用 C 编写的,Java 基本上是 C 语言的一种不同形式,比如扩展或其他东西,添加了更多功能?这个规范是如何创建的,这三件事之间的关系是什么:
- 解释规范的工具(如JDK)
- 规范本身
- 工具的创建语言。
我认为您误解了一些事情,所以让我们先了解基础知识:
计算机程序只不过是一组由处理器读取然后执行的指令。一个接一个执行的任务列表。
Java 使用称为 Java 运行时环境 (JRE) 的东西。 JRE 有点(不完全是)虚拟处理器,它有自己的指令集,称为 java 字节码。此 'virtual processor' 在您的操作系统内部运行。
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是用什么写的,但是我在stackexchange上找到了一个答案,里面说,你不是用一种语言来写语言,它是一种规范,但 JDK 是用 C.
编写的现在,我的问题是,如果 JDK 是用 C 编写的,Java 基本上是 C 语言的一种不同形式,比如扩展或其他东西,添加了更多功能?这个规范是如何创建的,这三件事之间的关系是什么:
- 解释规范的工具(如JDK)
- 规范本身
- 工具的创建语言。
我认为您误解了一些事情,所以让我们先了解基础知识:
计算机程序只不过是一组由处理器读取然后执行的指令。一个接一个执行的任务列表。
Java 使用称为 Java 运行时环境 (JRE) 的东西。 JRE 有点(不完全是)虚拟处理器,它有自己的指令集,称为 java 字节码。此 'virtual processor' 在您的操作系统内部运行。
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++ 等低级语言,以使编译过程更快。