java编译器如何看待源代码? 在我们实际运行程序之前,Java编译器知道什么?(在IDE中键入程序时检查哪些内容,而在运行时检查哪些内容?)
e、 g.A)据我所知,在IDE的源代码中立即计算常量值(当我们键入常量值时),而对于变量,编译器只检查变量是否可访问和/或变量的类型兼容性,但不立即加载变量的实际值。这是在运行时完成的。 e、 g.B)在编译时检查重载,但在运行时(部分)检查重写java编译器如何看待源代码? 在我们实际运行程序之前,Java编译器知道什么?(在IDE中键入程序时检查哪些内容,而在运行时检查哪些内容?),java,compiler-construction,Java,Compiler Construction,e、 g.A)据我所知,在IDE的源代码中立即计算常量值(当我们键入常量值时),而对于变量,编译器只检查变量是否可访问和/或变量的类型兼容性,但不立即加载变量的实际值。这是在运行时完成的。 e、 g.B)在编译时检查重载,但在运行时(部分)检查重写 是否存在其他此类示例和/或任何标准/规则,编译器根据这些示例和/或规则决定是否应在编译时或运行时检查特定类型的代码 我也试过阅读一些书籍和Java文档,但没有找到满意的答案。没有IDE: 使用编辑器,您可以在一个或多个文件中编写源代码,假设您调用
我也试过阅读一些书籍和Java文档,但没有找到满意的答案。没有IDE:
javacfoo.java
JavaFoo
经修正的问题: 我不希望在所有生成错误的情况下都使用“throw”这个词,因为“throw”对于Java异常处理有非常特殊的含义 编译器根据语言的定义分析源代码。如果源代码不是合法的Java,它会告诉您。它还可能对代码中有问题的构造提供有用的警告。如果编译器能告诉你,它会告诉你的
但是,在程序运行之前,编译器无法知道一些事情(如果不是这样,那么运行程序就没有意义了)。这包括可能发生的错误。例如,如果您正在使用用户输入的数据进行算术计算,则特定数据值可能会出现算术异常(可能被零除),而其他数据值可能不会。这些都是运行时错误,编译器不承担任何责任。编译器此时未运行。编译代码和运行代码之间可能已经过了几年。您的重写/重载示例有点令人困惑。这两个都是由编译器检查的,因此,如果您做错了,那么这两个都会出现编译器错误 不同之处在于,对于重载方法,编译器可以立即链接到实现,而对于重写的方法,编译器需要插入一小段运行时代码,通过在运行时检查它拥有的子类来查找实现
一般来说,编译器会在编译时尽可能多地检查,但检查的确切列表在不同版本的编译器和语言之间不断变化。您似乎将编译器与IDE混淆,但它们是不同的组件。IDE会复制编译器所做的一些检查,以便向用户提供快速反馈。此外,Java编译器在运行时什么也不做。除非您调用它来编译其他源代码,但这与您自己已经编译的代码是分开的?对于传统的编译器,代码在一个文件中,并且编译器在其命令行上给出了该文件的名称。对于IDE,这取决于IDE——如果它有自己的内置编译器,它可以发明任何它喜欢的机制,但文件是最简单的。但是我没有使用IDE,所以我从来没有看过。至于其他方面,您似乎对IDE、编译器和运行时的相对角色感到困惑。我可能没有正确地提出这个问题。考虑一下,我们没有使用IDE。现在,哪些东西会抛出编译时错误,哪些东西不会抛出编译时错误,但可以在运行时抛出异常?Java编译器如何区分这些东西?是否有任何具体的标准?