【问题标题】:How is language specification created [closed]如何创建语言规范[关闭]
【发布时间】:2019-06-26 13:09:54
【问题描述】:

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

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

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

【问题讨论】:

  • 不,将 JDK 视为任何其他程序。你可以用许多不同的语言编写它。现在你甚至可以用带子掀起靴子,用 Java 重新制作 JDK。
  • 可以用任何能够实现 JDK 规范的语言编写 JDK。 C 完全不是一个糟糕的选择。
  • @Bathsheba - 虽然用 C++ 编写的 JVM 有点讽刺
  • 我不明白这里的所有反对意见。当然,这个问题有点幼稚,但这是一个有趣的问题。
  • 你也可以问,如何用 C 语言编写国际象棋游戏,因为 C 语言对游戏规则一无所知。

标签: java c compiler-construction


【解决方案1】:

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

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

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 编程语言编译成其字节码的描述。”我不同意。 Java 语言规范指定了 Java 程序的行为方式。它确实说应该将 Java 程序编译为 .class 文件,但它并不关心 如何 这是完成的,也不关心给定程序将编译成哪个确切的字节码。它只关心生成的字节码是否符合指定的行为。 JLS 没有根据字节码指定行为。它甚至没有描述 Java 字节码的样子。
  • @sepp2k 这很公平,让我想一个更好的描述并编辑我的回复
  • 建议:将“C/C++”改为“C++ 或其他语言”。术语“C/C++”在这里非常不受欢迎,因为没有这样的东西。它们是完全不同的语言。
  • @klutt 好的,完成!
  • "javac is itself written in java."。当然,不必如此。但有趣的是。
猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2013-09-13
  • 2011-04-20
  • 1970-01-01
  • 2022-12-20
相关资源
最近更新 更多