Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java编译器如何看待源代码? 在我们实际运行程序之前,Java编译器知道什么?(在IDE中键入程序时检查哪些内容,而在运行时检查哪些内容?)_Java_Compiler Construction - Fatal编程技术网

java编译器如何看待源代码? 在我们实际运行程序之前,Java编译器知道什么?(在IDE中键入程序时检查哪些内容,而在运行时检查哪些内容?)

java编译器如何看待源代码? 在我们实际运行程序之前,Java编译器知道什么?(在IDE中键入程序时检查哪些内容,而在运行时检查哪些内容?),java,compiler-construction,Java,Compiler Construction,e、 g.A)据我所知,在IDE的源代码中立即计算常量值(当我们键入常量值时),而对于变量,编译器只检查变量是否可访问和/或变量的类型兼容性,但不立即加载变量的实际值。这是在运行时完成的。 e、 g.B)在编译时检查重载,但在运行时(部分)检查重写 是否存在其他此类示例和/或任何标准/规则,编译器根据这些示例和/或规则决定是否应在编译时或运行时检查特定类型的代码 我也试过阅读一些书籍和Java文档,但没有找到满意的答案。没有IDE: 使用编辑器,您可以在一个或多个文件中编写源代码,假设您调用

e、 g.A)据我所知,在IDE的源代码中立即计算常量值(当我们键入常量值时),而对于变量,编译器只检查变量是否可访问和/或变量的类型兼容性,但不立即加载变量的实际值。这是在运行时完成的。 e、 g.B)在编译时检查重载,但在运行时(部分)检查重写


  • 是否存在其他此类示例和/或任何标准/规则,编译器根据这些示例和/或规则决定是否应在编译时或运行时检查特定类型的代码

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

    没有IDE:

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

  • 将其编译为类文件:
    javacfoo.java

  • 在Java虚拟机中运行生成的编译代码:
    JavaFoo

  • 因此,编译器是给定的源代码

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


    经修正的问题:

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

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


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

    您的重写/重载示例有点令人困惑。这两个都是由编译器检查的,因此,如果您做错了,那么这两个都会出现编译器错误

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


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

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