【问题标题】:How does the java compiler look at the source code? [closed]java编译器是怎么看源码的? [关闭]
【发布时间】:2020-08-15 13:33:11
【问题描述】:
  1. 在我们实际运行程序之前,Java 编译器知道什么? (我们在 IDE 中键入程序时会检查哪些内容,以及在运行时检查哪些内容?)

例如A)据我所知,常量值会在 IDE 的源代码中立即评估(当我们键入它们时),而对于变量,编译器仅检查变量是否可访问和/或变量的类型兼容性但不会立即加载变量的实际值。它在运行时完成。 例如B) 在编译时检查重载,但在运行时(部分)检查覆盖。


  1. 是否有任何其他此类示例和/或任何标准/规则可供编译器决定是否应在编译时或运行时检查特定类型的代码?

我也尝试过阅读一些书籍和 Java 文档,但找不到满意的答案。

【问题讨论】:

  • 您似乎将编译器与 IDE 混淆了,但它们是不同的组件。 IDE 也会复制编译器所做的一些检查,以便向用户提供快速反馈。
  • 另外,Java 编译器在运行时什么也不做。除非你调用它来编译其他源代码,但这与你自己已经编译的代码是分开的。
  • java编译器是怎么看源代码的? 对于传统的编译器来说,代码在一个文件中,编译器在其上给出文件名命令行。对于 IDE,这取决于 IDE——如果它有自己的内置编译器,它可以发明它喜欢的任何机制,但文件是最简单的。但我不使用 IDE,所以我从来没有看过。至于其他的,您似乎对 IDE、编译器和运行时的相对角色感到困惑。
  • 我可能没有正确地提出这个问题。考虑一下,我们没有使用 IDE。现在,什么东西会抛出编译时错误,什么东西不会抛出编译时错误但会在运行时抛出异常? Java编译器如何区分这些东西?是否有任何特定标准?

标签: java compiler-construction


【解决方案1】:

没有 IDE:

  1. 使用编辑器,您在一个或多个文件中编写源代码,假设您调用文件 Foo.java。

  2. 你把它编译成一个类文件:javac Foo.java

  3. 您在 Java 虚拟机中运行生成的编译代码:java Foo

所以,编译器是给定源代码的。

IDE 是(粗略地说)编辑器、编译器和 Java 虚拟机的集成接口。它还可以“即时”检查您键入的 Java 代码,以便您更早地发现错误。作为 IDE 的一部分,它显然可以访问源代码。


对于修改后的问题:

我不想在所有产生错误的情况下都使用“throw”这个词,因为“throw”对于 Java 异常处理具有非常特殊的含义。

编译器会根据语言的定义分析您的源代码。如果源代码不是合法的Java,它会告诉你。它还可能提供有关代码中可疑结构的有用警告。如果编译器能告诉你,它会的。

但是在程序运行之前编译器无法知道一些事情(如果这不是真的,那么运行程序就没有意义了)。这包括可能发生的错误。例如,如果您正在使用用户输入的数据进行算术计算,那么算术异常(可能被零除)可能会发生在特定数据值上,但不会发生在其他数据值上。这些都是运行时错误,编译器不承担任何责任。此时编译器未运行。从编译代码到运行它可能已经过去了好几年。

【讨论】:

    【解决方案2】:

    您的覆盖/重载示例有点令人困惑。这些都由编译器检查,所以如果你做错了,你会得到两者的编译器错误。

    不同之处在于,对于重载的方法,编译器可以立即链接到实现,而对于重载的方法,编译器需要插入一小段运行时代码来通过检查它在运行时具有哪个子类来查找实现。

    一般来说,编译器会在编译时尽可能多地进行检查,但确切的检查列表会在编译器和语言的不同版本之间不断变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多